| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- const
- InName = '3.txt';
- OutName = '3.out';
- type
- plist = ^tlist;
- tlist = record
- s:string;
- next,prev:plist;
- end;
- {----------------------------}
- Function InsertBefore(aW,aB : plist):boolean;
- var
- BP,WN:plist;
- begin
- if aW = aB then begin InsertBefore := false; exit; end;
- InsertBefore := true;
- bp := aB^.prev; WN:=aW^.next;
- if aW^.prev <> nil then aW^.Prev^.Next := WN;
- if WN <> NIL then WN^.Prev := aW^.prev;
- aW^.Prev := BP;
- if BP <> nil then BP^.Next := aW;
- aB^.Prev := aW;
- aW^.Next := aB;
- end;{InsertBefore}
- {----------------------------}
- Function FindMed(a1,a2 : plist):plist;
- var
- count,i : word;
- ca : plist;
- begin
- if a1 = a2 then begin FindMed := a1;exit;end;
- ca := a1;
- count := 0;
- while (ca<>nil) and (ca<>a2) do
- begin
- inc(count);
- ca:=ca^.next;
- end;
- if ca = a2 then
- begin
- for i := 1 to count div 2 do ca:=ca^.prev;
- FindMed := ca;exit;
- end
- else
- begin
- ca := a1;
- count := 0;
- while (ca<>nil) and (ca<>a2) do
- begin
- inc(count);
- ca:=ca^.prev;
- end;
- if ca = a2 then
- begin
- for i := 1 to count div 2 do ca:=ca^.next;
- FindMed := ca;exit;
- end
- else FindMed:=a1;
- end;
- end;{FindMed}
- {----------------------------}
- Function FindPlace(aB,aE,aV:plist):plist;
- var
- med : plist;
- begin
- if ord(aE^.s[0]) > ord(aV^.s[0]) then begin FindPlace:=aV;exit;end;
- while (aB^.Next <> aE) and (aB <> aE) do
- begin
- med := FindMed(aB,aE);
- if ord(med^.s[0]) > ord(aV^.s[0]) then aB:=med
- else aE := med;
- end;
- if ord(aB^.s[0]) < ord(aV^.s[0]) then FindPlace := aB else FindPlace := aE;
- end;{FindPlace}
- {----------------------------}
- Procedure Sort(var aL : plist);
- var
- i : plist;
- begin
- i:=aL;
- while i^.next <> nil do
- begin
- if not InsertBefore(i^.next,Findplace(aL,i,i^.next)) then i:=i^.next;
- while aL^.Prev <> nil do aL:=aL^.prev;
- end;
- end;{Sort}
- {----------------------------}
- var
- strings,cs,ls : plist;
- INP,OUTP : text;
- ch : char;
- begin
- Assign(INP,InName);
- {$I-}
- Reset(INP);
- If IOResult <> 0 then
- begin
- WriteLn('Ошибка открытия файла ''',InName,''', код: ', IOResult);
- Halt(200);
- end;
- Assign(OUTP,OutName);
- Rewrite(OUTP);
- If IOResult <> 0 then
- begin
- WriteLn('Ошибка открытия файла для чтения ''',OutName,''', код: ', IOResult);
- Halt(201);
- end;
- {$I+}
- New(cs);
- cs^.prev:=nil;
- strings := cs;
- while not EOF(INP) do
- begin
- ch:=#0;
- cs^.s:='';
- while (ch <> '.') and Not EOF(INP) do
- begin
- Read(inp,ch);
- cs^.s := cs^.s + ch;
- end;
- New(cs^.next);
- ls:=cs;
- cs:=cs^.next;
- cs^.prev := ls;
- end;
- Dispose(cs);
- ls^.next:=nil;
- Close(INP);
- cs:=strings;
- while cs<>nil do
- begin
- Write(OUTP,cs^.s);
- cs:=cs^.next;
- end;
- WriteLn(OUTP,'Result:');
- Sort(strings);
- cs:=strings;
- while cs<>nil do
- begin
- Write(OUTP,cs^.s);
- cs:=cs^.next;
- end;
- Close(OUTP);
- end.
|