home *** CD-ROM | disk | FTP | other *** search
/ Delphi Programming Unleashed / Delphi_Programming_Unleashed_SAMS_Publishing_1995.iso / chap16 / linklst3 / linklst3.dpr next >
Encoding:
Text File  |  1995-03-21  |  6.1 KB  |  323 lines

  1. program LinkLst3;
  2.  
  3. { Program copyright (c) 1995 by Charles Calvert }
  4. { Project Name: LINKLST3 }
  5.  
  6. uses
  7.   WinCrt;
  8.  
  9. const
  10.   FileName = 'LinkExp.dta';
  11.  
  12. type
  13.   PMyNode = ^TMyNode;
  14.   TMyNode = record
  15.     Name  : String;
  16.     Flight: integer;
  17.     Day   : String;
  18.     Next  : PMyNode;  {Used to link each field}
  19.   end;
  20.  
  21. procedure CreateNew(var Item: PMyNode);
  22. begin
  23.   New(Item);
  24.   Item^.Next := nil;
  25.   Item^.Name := '';
  26.   Item^.Flight := 0;
  27.   Item^.Day := '';
  28. end;
  29.  
  30. procedure GetData(var Item: PMyNode);
  31. begin
  32.   ClrScr;
  33.   repeat
  34.     GotoXY(1, 1);
  35.     Write('Enter Name: ');
  36.     Read(Item^.Name);
  37.   until (Item^.Name <> '');
  38.   GotoXY(1, 2);
  39.   Write('Enter Flight number: ');
  40.   ReadLn(Item^.Flight);
  41.   GotoXY(1, 3);
  42.   Write('Enter Day: ');
  43.   ReadLn(Item^.Day);
  44. end;
  45.  
  46. procedure DoFirst(var First, Current: PMyNode);
  47. begin
  48.   CreateNew(Current);
  49.   GetData(Current);
  50.   First := Current;
  51. end;
  52.  
  53. procedure Add(Current: PMyNode);
  54. var
  55.   Prev: PMyNode;
  56. begin
  57.   Prev := Current;
  58.   CreateNew(Current);
  59.   GetData(Current);
  60.   Prev^.Next := Current;
  61. end;
  62.  
  63. procedure DeleteNode(var Head, Node, Current: PMyNode);
  64. var
  65.   Temp: PMyNode;
  66. begin
  67.   Temp := Head;
  68.   while Temp^.Next <> Node do
  69.     Temp := Temp^.Next;
  70.   if Temp^.Next^.Next <> nil then
  71.     Temp^.Next := Temp^.Next^.Next
  72.   else begin
  73.     Temp^.Next := nil;
  74.     Current := Temp;
  75.   end;
  76.   Dispose(Node);
  77. end;
  78.  
  79. function Find(Head: PMyNode; S: String): PMyNode;
  80. var
  81.   Temp: PMyNode;
  82. begin
  83.   Temp := nil;
  84.   while Head^.Next <> nil do begin
  85.     if Head^.Name = S then begin
  86.       Temp := Head;
  87.       break;
  88.     end;
  89.     Head := Head^.Next;
  90.   end;
  91.   if Head^.Name = S then Temp := Head;
  92.   Find := Temp;
  93. end;
  94.  
  95. procedure DoDelete(var Head, Current: PMyNode);
  96. var
  97.   S: String;
  98.   Temp: PMyNode;
  99. begin
  100.   ClrScr;
  101.   Write('Enter name from record to delete: ');
  102.   ReadLn(S);
  103.   Temp := Find(Head, S);
  104.   if Temp <> nil then
  105.     DeleteNode(Head, Temp, Current);
  106. end;
  107.  
  108. function AtPosition(Head: PMyNode; Num2Find: Integer): PMyNode;
  109. var
  110.   i: Integer;
  111. begin
  112.   i := 1;
  113.   while Head^.Next <> nil do begin
  114.     if i = Num2Find then Break;
  115.     Head := Head^.Next;
  116.     Inc(i);
  117.   end;
  118.   AtPosition := Head;
  119. end;
  120.  
  121. procedure ShowRec(Item: PMyNode);
  122. begin
  123.   Write('Name: ', Item^.Name);
  124.   Write('     Flight: ', Item^.Flight);
  125.   WriteLn('       Day: ', Item^.Day);
  126. end;
  127.  
  128. procedure ShowRec2(Item: PMyNode);
  129. begin
  130.   GotoXY(1, 1); ClrEol;
  131.   GotoXY(1, 1); Write('Name: ', Item^.Name);
  132.   GotoXY(25, 1); Write('Flight: ', Item^.Flight);
  133.   GotoXY(45, 1); Write('Day: ', Item^.Day);
  134. end;
  135.  
  136. function GetTotal(Head: PMyNode): Integer;
  137. var
  138.   i: Integer;
  139. begin
  140.   i := 1;
  141.   while Head^.Next <> nil do begin
  142.     Head := Head^.Next;
  143.     Inc(i);
  144.   end;
  145.   GetTotal := i;
  146. end;
  147.  
  148. procedure Explain;
  149. begin
  150.   GotoXY(1, 3); WriteLn('T) Top');
  151.   GotoXY(1, 4); WriteLn('B) Bottom');
  152.   GotoXY(1, 5); WriteLn('U) Up One');
  153.   GotoXY(1, 6); WriteLn('D) Down One');
  154.   GotoXY(1, 7); WriteLn('X) Exit View');
  155. end;
  156.  
  157. procedure ShowOneByOne(Head: PMyNode);
  158. var
  159.   Total, i: Integer;
  160.   Temp: PMyNode;
  161.   Ch: Char;
  162. begin
  163.   ClrScr;
  164.   Explain;
  165.   Total := GetTotal(Head);
  166.   i := 1;
  167.   repeat
  168.     Temp := AtPosition(Head, i);
  169.     ShowRec2(Temp);
  170.     repeat
  171.       Ch := UpCase(ReadKey);
  172.     until Ch in ['U', 'D', 'T', 'B', 'X'];
  173.     if Ch = 'U' then begin
  174.       Dec(i);
  175.       if i < 1 then i := 1;
  176.     end;
  177.     if Ch = 'D' then Inc(i);
  178.     if Ch = 'T' then i := 1;
  179.     if Ch = 'B' then i := Total;
  180.   until Ch = 'X';
  181. end;
  182.  
  183. procedure Show(Head: PMyNode);
  184. var
  185.   i: Integer;
  186. begin
  187.   i := 1;
  188.   ClrScr;
  189.   while Head^.Next <> nil do begin
  190.     Head := Head^.Next;
  191.     ShowRec(Head);
  192.     Inc(i);
  193.   end;
  194.   WriteLn;
  195.   WriteLn('==========================================================');
  196.   WriteLn(i, ' records shown');
  197.   ReadLn;
  198. end;
  199.  
  200. procedure FreeAll(var Head: PMyNode);
  201. var
  202.   Temp: PMyNode;
  203. begin
  204.   while Head^.Next <> nil do begin
  205.     Temp := Head^.Next;
  206.     Dispose(Head);
  207.     Head := Temp;
  208.   end;
  209.   Dispose(Head);
  210. end;
  211.  
  212. procedure CreateNewFile(Head: PMyNode);
  213. var
  214.   F: File of TMyNode;
  215. begin
  216.   Assign(F, FileName);
  217.   ReWrite(F);
  218.   while Head^.Next <> nil do begin
  219.     Write(F, Head^);
  220.     Head := Head^.Next;
  221.   end;
  222.   Write(F, Head^);
  223.   Close(F);
  224. end;
  225.  
  226. { Read a binary file. Prefered method }
  227. function ReadFile(var First, Current: PMyNode): Boolean;
  228. var
  229.   F: File of TMyNode;
  230.   Prev: PMyNode;
  231. begin
  232.   ReadFile := False;
  233.   Assign(F, FileName);
  234.   {$I-} Reset(F); {$I+}
  235.   if IOResult <> 0 then Exit;
  236.   CreateNew(Current);
  237.   Read(F, Current^);
  238.   First := Current;
  239.   while not Eof(F) do begin
  240.     Prev := Current;
  241.     CreateNew(Current);
  242.     Read(F, Current^);
  243.     Prev^.Next := Current;
  244.   end;
  245.   Close(F);
  246.   ReadFile := True;
  247. end;
  248.  
  249. { Read a Text File }
  250. procedure ReadTextFile(var First, Current: PMyNode);
  251. var
  252.   F: Text;
  253.   i: Integer;
  254.   Prev: PMyNode;
  255. begin
  256.   Assign (F, 'data.txt');
  257.   {$I-} Reset(F); {$I+}
  258.   if (IOResult <> 0) then begin
  259.     WriteLn('error Reading File');
  260.     Halt;
  261.   end;
  262.   CreateNew(Current);
  263.   ReadLn(F, Current^.Name);
  264.   ReadLn(F, Current^.Flight);
  265.   ReadLn(F, Current^.Day);
  266.   First := Current;
  267.   i := 0;
  268.   while not Eof(F) do begin
  269.     Prev := Current;
  270.     CreateNew(Current);
  271.     ReadLn(F, Current^.Name);
  272.     ReadLn(F, Current^.Flight);
  273.     ReadLn(F, Current^.Day);
  274.     Prev^.Next := Current;
  275.     Inc(i);
  276.     WriteLn(i);
  277.   end;
  278.   Close(F);
  279.   CreateNewFile(First);
  280. end;
  281.  
  282. function WriteMenu: Char;
  283. var
  284.   Ch: Char;
  285. begin
  286.   ClrScr;
  287.   GotoXY(1, 1);
  288.   WriteLn('A) Add');
  289.   WriteLn('D) Delete');
  290.   WriteLn('S) Show');
  291.   WriteLn('W) Write File');
  292.   WriteLn('O) One by One');
  293.   WriteLn('X) Exit');
  294.   repeat
  295.     Ch := UpCase(ReadKey);
  296.   until Ch in ['A', 'D', 'S', 'W', 'O', 'X'];
  297.   WriteMenu := Ch;
  298. end;
  299.  
  300. var
  301.   Ch: Char;
  302.   First,
  303.   Current: PMyNode;
  304.  
  305. begin
  306.   ClrScr;
  307.   if not ReadFile(First, Current) then
  308.     ReadTextFile(First, Current);
  309.   repeat
  310.     Ch := WriteMenu;
  311.     case Ch of
  312.       'A': Add(Current);
  313.       'D': DoDelete(First, Current);
  314.       'S': Show(First);
  315.       'W': CreateNewFile(First);
  316.       'O': ShowOneByOne(First);
  317.     end;
  318.   until Ch = 'X';
  319. end.
  320.  
  321.  
  322.  
  323.