(*
IAN LIN

> Can someone show me an example of how to properly dispose of a linked list?

I was just as bad when I started in February. :) Anyhow, use mark and
release. They're 2 new things I've discovered and love much more than
dispose or freemem. Use MARK(ram) where VAR RAM:POINTER {an untyped
pointer}. This will save the state of the heap. NOW, when you are done,
do this: release(ram) and it's back the way it was. No freemem, no dispose,
just RELEASE! I REALLY love it. :) Need to allocate and deallocate some
times in between the beginning and the end? Use more untyped pointers (eg.
RAM2, RAM3, etc.) and you get the picture. Gotta love it. :) Look for a
message from me in here about linked list sorting. I wrote an entire
program that does this (to replace DOS's sort. Mine's faster and can use
more than 64k RAM). Here it is. Some of it is maybe too hard for you but
then you can ignore that part and just see how I used mark and release.
*)

{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X-}
{$M 8192, 0, 655360}

type
  pstring = ^string;
  prec    = ^rec;

  rec     = record
    s : pstring;
    n : prec;
  end;

Var
  dash   : byte;
  err,
  max, c : word;
  list,
  list2,
  node,
  node2  : prec;
  ram,
  ram2,
  ram3   : pointer;
  tf     : text;
  f      : file;

procedure dodash;
begin
  case dash of
    1 : write('-');
    2 : write('\');
    3 : write('|');
    4 : write('/');
  end;
  write(#8, ' ', #8);
  dash := dash mod 4 + 1;
end;

procedure TheEnd;
begin
  writeln('Assassin Technologies, NetRunner.');
  halt(err);
end;

procedure showhelp;
begin
  writeln('Heavy duty sorter. Syntax: NSORT <INFILE> <OUTFILE>.');
  writeln('Exit codes: 0-normal; 1-not enough RAM; 2-can''t open infile;');
  writeln('3-outfile can''t be created');
  halt;
end;

procedure noram;
begin
  release(ram);
  assign(f, paramstr(1));
  writeln('Not enough RAM. ', memavail div 1024, 'k; file: ', filesize(f));
  err := 1;
  halt;
end;

procedure newnode(var pntr : prec);
begin
  if sizeof(prec) > maxavail then
  begin
    close(tf);
    noram;
  end;
  new(pntr);
  dodash;
  pntr^.n := nil;
end;

procedure getln(var ln : pstring);
var
  line : string;
  size : word;
begin
  readln(tf, line);
  size := succ(length(line));
  if size > maxavail then
    noram;
  getmem(ln, size);
  move(line, ln^, succ(length(line)));
  dodash;
end;

begin
  err := 0;
  exitproc := @TheEnd;
  if paramcount = 0 then
    showhelp;
  assign(tf, paramstr(1));
  reset(tf);

  if ioresult <> 0 then
  begin
    writeln('Can''t open "', paramstr(1), '".');
    err := 2;
    halt;
  end;

  mark(ram);
  newnode(list);

  if not eof(tf) then
  begin
    getln(list^.s);
    node := list;

    while not eof(tf) do
    begin
      newnode(node^.n);
      node := node^.n;
      getln(node^.s);
    end;

    close(tf);
    newnode(list2);
    list2^.n := list;
    list := list^.n;
    list2^.n^.n := nil;

    while list <> nil do
    begin
      dodash;
      node  := list;
      list  := list^.n;
      node2 := list2;

      while (node2^.n <> nil) and (node^.s^ > node2^.n^.s^) do
        node2 := node2^.n;

      node^.n  := node2^.n;
      node2^.n := node;
      dodash;
    end;
    list := list2^.n;

    assign(tf, paramstr(2));
    rewrite(tf);
    if ioresult <> 0 then
    begin
      writeln('Can''t create "', paramstr(2), '"');
      err := 3;
    end;

    node := list;
    while node <> nil do
    begin
      writeln(tf, node^.s^);
      node := node^.n;
      dodash;
    end;
    writeln;
    close(tf);
    release(ram);
  end;
end.
