home *** CD-ROM | disk | FTP | other *** search
- PROGRAM InsertionSortLinked;
- (************************************************
- * *
- * Insertion Sort with Linked List *
- * *
- * From the book - PASCAL An Introduction *
- * to Methodical Programming *
- * Authors: *
- * W. Findlay and D.A. Watt *
- * *
- * Entered by Ray Penley - 8 Dec 79 *
- * *
- * Heavely modified entire program to *
- * be interactive with the console. *
- * *
- ************************************************)
- (* NOTE - This program can be eaisly adapted to sort single *
- * characters, integer numbers, real numbers, months, or any*
- * other items which can be ordered! It is only necessary to*
- * change the definition of the type identifier ITEMS, the *
- * body of the procedure ReadItem, and possibly the body of *
- * WriteItems. *)
-
- CONST
- NameLength = 10;
- INPUT = 0; (* PASCAL/Z ver 2.0 *)
- space = ' ';
-
- TYPE
- Items = PACKED ARRAY[1..NameLength] OF CHAR;
- ItemRecords = record
- item :Items;
- Next :^ItemRecords
- end;
- ItemPointers = ^ItemRecords;
-
- VAR
- ListHead :ItemPointers;
- Newitem :Items;
- EndOfList,
- done,
- error :boolean;
-
- PROCEDURE ReadItem(VAR item :Items);
- (* Valid Alphanumeric chars are:
- the space - CHR(32) to
- the tilde - CHR(126) *)
- VAR
- pos :0..NameLength;
- dummy,
- ch :Char;
-
- Procedure ClearReadItem;
- begin
- FOR pos:=1 TO NameLength DO item[ pos ]:= space;
- pos := 0
- end;
-
- begin
- ClearReadItem;
- EndOfList := FALSE;
- error := FALSE;
- REPEAT
- IF pos < NameLength THEN (* GET VALID INPUTS *)
- begin
- READ( CH );
- If ch = '$' then
- EndOfList := true
- Else
- begin
- IF CH IN [' ' .. '~'] THEN (* valid character *)
- begin
- pos := pos +1;
- item [pos] := CH
- end(* if *)
- Else
- begin
- WRITELN(' Alphanumerics only - TURKEY');
- ClearReadItem;
- ERROR:=TRUE
- end(* else *)
- end(* else *)
- end(* If *)
- Else (* ERROR *)
- begin
- READLN( dummy );
- WRITELN(' Maximum of ', NameLength:4, ' characters please!');
- ClearReadItem;
- ERROR:=TRUE
- end(* Else *)
- UNTIL EOLN(Input) OR EndOfList;
- end(* SCANNER *);
-
- PROCEDURE InsertItem( Newitem :Items);
- VAR
- entry,
- PriorEntry,
- Newentry :ItemPointers;
- Searching :boolean;
- begin
- (* FIND the position where the New item will be Inserted *)
- entry := ListHead;
- Searching := TRUE;
- While Searching and (entry <> NIL) DO
- WITH entry^ DO
- IF Newitem < item then
- Searching := FALSE
- Else
- begin
- PriorEntry := entry;
- entry := Next
- end;
- (* CREATE the New entry and Insert it in position *)
- New(Newentry);
- Newentry^.item := Newitem;
- Newentry^.Next := entry;
- IF entry = ListHead then
- ListHead := Newentry
- Else PriorEntry^.Next := Newentry;
- end; (* InsertItem *)
-
- PROCEDURE WriteItems;
- VAR
- entry :ItemPointers;
- begin
- entry := ListHead;
- While entry <> NIL DO
- WITH entry^ DO
- begin
- Writeln(item);
- entry := Next
- end
- end; (* WriteItems *)
-
- begin (* MAIN PROGRAM *)
- ListHead := NIL; (* MAKE the LIST EMPTY *)
- Writeln(' ':12,'Insertion Sort Using a Linked List');
- writeln;writeln;writeln;
- writeln('Enter your list after the prompt.');
- writeln('Enter a dollar sign <$> when complete.');
- writeln;writeln;writeln;
-
- REPEAT
- write('>>');
- ReadItem(Newitem); (* READ the First Item *)
- If NOT error then
- If NOT EndOfList then
- (* Insert the New item in its correct position *)
- InsertItem(Newitem);
- UNTIL EndOfList;
-
- Writeln(' ':12,'The Sorted List');
- writeln;
- (* Write all the Items in order *)
- WriteItems
- end. (* SORTLIST *)
-