program FusioneListeOrdinate;
type
TipoElemLista = integer;
TipoLista = ^TipoRecordLista;
TipoRecordLista = record
info : TipoElemLista;
next : TipoLista;
end;
var
lista1, lista2, lista3 : TipoLista;
nomef : string;
memoria : longint;
procedure InserisciInListaOrdinata (var lis:TipoLista; elem:TipoElemLista);
var
paux : TipoLista;
begin
if lis = NIL then
begin
new(lis);
lis^.info := elem;
lis^.next := NIL
end
else if lis^.info >= elem then
begin
new(paux);
paux^.info := elem;
paux^.next := lis;
lis := paux
end
else InserisciInListaOrdinata(lis^.next, elem)
end;
procedure LeggiListaOrdinata(var lis:TipoLista; nomefile:string);
var
filetesto : text;
e : TipoElemLista;
begin
assign(filetesto, nomefile);
reset(filetesto);
lis := NIL;
while not eof(filetesto) do begin
read(filetesto, e);
InserisciInListaOrdinata(lis, e)
end
end;
procedure StampaLista(lis:TipoLista);
begin
if lis = NIL then
writeln('Lista vuota')
else
begin
while lis <> NIL do
begin
write (lis^.info:4);
lis:=lis^.next
end;
end;
writeln
end;
procedure FondiListe (lis1, lis2: TipoLista; var lisf: TipoLista);
var
pgen, ultimo : TipoLista;
begin
new(pgen);
ultimo := pgen;
while (lis1 <> NIL) and (lis2 <> NIL) do
begin
new(ultimo^.next);
ultimo := ultimo^.next;
if lis1^.info < lis2^.info then
begin
ultimo^.info := lis1^.info;
lis1 := lis1^.next
end
else
begin
ultimo^.info := lis2^.info;
lis2 := lis2^.next
end
end;
while lis1 <> NIL do
begin
new(ultimo^.next);
ultimo := ultimo^.next;
ultimo^.info := lis1^.info;
lis1 := lis1^.next
end;
while lis2 <> NIL do
begin
new(ultimo^.next);
ultimo := ultimo^.next;
ultimo^.info := lis2^.info;
lis2 := lis2^.next
end;
ultimo^.next := NIL;
lisf := pgen^.next;
dispose(pgen);
end;
procedure FondiListe2 (var lis1, lis2: TipoLista; var lisf: TipoLista);
var
pgen, ultimo : TipoLista;
begin
new(pgen);
ultimo := pgen;
while (lis1 <> NIL) and (lis2 <> NIL) do
begin
if lis1^.info < lis2^.info then
begin
ultimo^.next := lis1;
ultimo:=ultimo^.next;
lis1 := lis1^.next;
end
else
begin
ultimo^.next:= lis2;
ultimo:=ultimo^.next;
lis2 := lis2^.next
end
end;
if lis1 <> NIL then
begin
ultimo^.next := lis1;
lis1 := NIL
end
else
begin
ultimo^.next := lis2;
lis2 := NIL
end;
lisf := pgen^.next;
dispose(pgen)
end;
procedure CancellaLista (var lis:TipoLista);
var
paux : TipoLista;
begin
while lis <> nil do
begin
paux := lis;
lis := lis^.next;
dispose(paux)
end
end;
begin
writeln('-----------------Inizio programma-----------');
writeln;
memoria := memavail;
writeln('Memoria disponibile all''inizio del programma: ', memavail);
writeln;
write ('Inserire il nome del file contenente la prima lista: ');
readln (nomef);
LeggiListaOrdinata(lista1, nomef);
writeln('Stampa della prima lista');
StampaLista(lista1);
writeln('Memoria utilizzata dopo la lettura della prima lista: ',
memoria-memavail);
writeln;
write('Inserire il nome del nome file contenente la seconda lista: ');
readln(nomef);
LeggiListaOrdinata(lista2, nomef);
writeln('Stampa della seconda lista');
StampaLista(lista2);
writeln('Memoria utilizzata dopo la lettura della seconda lista: ',
memoria-memavail);
FondiListe(lista1, lista2, lista3);
writeln;
writeln('Stampa della fusione delle due liste');
StampaLista(lista3);
writeln('Memoria utilizzata dopo la creazione della terza lista: ',
memoria-memavail);
CancellaLista(lista1);
CancellaLista(lista2);
CancellaLista(lista3);
writeln;
writeln('Memoria disponibile alla fine del programma : ', memavail);
writeln;
writeln('--------Fine programma, premere return---------');
readln
end.