Здравствуйте! Проблема с работоспособносью программы. Помогите исправить ошибку.
Тема: динамические переменные и указатели
Само задание: Оставить в списке только первое вхождение одинаковых слов
Код:
Код:
Program Spisok;
type
Tinf=string[35];
List=^TList;
TList=record
data:TInf;
next:List;
end;
Procedure ClearStek(spis_:List);
var
tmp:List;
begin
while spis_<>nil do
begin
tmp:=spis_;
spis_:=spis_^.next;
FreeMem(tmp,SizeOf(Tlist));
end;
end;
Function SearchElemZnach(spis_:List;znach1:TInf):List;
begin
if spis_<>nil then
while (Spis_<>nil) and (znach1<>spis_^.data) do
spis_:=spis_^.next;
SearchElemZnach:=spis_;
end;
Procedure AddElem(var spis_:List;znach_:TInf);
var
tmp:List;
begin
if spis_=nil then {Проверяем не пуст ли список, если пуст, то }
begin
GetMem(spis_,sizeof(TList)); {создаём его первый элемент}
tmp:=spis_;
end
else {в случае если список не пуст}
begin
tmp:=spis_;
while tmp^.next<>nil do
tmp:=tmp^.next; {ставим tmp на последний элемент списка}
GetMem(tmp^.next,sizeof(TList)); {создаём следующий элемент}
tmp:=tmp^.next; {переносим tmp на новый элемент}
end;
tmp^.next:=nil; {зануляем указатель}
tmp^.data:=znach_; {заносим значение}
end;
procedure Output(spis_:List);
begin
if spis_=nil then
begin
writeln('Список пуст!');
exit;
end;
while spis_<>nil do
begin
Write(spis_^.data, ' ');
spis_:=spis_^.next
end;
end;
Procedure DelElem(var stek1:List;tmp:List);
var
tmpi:List;
begin
if (stek1=nil) or (tmp=nil) then {если стек пуст или указатель никуда не указывает, то выходим}
exit;
if tmp=stek1 then {если мы удаляем элемент который является вершиной стека, то}
begin
stek1:=tmp^.next;{следует перенести вершину и}
FreeMem(tmp,SizeOf(TList)); {высвободить память из под элемента}
end
else {в случае, если удаляемый элемент не вершина стека, то}
begin
tmpi:=stek1; {ставим указатель на вершину стека}
while tmpi^.next<>tmp do {доходим до элемента стоящего "перед" тем, который нам следует удалить}
tmpi:=tmpi^.next;
tmpi^.next:=tmp^.next; {указатель элемента переносим на следующий элемент за удаляемым}
FreeMem(tmp,sizeof(TList)); {удаляем элемент}
end;
end;
var
MyList,b,c,tp:List;
n,i,z,h:integer;
stroka:Tinf;
f:integer;
buf:Tinf;
begin
ClearStek(MyList);
WriteLn('Сколько элементов добавить в динамический список?');
ReadLn(n);
for i:=1 to n do
begin
readLn(stroka);
AddElem(MyList,stroka);
AddElem(b,stroka); {теневой список - пригодится при сравнении}
end;
WriteLn('Содержимое списка');
Output(MyList);
while b<>NIL do
begin
f:=0;
buf:=b^.data;
while MyList<>NIL do
begin
if MyList^.data=buf then f:=f+1;
MyList:=MyList^.next;
end;
if f>1 then {если слов больше одного, то мы ищем его в списке и удаляем, но оставляем 1 вхождение}
begin
for n := 1 to (f-1) do
begin
tp:=SearchElemZnach(MyList,buf);
DelElem(MyList,tp);
end;
end;
b:=b^.next;
end;
WriteLn;
WriteLn('Список после редактирования');
Output(myList);
readln;
ClearStek(MyList);
ClearStek(b);
end.
Собственно пока тут только код программы без всяких проверок на правильность введенных данных. Но и он не работает...
Буду очень рад, если поможете!
Заранее спасибо!
С уважением,
DjedayD!
___________
Код нужно оформлять по правилам:
не словом Код: (это скрипт форума сам напишет),
а тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.