home *** CD-ROM | disk | FTP | other *** search
- {
- From: KEN BURROWS
- Subj: Linked List Problem
- ---------------------------------------------------------------------------
- Here is a short Linked List example. It loads a file, and lets you traverse the
- list in two directions. It's as simple as it gets. You may also want to look
- into the TCollection objects associated with the Objects unit of Borlands
- version 6 and 7.
- }
-
- {$A+,B-,D+,E-,F+,G-,I-,L+,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y+}
- {$M 16384,0,655360}
- Program LinkedListOfText; {tested}
- Uses Dos,CRT;
- Type
- TextListPtr = ^TextList;
- TextList = Record
- line : string;
- next,
- prev : TextListPtr;
- end;
- Const
- first : TextListPtr = nil;
- last : TextListPtr = nil;
-
- Procedure FreeTheList(p:TextListPtr);
- var hold:TextListPtr;
- begin
- while p <> Nil do
- begin
- hold := p;
- p := p^.next;
- dispose(hold);
- end;
- end;
-
- Procedure ViewForward(p:TextListPtr);
- begin
- clrscr;
- while p <> nil do
- begin
- writeln(p^.line);
- p := p^.next;
- end;
- end;
-
- Procedure ViewReverse(p:TextListPtr);
- begin
- clrscr;
- while p <> nil do
- begin
- writeln(p^.line);
- p := p^.prev;
- end;
- end;
-
- Procedure Doit(fname:string);
- var f :Text;
- s :string;
- curr,
- hold : TextListPtr;
- stop : boolean;
- begin
- assign(f,fname);
- reset(f);
- if ioresult <> 0 then exit;
- curr := nil;
- hold := nil;
-
- while (not eof(f)) and
- (maxavail > SizeOf(TextList)) do
- begin {load the list forward and link the prev fields}
- readln(f,s);
- new(curr);
- curr^.prev := hold;
- curr^.next := nil;
- curr^.line := s;
- hold := curr;
- end;
- close(f);
-
- while curr^.prev <> nil do {traverse the list backwards}
- begin {and link the next fields}
- hold := curr;
- curr := curr^.prev;
- curr^.next := hold;
- end;
-
- first := curr; {set the first and last records}
- while curr^.next <> Nil do curr := curr^.next;
- last := curr;
-
- Repeat {test it}
- clrscr;
- writeln(' [F]orward view : ');
- writeln(' [R]everse view : ');
- writeln(' [S]top : ');
- write('enter a command : ');
- readln(s);
- stop := (s = '') or (upcase(s[1]) = 'S');
- if not stop
- then case upcase(s[1]) of
- 'F' : ViewForward(first);
- 'R' : ViewReverse(last);
- end;
- Until Stop;
-
- FreeTheList(First);
- end;
-
- var m:longint;
- Begin
- m := memavail;
- if paramcount > 0
- then doit(paramstr(1))
- else writeln('you need to supply a filename');
- if m <> memavail
- then writeln('memory error of ',m-memavail,' bytes');
- End.