home *** CD-ROM | disk | FTP | other *** search
- (* Program to test link lists. Traverse, add, delete.*)
- (* I wrote this program for Pascal 2 to play around with link lists *)
- (* It is mostly bullet proof and rather simple, but it works!!! *)
- (* I used Pascal 5. BTW, any pointers would be appreciated. *)
- (* J.C. Wise *)
-
- PROGRAM Link_List (Output, Data);
-
- USES
- Crt,Dos,Printer;
-
- TYPE
- Line_Str = String[80];
- Node_Pointer = ^Node_Type;
- Node_Type = RECORD
- Component : String;
- Link : Node_Pointer
- END;
-
- VAR
- Head, (* External pointer to Head *)
- New_Node, (* Pointer to the newest node *)
- Current: (* Pointer to the last node *)
- Node_Pointer;
- Data: (* File of characters, one per line *)
- Line_Str;
- Line_Num,
- Counter:
- Integer;
- Choice,
- Wait1,
- Item:
- Char;
-
-
-
- (**********************************************************************)
- PROCEDURE Print_List (VAR Head : Node_pointer);
-
-
- BEGIN (* Print_List *)
- CLRSCR;
- Current := Head;
- Line_Num := 1;
- WHILE Current <> NIL DO
- BEGIN
- Write(Line_Num, '. ');
- Line_Num := Line_Num + 1;
- Writeln(Current^.Component);
- Current := Current^.Link;
- END;
- END; (* print_list *)
-
- (**********************************************************************)
- PROCEDURE Printer_List (VAR Head : Node_pointer);
-
-
- BEGIN (* Printer_List *)
- CLRSCR;
- Current := Head;
- Line_Num := 1;
- WHILE Current <> NIL DO
- BEGIN
- Write(Lst,Line_Num, '. ');
- Line_Num := Line_Num + 1;
- Writeln(Lst,Current^.Component);
- Current := Current^.Link;
- END;
- END; (* Printer_List *)
-
-
-
- (**********************************************************************)
- PROCEDURE Insrt_List (VAR Head: Node_pointer;
- Data : Line_Str );
-
- VAR
- Found : Boolean; (* True when insertion place found *)
- Previous: Node_pointer; (* Node before current *)
-
- BEGIN (* Insert *)
- New(New_Node);
- New_Node^. Component := Data;
- New_Node^.Link := NIL;
- Previous := NIL;
- Current := Head;
- Found := False;
- Counter := 0;
- WHILE (Current <> NIL) AND NOT Found DO
- BEGIN
- Counter := Counter + 1;
- IF Line_Num > Counter
- THEN
- BEGIN
- Previous := Current;
- Current := Current^.Link
- END
- ELSE
- Found := True;
- New_Node^.Link := Current;
- END;
- IF Previous = NIL
- THEN
- Head := New_Node
- ELSE
- Previous^.Link := New_Node;
- END; (* Insrt_List *)
-
-
- (**********************************************************************)
-
- PROCEDURE Delete_List (Line_Num: Integer);
-
- VAR
- Current,
- Temp_Pointer:
- Node_pointer;
-
- BEGIN (* Delete *)
- Counter := 1;
- IF Line_Num = Counter
- THEN
- BEGIN
- Temp_Pointer := Head;
- Head := Head^.Link;
- Dispose(Temp_Pointer);
- END
- ELSE
- BEGIN
- Current := Head;
- WHILE (Counter <> Line_Num) AND (Current <> NIL) DO
- BEGIN
- Temp_Pointer := Current;
- Current := Current^.Link;
- Counter := Counter + 1;
- END;(* while *)
- IF (Counter = Line_Num) AND (Current <> NIL)
- THEN
- BEGIN
- Temp_Pointer^.Link := Current^.Link;
- Dispose(Current);
- END
- ELSE
- BEGIN
- Writeln('Line # not found');
- Readln(wait1);
- CLRSCR;
- END;
- END;
- END; (* delete_list *)
-
- (*********************************************************************)
-
-
- BEGIN (* Link List *)
- ClrScr;
- Line_Num := 1;
- Head := NIL;
- Writeln('Just start typing!');
- Item := 'A';
- Choice := ' ';
- WHILE UPCASE(Item) <> 'X' DO
- BEGIN
- CASE UPCASE(Item) of
- 'A' :
- BEGIN
- Write(Line_Num, '. ');
- Readln(data);
- WHILE (length(data) <> 0 ) DO
- BEGIN
- Insrt_List(Head,data);
- Line_Num := Line_Num + 1;
- Write(Line_Num, '. ');
- Readln(data);
- END;
- END;
- 'D' :
- BEGIN
- Write('Enter the line # to delete ');
- Readln(Line_Num);
- Delete_List(Line_Num);
- Print_List(Head);
- END;
- 'I' :
- BEGIN
- Write('Enter the line # to insert before ');
- Readln(Line_Num);
- Write(Line_Num,'. ');
- Readln(Data);
- WHILE (length(data) <> 0 ) DO
- BEGIN
- Insrt_List(Head,data);
- Line_Num := Line_Num + 1;
- Write(Line_Num, '. ');
- Readln(data);
- END;
- Print_List(Head);
- END;
- 'P' :
- BEGIN
- Writeln('Send to (P)rinter or (S)creen?');
- Readln(choice);
- CASE UPCASE(choice) OF
- 'P':
- BEGIN
- Writeln('Be sure printer is on, enter to continue');
- Readln(wait1);
- Printer_List(Head);
- END ;
- 'S':
- BEGIN
- Print_List(Head);
- END;
- END; (* CASE *)
- END;
- END (* CASE *);
- Writeln('Would you like to (A)dd, (D)elete, (I)nsert, (P)rint or e(X)it? ');
- Readln(Item);
- END;
- END.