Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Проблема с двусвязным списком..

Автор: Andrewshkovskii 7.06.2007 0:14

Проблема следущая,при добавлении справа,теряются 2 элемента,код,по-моему мнения верный,возможно проблема в том,что нет передачи параметров?...
Модуль с типом

UNIT TYPES;

INTERFACE

type
ts = ^nvs;
nvs = record
name: string[15];
Llink: ts;
Rlink: ts;
end;
IMPLEMENTATION
END.

Вот код модуля :
unit spisok;

INTERFACE
uses types;
procedure output2S;
procedure input2S;
procedure add_left;
procedure add_right;
procedure delsearch3_left(del:boolean);
procedure delsearch3_right(del:boolean);

IMPLEMENTATION

var
left,right,a:ts;
i: integer;
n: string;

procedure input2S;
var
i,j:byte;
begin
writeln('Vvedite kol-vo vagonov v sostave');
readln(j);
for i:=1 to j do
begin
writeln('Vvedite nomer vagona:');
readln(n);
new(a);
a^.name:=n;
a^.llink:=nil;
a^.rlink:=left;
left:=a;
right:=a;
end;
end;

procedure output2S;
begin
writeln('Sostav : ');
a:=left;
repeat
write(a^.name,' ');
a:=a^.rlink;
until a=nil;
writeln;
end;

procedure add_left;
begin
writeln('Dobovlyaem element sleva');
writeln('Vvedite nomer vagona:');
readln(n);
new(a);
a^.name := n;
a^.llink:=nil;
left^.llink:=a;
a^.rlink:=left;
left:=a;
end;

procedure add_right;
begin
writeln('Dobovlyaem element sprava');
writeln('Vvedite nomer vagona:');
readln(n);
new(a);
a^.name := n;
a^.rlink:=nil;
right^.rlink:=a;
a^.llink:=right;
right:=a;
end;

procedure delsearch3_left(del:boolean);
var
pos: byte;
flg: boolean;
begin
writeln('Vvedite iskomii vagon');
readln(n);
flg:=false;
pos:=0;
a:=left;
repeat
if a^.name = n then
flg:=true
else
a:=a^.rlink;
pos:=pos+1;
until (a=nil) or (flg=true);
if flg=true then
writeln('Pozicija vagona v sostave = ', pos)
else
writeln('Iskomogo elementa net.');
if (del=true) and (flg=true) then
begin

if (a<>left) and (a<>right) then { v centre }
begin
a^.llink^.rlink:=a^.rlink;
a^.rlink^.llink:=a^.llink;
dispose(a);
end;
if (a=left) and (a=right) then { edinstvennij }
begin
dispose(a);
right:=nil;
left:=nil;
end;
if (a=left) and (a<>right) then { krajnij sleva }
begin
a:=left;
left:=left^.rlink;
left^.llink:=nil;
dispose(a);
end;
if (a=right) and (a<>left) then { krajnij sprava }
begin
a:=right;
right:=right^.llink;
right^.rlink:=nil;
dispose(a);
end;

end;
end;

procedure delsearch3_right(del:boolean);
var
pos: byte;
flg: boolean;
begin
writeln('Vvedite iskomii vagon');
readln(n);
flg:=false;
pos:=0;
a:=right;
repeat
if a^.name = n then
flg:=true
else
a:=a^.llink;
pos:=pos+1;
until (a=nil) or (flg=true);
if flg=true then
writeln('Pozicija vagona v sostave = ', pos)
else
writeln('Iskomogo elementa net.');
if (del=true) and (flg=true) then
begin

if (a<>left) and (a<>right) then { v centre }
begin
a^.llink^.rlink:=a^.rlink;
a^.rlink^.llink:=a^.llink;
dispose(a);
end;
if (a=left) and (a=right) then { edinstvenniy }
begin
dispose(a);
right:=nil;
left:=nil;
end;
if (a=left) and (a<>right) then { krajnij sleva }
begin
a:=left;
left:=left^.rlink;
left^.llink:=nil;
dispose(a);
end;
if (a=right) and (a<>left) then { krajnij sprava }
begin
a:=right;
right:=right^.llink;
right^.rlink:=nil;
dispose(a);
end;

end;
end;


Автор: volvo 7.06.2007 1:01

Вроде все верно... На всякий случай покажи кусок кода, где ты вызываешь add_right ... И заодно - как ты инициализируешь left и right (у тебя же они из основной программы недоступны, а обнулить их по-любому в начале надо...)

Автор: Andrewshkovskii 7.06.2007 4:11

вот так вызываю..


begin
clrscr;
input2s;
output2s;
add_right;
output2s;
readkey;
end.


left и right обнилил в начале..