Программа


PROGRAM Compare;
TYPE SymbolS=^SymbolRecord;        { Тип "Ссылка на запись символа" }
     SymbolRecord=record           { Запись символа }
                    Ch:Char;         { Символ (буква) }
                    Next:SymbolS     { Ссылка на следующую запись }
                  end;
VAR FileName:String;               { Имя входного файла }
    List1,List2:SymbolS;           { Ссылки на списки первой и второй
                                     половины символов файла }
PROCEDURE DisposerList(var S:SymbolS); { Процедура удаления списка }
  Begin
    if S<>nil then begin   { Если переменная существует, то }
                     DisposerList(S^.NEXT);  { удаление хвоста списка }
                     Dispose(S)              { удаление переменной }
                   end;
    S:=nil { Переопределение ссылки }
  End;
PROCEDURE LoadFile(FileName:string;var S:SymbolS);
                                                  { Процедура загрузки файла }
  Var Buf:SymbolS;       { Буферная переменная для создания очереди }
      FileVar:text;      { Файловая переменная }
  Begin
    Assign(FileVar,FileName);{ Связывание файловой переменной с именем файла }
    Reset(FileVar);          { Открытие файла для чтения }
    S:=nil;                  { Формирование конца списка }
    while not EOF(FileVar) do { Цикл чтения файла и формирование списка }
      begin
        New(Buf);               { Создание новой переменной под символ }
        Read(FileVar,Buf^.Ch);  { Чтение символа }
        Buf^.Next:=S;           { Связывание списка с буферной переменной }
        S:=Buf;                 { Переопределение ссылки на список }
      end;
    Close(FileVar)           { Закрытие файла }
  End;
PROCEDURE DivisionList(List1:SymbolS;var List2:SymbolS);
                                     { Процедура деления списка на две части }
  Function QuantityElementInList(Element:SymbolS):Longint;
                            { Функция подсчета количества элементов в списке }
    begin
      if Element<>nil  { Если список не пуст, }
        then QuantityElementInList:=QuantityElementInList(Element^.Next)+1
             { то - определение значения функции по длине продолжения списка }
        else QuantityElementInList:=0
             { иначе - определение нулевой длины }
    end;
  Var i:longint; { Счетчик }
  Begin
    for i:=1 to QuantityElementInList(List1) div 2 -1 do List1:=List1^.Next;
      { Движение по списку до последненго элемента первой половины }
    if List1<>nil { Если первый список не пуст, }
      then begin  { то }
             List2:=List1^.Next; { определение ссылки на вторую половину списка }
             List1^.Next:=nil    { формирование конца первого списка }
           end
      else List2:=nil; { иначе - определение второго списка пустым }
  End;
FUNCTION ListCompare(List1,List2:SymbolS):boolean; { Функция сравнения списков }
  Begin
    if (List1<>nil)and(List2<>nil)
      then if List1^.Ch=List2^.Ch
             then ListCompare:=ListCompare(List1^.Next,List2^.Next)
             else ListCompare:=FALSE
      else ListCompare:=(List1=nil)and(List2=nil)
    { Если ссылки одновременно не равны nil,
        то    если символы равны,
                то    определение значения функции по факту равенства
                      продолжений списков
                иначе определение значения функции FALSE
        иначе определение значения функции по факту одновременного равенства
              ссылок на nil }
  End;
BEGIN
  WriteLn;                              { Пропуск строки }
  Write('Введите имя входного файла '); { Вывод приглашения ввести имя файла }
  ReadLn(FileName);                     { Ввод имени файла }
  LoadFile(FileName,List1);             { Чтение файла }
  DivisionList(List1,List2);            { Деление списка на две части }
  { Сравнение списков и вывод соответствующего сообщения: }
  if ListCompare(List1,List2)
    then WriteLn('Первая и вторая половины файла равны')
    else WriteLn('Первая и вторая половины файла НЕ равны');
  DisposerList(List1);  { Удаление первого списка из памяти }
  DisposerList(List2)   { Удаление второго списка из памяти }
END.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию