3.PAS 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. const
  2. InName = '3.txt';
  3. OutName = '3.out';
  4. type
  5. plist = ^tlist;
  6. tlist = record
  7. s:string;
  8. next,prev:plist;
  9. end;
  10. {----------------------------}
  11. Function InsertBefore(aW,aB : plist):boolean;
  12. var
  13. BP,WN:plist;
  14. begin
  15. if aW = aB then begin InsertBefore := false; exit; end;
  16. InsertBefore := true;
  17. bp := aB^.prev; WN:=aW^.next;
  18. if aW^.prev <> nil then aW^.Prev^.Next := WN;
  19. if WN <> NIL then WN^.Prev := aW^.prev;
  20. aW^.Prev := BP;
  21. if BP <> nil then BP^.Next := aW;
  22. aB^.Prev := aW;
  23. aW^.Next := aB;
  24. end;{InsertBefore}
  25. {----------------------------}
  26. Function FindMed(a1,a2 : plist):plist;
  27. var
  28. count,i : word;
  29. ca : plist;
  30. begin
  31. if a1 = a2 then begin FindMed := a1;exit;end;
  32. ca := a1;
  33. count := 0;
  34. while (ca<>nil) and (ca<>a2) do
  35. begin
  36. inc(count);
  37. ca:=ca^.next;
  38. end;
  39. if ca = a2 then
  40. begin
  41. for i := 1 to count div 2 do ca:=ca^.prev;
  42. FindMed := ca;exit;
  43. end
  44. else
  45. begin
  46. ca := a1;
  47. count := 0;
  48. while (ca<>nil) and (ca<>a2) do
  49. begin
  50. inc(count);
  51. ca:=ca^.prev;
  52. end;
  53. if ca = a2 then
  54. begin
  55. for i := 1 to count div 2 do ca:=ca^.next;
  56. FindMed := ca;exit;
  57. end
  58. else FindMed:=a1;
  59. end;
  60. end;{FindMed}
  61. {----------------------------}
  62. Function FindPlace(aB,aE,aV:plist):plist;
  63. var
  64. med : plist;
  65. begin
  66. if ord(aE^.s[0]) > ord(aV^.s[0]) then begin FindPlace:=aV;exit;end;
  67. while (aB^.Next <> aE) and (aB <> aE) do
  68. begin
  69. med := FindMed(aB,aE);
  70. if ord(med^.s[0]) > ord(aV^.s[0]) then aB:=med
  71. else aE := med;
  72. end;
  73. if ord(aB^.s[0]) < ord(aV^.s[0]) then FindPlace := aB else FindPlace := aE;
  74. end;{FindPlace}
  75. {----------------------------}
  76. Procedure Sort(var aL : plist);
  77. var
  78. i : plist;
  79. begin
  80. i:=aL;
  81. while i^.next <> nil do
  82. begin
  83. if not InsertBefore(i^.next,Findplace(aL,i,i^.next)) then i:=i^.next;
  84. while aL^.Prev <> nil do aL:=aL^.prev;
  85. end;
  86. end;{Sort}
  87. {----------------------------}
  88. var
  89. strings,cs,ls : plist;
  90. INP,OUTP : text;
  91. ch : char;
  92. begin
  93. Assign(INP,InName);
  94. {$I-}
  95. Reset(INP);
  96. If IOResult <> 0 then
  97. begin
  98. WriteLn('Žè¨¡ª  ®âªàëâ¨ï ä ©«  ''',InName,''', ª®¤: ', IOResult);
  99. Halt(200);
  100. end;
  101. Assign(OUTP,OutName);
  102. Rewrite(OUTP);
  103. If IOResult <> 0 then
  104. begin
  105. WriteLn('Žè¨¡ª  ®âªàëâ¨ï ä ©«  ¤«ï ç⥭¨ï ''',OutName,''', ª®¤: ', IOResult);
  106. Halt(201);
  107. end;
  108. {$I+}
  109. New(cs);
  110. cs^.prev:=nil;
  111. strings := cs;
  112. while not EOF(INP) do
  113. begin
  114. ch:=#0;
  115. cs^.s:='';
  116. while (ch <> '.') and Not EOF(INP) do
  117. begin
  118. Read(inp,ch);
  119. cs^.s := cs^.s + ch;
  120. end;
  121. New(cs^.next);
  122. ls:=cs;
  123. cs:=cs^.next;
  124. cs^.prev := ls;
  125. end;
  126. Dispose(cs);
  127. ls^.next:=nil;
  128. Close(INP);
  129. cs:=strings;
  130. while cs<>nil do
  131. begin
  132. Write(OUTP,cs^.s);
  133. cs:=cs^.next;
  134. end;
  135. WriteLn(OUTP,'Result:');
  136. Sort(strings);
  137. cs:=strings;
  138. while cs<>nil do
  139. begin
  140. Write(OUTP,cs^.s);
  141. cs:=cs^.next;
  142. end;
  143. Close(OUTP);
  144. end.