Помощь - Поиск - Пользователи - Календарь
Полная версия: Симметричный список
Форум «Всё о Паскале» > 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-й - Поиск.


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