Помощь - Поиск - Пользователи - Календарь
Полная версия: Симметричный список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
yuivanenko
Определить, является ли текст симметричным во входящем файле (за ним идет точка) с использованием списков.

В FAQе нашел файлик, где реализованы процедуры обработки списков, взял создание, печать, формирование списка в обратной последовательности. Затем поэлементно сравниваю два списка, а мне всегда выдается ответ Не симметричны и на экране при выводе пред первым элементом отображается какой то пробел, и он же потом отображается после последнего в обратном списке. Наверное из за этого и ответ не симметричность. Подскажите, где ошибка

program Project1;

{$APPTYPE CONSOLE}
Type
 TElem = string;      {Òèï èíôîðìàöèîííîé ÷àñòè}

 TList = ^TNode;       {Ïðåäñòàâëåíèå ñïèñêà }
 TNode = record        {Çâåíî ñïèñêà}
	 Info: TElem;  {Èíôîðìàöèîííàÿ ÷àñòü}
	 Next: TList   {Ñëåäóþùèé ýëåìåíò ñïèñêà}
	 end;
 var spis,spis2:Tlist;
 st:string;
 flag:boolean;
 Procedure ZListInit(var L: TList);
var
 N: TList; {çàãëàâíûé ýëåìåíò}
Begin
 new(N);
 N^.Next:=nil;
 L:=N
End;

procedure ZListAddLast(L: TList; E: TElem);
begin
 { ïîèñê ïîñëåäíåãî ýëåìåíòà ñïèñêà }
 while L^.Next<>nil do L := L^.Next;
 { äîáàâëåíèå à ñïèñîê íîâîãî çâåíà }
 new(L^.Next );
 L:=L^.Next;
 L^.Info:=E;
 L^.Next:=nil
end;

procedure BListInvert(var L: TList);
var
 H: TList; { âñïîìîãàòåëüíûé óêàçàòåëü }
 P: TList; { óêàçàòåëü íà îáðàáîòàííûé ýëåìåíò ñïèñêà }
begin
 P := nil;
 while L<>nil do
 begin
  {( çàïîìèíàåì óêàçàòåëü íà ñëåäóþùèé )}
  H := L^.Next;
  {( òåïåðü ñëåäóþùèé çà òåêóùèì áóäåò çâåíî Ð )}
  L^.Next := P;
  {( òåêóùèé ñòàíîâèòñÿ ïðåäûäóùèì )}
  {( äëÿ ñëåäóþùåãî øàãà )}
  P := L;
  {( ïåðåèåùàåèñÿ ê ñëåäóþùåèó ýëåìåíòó ñïèñêà )}
  L:=H
 end;
 L :=P { ñàìûé ïîñëåäíèé ñòàíîâèòñÿ ïåðâûì }
end;
{ Ñïèñîê ñ çàãëàâíûì çâåíîè }
procedure ZListInvert (L: TList);
begin
 BListInvert ( L^.Next )
end;

procedure BListPrint(L: TList );
begin
 write('<');
 while L <> nil DO
 begin
  write( L^.Info );
  If L^.Next <> nil then write(' ');
  L := L^.Next
 end;
 writeln('>')
end;
procedure ZListPrint(L: TList);
begin
 BListPrint(L^.Next )
end;


Begin
ZListInit(spis);
Writeln('vvedite slova v konze .');
readln(st);
While st<>'.' do
begin
ZListAddLast(spis, st);
Readln(st);
end;
spis2:=spis;
BListPrint(spis);
writeln;
BListInvert(spis2);
BListPrint(spis2);
flag:=true;
 while spis <> nil DO
 begin if spis^.info<>spis2^.info then flag:=false;
 spis := spis^.Next; spis2 := spis2^.Next;end;
 if flag then Writeln('Simmetrichniy') Else Writeln('Ne Simmetrichniy');
 readln;
End.


Пытался найти ошибку сам, но так и не пойму, откуда берется пробел перед элементами
Ozzя
Это две задачи? Или "2 в одном"?
По 2-й - FAQ. "Палиндромы."
По 1-й - Поиск.
yuivanenko
Цитата(Ozzя @ 12.05.2010 15:04) *

Это две задачи? Или "2 в одном"?
По 2-й - FAQ. "Палиндромы."
По 1-й - Поиск.


Условие задачи второе, просто нужно сделать с динамическими переменными. Вот я и решил из файла сделать прямой список, потом по прямому списку сформировать обратный и сравнить. Есл есть какие нибудь другие предложения, с удовольствием рассмотрю
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.