4TH.PAS 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. {Программа для чтения из файла строк и одновремменное создание линейного
  2. тринаправленного списка, 1-й - как в файле, 2-й отсорт. по убыв, 3-й - по возр.}
  3. {Copyright Innocenty Enikeew (YEAR-2000)084/1 17.10.2001}
  4. type
  5. PList = ^TList;
  6. chains = array[1..3] of PList; {Массив указателей на эл-ты}
  7. TList = record
  8. s : string; {Значение эл-та списка.}
  9. next : chains; {Массив ссылок. 1-й - на следующий
  10. 2-й - на сортированный по убыв
  11. 3-й - --------\\--------- возрост}
  12. end;
  13. Const
  14. msgs : array [1..3] of string = ('не отсортированный','отсортированный по убыванию','отсортированный по возростанию');
  15. {Массив сообщений о сортировке}
  16. {--------------------------------------------------------}
  17. Procedure CreateList(var F:text;var hs,ts : chains);
  18. {Процедура чтения элементов из файла с одновременной сортировкой по убыванию
  19. и возростанию
  20. Входные:
  21. F - текстовый файл, откуда считиваются данные
  22. Выходные
  23. hs - массив указателей на головы списков
  24. ts - ---------//--------- хвосты списков
  25. Алгоритм работы:
  26. 1) Считывается первый элемент, которым инициализируются ВСЕ указатели
  27. 2) Пока файл не кончится, создаем и считываем следующий элемент. Записываем
  28. в 1-й указатель
  29. 3) Находим место по возрастанию. Вставляем туда, получая 2-ю ссылку
  30. 4) ------\\-------- убыванию. ----------\\----------- 3-ю
  31. 5) Переход не 2
  32. }
  33. var
  34. i : integer; {Указывает номер ссылки}
  35. n,c : PList; {с - новый созданный, n - "бегунок" для поиска места}
  36. begin
  37. New(Hs[1]); { \ }
  38. Hs[2]:=Hs[1]; { | }
  39. Hs[3]:=Hs[1]; { | }
  40. for i := 1 to 3 do { | Создание }
  41. begin { | и чтение ПЕРВОГО элемента}
  42. ts[i]:=hs[1]; { | }
  43. Hs[1]^.next[i] := nil; { | }
  44. end; { | }
  45. ReadLn(F,Hs[1]^.s); { / }
  46. while not EOF(F) do {Основной цикл считывания элементов}
  47. begin
  48. New(c);for i := 1 to 3 do c^.next[i]:=nil; {Выделение нового эл-та и
  49. инициализация его ссылок}
  50. ts[1]^.Next[1] := c; {Занесем его в конец первой цепочки}
  51. ts[1]:=c; {и сдвинем ее хвост}
  52. ReadLn(c^.s);
  53. for i := 2 to 3 do
  54. {Данный цикл объединяет в себе одновременное создание 2 и 3-й ссылки,
  55. т.к они отличаются лишь знаком сравнения}
  56. begin
  57. if ((c^.s > hs[i]^.s) and (i=2)) or ((c^.s < hs[i]^.s) and (i=3)) then
  58. {Проверяем, не надо ли заменить голову новым эл-том}
  59. begin
  60. c^.next[i] := hs[i];
  61. hs[i]:=c;
  62. end
  63. else {Иначе ищем ему место в уже созданном списке}
  64. begin
  65. n:=hs[i]; {Иниц. "бегунок"}
  66. while (n<>ts[i]) and
  67. ( {Пока не последний эл-т,}
  68. ((n^.next[i]^.s > c^.s) and (i=2)) or {и выполняется отсортированность}
  69. ((n^.next[i]^.s < c^.s) and (i=3)) {перемещаем "бегунок"}
  70. ) do n:=n^.next[i];
  71. c^.next[i] := n^.next[i]; {Вставляем наш эл-т между "бегунком"}
  72. n^.next[i] := c; {и следующим за ним}
  73. if n = ts[i] then ts[i] := c; {При необходимости - смещаем хвост}
  74. end; {Конец добавления эл-та в сорт.список}
  75. end; {Конец цикла для 2-х сортировок}
  76. end; {Конец цикла чтения файла}
  77. end;{CreateList}
  78. {------------------------------}
  79. Procedure WriteList(var F:text;hs,ts:chains;order:integer);
  80. {Процедура вывода списка, заданного hs и ts в файл F
  81. Order - номер списка, по которому бежать}
  82. var
  83. c : Plist; {Бегунок}
  84. begin
  85. c:=hs[order]; {его инициализация}
  86. repeat
  87. WriteLn(c^.s);
  88. c:=c^.next[order]; {продвижение по списку}
  89. until c = ts[order]; {Признак конца списка - вывод хвоста}
  90. end;{WriteList}
  91. {------------------------------}
  92. { ГОЛОВНОЙ МОДУЛЬ }
  93. var
  94. heads,tails : chains; {Массивы голов и хвостов}
  95. ch : integer; {переменная выбора варианта вывода}
  96. begin
  97. Assign(input,'4th.txt');
  98. {$I-}
  99. Reset(INPUT);
  100. if IOResult <> 0 then
  101. begin
  102. WriteLn('Error opening ''4th.txt''');
  103. Halt(255);
  104. end;
  105. {$I+}
  106. CreateList(INPUT,Heads,Tails); {Создание списка}
  107. Close(Input);
  108. Assign(Input,'con'); {Инициализация клавиатуры на место}
  109. Reset(Input);
  110. WriteLn('Список создан! Введите:');
  111. WriteLn(' 1 - не отсортирован ');
  112. WriteLn(' 2 - отсортирован по убыванию'); {Вывод приглашения}
  113. WriteLn(' 3 - отсортирован по возростанию');
  114. ch:=0;
  115. repeat
  116. Write('Введите число от 1-го до 3-х: '); {Запрос}
  117. Read(ch);
  118. until ch in [1..3];
  119. WriteLn('Вы выбрали ',msgs[ch]); {Сигнализация выбора}
  120. Assign(output,'4th.out');
  121. Rewrite(output);
  122. if IOResult <> 0 then
  123. begin
  124. WriteLn('Error opening ''4th.out'' for writing :( ');
  125. Halt(254);
  126. end;
  127. WriteLn('Оригинал:');
  128. WriteList(OUTPUT,heads,tails,1); {Вывод сначала исходного списка}
  129. WriteLn('Результат:');
  130. WriteList(OUTPUT,heads,tails,ch); {Затем - выбранного пользователем}
  131. while Heads[1] <> nil do
  132. {Очистка всего списка, Heads[1] - бегунок, Tails[1] - временная переменная}
  133. begin
  134. Tails[1] := Heads[1]^.next[1];
  135. Dispose(heads[1]);
  136. Heads[1]:=tails[1];
  137. end;
  138. end.