Salve a tutti!!!Torno sul problema già trattato del calcolo, mediante un programma redatto in linguaggio Pascal, della somma di due interi rappresentati mediante liste di record e puntatori, proponendo due versioni corrette rispetto alle precedenti fornite( una non ricorsiva e l'altra ricorsiva ) del problema, ove s, p e q costituiscono la lista somma e le due liste da sommare di cui la prima di lunghezza m e la seconda n, con m>=n:

a) Versione non ricorsiva:

codice:
program SommaDiDueListe(input,output);
label 99;
const bell=07;
type punt=^elem;
     elem= record
                 val: integer;
                 back : punt;
                 next : punt;
           end;
var p,q,s : punt;
    m,n,k : integer;

procedure LeggiEScriviLista( var p : punt; k : integer);
begin
     if k=0
     then p:=nil
     else begin
               new(p);
               read(p^.val);
               write(p^.val,' ');
               LeggiEScriviLista(p^.back,k-1);
          end;
end;{ Fine procedura LeggiEScriviLista }
procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt);
var i : integer;
begin
     new(s);
     begin
          s^.val:=p^.val+q^.val;
          case(s^.val)of
          0,1,2,3,4,5,6,7,8,9 :  write(s^.val,' ');
          10,11,12,13,14,15,16,17,18 : begin
                                            s^.back^.val:=p^.back^.val+q^.back^.val+1;
                                            s^.val:=(s^.val)-10;
                                            write(s^.val,' ');
                                       end
          end;
          p:=p^.back;
          q:=q^.back;
          s:=s^.back;
          for i:=2 to m
                   do begin
                           case(p^.val+q^.val)of
                           0,1,2,3,4,5,6,7,8,9 : begin
                                                      if s^.back^.next^.val=p^.val+q^.val+1
                                                      then begin
                                                                s^.val:=(p^.val+q^.val+1);
                                                                write(s^.val,' ')
                                                           end
                                                      else begin
                                                                s^.val:=(p^.val+q^.val);
                                                                write(s^.val,' ')
                                                           end;
                                                 end;
                           10,11,12,13,14,15,16,17,18 : begin
                                                             if s^.back^.next^.val=p^.val+q^.val+1
                                                             then begin
                                                                       s^.val:=(p^.val+q^.val+1)-10;
                                                                       write(s^.val,' ');
                                                                  end
                                                             else begin
                                                                       s^.val:=(p^.val+q^.val)-10;
                                                                       write(s^.val,' ')
                                                                  end;
                                                        end
                           end;
                           p:=p^.back;
                           q:=q^.back;
                           s:=s^.back;
                      end;
     if i=m then begin
                      case(p^.val+q^.val)of
                      0,1,2,3,4,5,6,7,8,9 : s^.back:=nil;
                      10,11,12,13,14,15,16,17,18 : begin(s^.back^.val):=1;
                                                         write(s^.back^.val,' ');
                                                   end
                      end;
                      s^.back^.back:=nil;
                 end;
     end;
end;{ Fine procedura CalcoloSommaDiDueListe }

{ Corpo del programma }
begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della prima lista: ');
     readln(m);
     writeln;
     write('Fornire la lunghezza della seconda lista: ');
     readln(n);
     writeln;
     if m<n then begin
                      writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                      goto 99;
                 end
            else begin
                      write('Fornire la prima lista: ');
                      LeggiEScriviLista(p,m);
                      writeln;
                      write('Fornire la seconda lista: ');
                      LeggiEScriviLista(q,n);
                      writeln;
                      writeln('La lista somma e'':');
                      CalcoloSommaDiDueListe(p,q,s);
                 end;
     99 :
     readln;

end.
b) Versione ricorsiva:

codice:
program SommaDiDueListe(input,output);
label 99;
const bell=07;
type punt=^elem;
     elem= record
                 val: integer;
                 back : punt;
           end;
var p,q,s : punt;
    m,n,k : integer;

procedure LeggiEScriviLista( var p : punt; k : integer);
begin
     if k=0
     then p:=nil
     else begin
               new(p);
               read(p^.val);
               write(p^.val,' ');
               LeggiEScriviLista(p^.back,k-1);
          end;
end;{ Fine procedura LeggiEScriviLista }
procedure CalcoloSommaDiDueListe( var s : punt; p,q : punt; k : integer);
begin
     if k=0
     then s^.back:=nil
     else begin
               new(s);
               s^.val:=p^.val+q^.val;
               case(s^.val)of
               0,1,2,3,4,5,6,7,8,9 :  write(s^.val,' ');
               10,11,12,13,14,15,16,17,18 : begin s^.val:=(s^.val)-10;
                                                  write(s^.val,' ');
                                                  s^.back^.val:=(p^.back^.val+q^.back^.val+1);
                                            end
               end;
               CalcoloSommaDiDueListe(s^.back,p^.back,q^.back,k-1);
          end;
end;{ Fine procedura CalcoloSommaDiDueListe }

{ Corpo del programma }
begin
     writeln('------------------------- Dati di ingresso --------------------------');
     writeln;
     write('Fornire la lunghezza della prima lista: ');
     readln(m);
     writeln;
     write('Fornire la lunghezza della seconda lista: ');
     readln(n);
     writeln;
     if m<n then begin
                      writeln(chr(bell),'Errore nei dati di ingresso!- STOP -');
                      goto 99;
                 end
            else begin
                      write('Fornire la prima lista: ');
                      LeggiEScriviLista(p,m);
                      writeln;
                      write('Fornire la seconda lista: ');
                      LeggiEScriviLista(q,n);
                      writeln;
                      writeln('La lista somma e'':');
                      CalcoloSommaDiDueListe(s,p,q,m);
                 end;
     99 :
     readln;

end.
Sarei molto grato a chiunque di voi, amici del forum, sapesse indicarmi se possono essere considerate soluzioni corrette e, in caso contrario, fornirmi quella giusta . Grazie e ciao a tutti!!!