(* 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 .'); 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.