В программе приведены различные операции с двусвязным списком.
Настораживают два пункта: добавление(добавляет всё время за первым добавленным) и удаление(удаляет всё время элементы по порядку после первого). Явно косяки... Прошу посмотреть.
while (temp^.info<>x) and (temp^.right<>nil) do
temp:=temp^.right;
begin
extra:=temp^.right;
temp^.right:=extra^.right;
dispose(extra);
end;
end;
while (temp^.info<>x) and (temp^.right<>nil) do
temp:=temp^.right;
begin
extra:=temp^.right;
temp^.right:=extra^.right;
dispose(extra);
end;
end;
while (temp^.info<>x) and (temp^.right<>nil) do
begin
temp:=temp^.right;
extra:=temp^.right;
temp^.right:=extra^.right;
dispose(extra);
end;
end;
procedure ToDelete(var walk:list; x:integer);
var
temp,extra:list;
found:boolean;
begin
found:=false;
if walk=nil then
begin
writeln('Cnucok nycT');
readln;
end;
if (walk^.right=nil) and (walk^.left=nil) then
if walk^.info=x then
begin
dispose(walk);
walk:=nil;
end
else halt;
if walk<>nil then
if walk^.info=x then
begin
found:=true;
temp:=walk;
walk:=walk^.right;
dispose(temp)
end
else
begin
temp:=walk;
while not found and (temp^.right<>nil) do
if temp^.right^.info=x then found:=true
else temp:=temp^.right;
if found then
begin
extra:=temp^.right;
temp^.right:=extra^.right;
dispose(extra);
end;
end;
end;
procedure ToListClear(var first:list);(в односвязном. и в двусвязном - тоже var)
procedure ToAdd(var walk:list;x:integer);
var temp:list;
begin
new(temp);
temp^.info:=x;
if walk=nil then
begin
walk:=temp;
walk^.right:=nil;
walk^.left:=nil;
end
else
begin
temp^.right:=walk;
walk^.left:=temp;
temp^.left:=nil;
walk:=temp;
end;
end;