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 *) .