{ Freispeicher - Demo, Datenstrukturen Vorlesung SS03, Benn }
{ Autor: Dipl.-Ing. Thomas Speiser                          }
{ Source from: http://Codes.TurboTools.de                   }
{ QUELLE: Vorlesungsscript 2000 / 2001 von Prof. Benn       }
{ Habe Fehler aus dem Programm entfernt                     }

program Freispeich;

const bereich = 10; {Speicher fuer 10 PlĄtze}

type
 ref = 0..bereich;  {Zur Abbildung von Zeigern auf Index-Werte}
 liste = ref;       {Typ fuer die Listenkoepfe}

 element = record
  wert: 0..255;
  succ: ref;
 end;

 memory = array[1..bereich] of element; {der Hauptspeicher}

var
  speicher: memory;
  freispeicher,l: liste;

procedure init_space(var s: memory);
var
  i: 1..bereich;
begin
for i:=1 to bereich - 1 do
 s[i].succ:=i+1;
s[bereich].succ:=0;     {0 entspricht nil}
end;

function new: ref;
var
  tmp: ref;
begin
 if speicher[freispeicher].succ = 0 then
 new:=0                 {kein Speicher mehr frei}
else
 begin
  tmp:=speicher[freispeicher].succ;
  speicher[freispeicher].succ:=speicher[tmp].succ;
  speicher[tmp].succ:=0;
 end;
new:=tmp;
end;

procedure dispose(p: ref);
begin
if p <> 0 then
 begin
  speicher[p].succ:=speicher[freispeicher].succ;
  speicher[freispeicher].succ:=p;
 end;
end;

procedure create_list(var l: liste);
var
 i: ref;
 w: char;
begin
 l:=new;
 i:=l;
 for w:='A' to 'C' do
  begin
   speicher[i].wert:=ord(w);
   if w <> 'C' then
    speicher[i].succ:=new;
   i:=speicher[i].succ;
  end;
end;


begin
writeLN('FREISPEICHER DEMO!');
init_space(speicher);
freispeicher:=1;

{Erzeugen einer Liste}
create_list(l);

{Loeschen eines Elements aus der Liste}
speicher[l].succ:=4;
dispose(3);
create_list(l);
end.