IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Проблема с двусвязным списком.., ну никак не могу разобраться..
Andrewshkovskii
сообщение 6.06.2007 20:14
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


Проблема следущая,при добавлении справа,теряются 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;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 2)
volvo
сообщение 6.06.2007 21:01
Сообщение #2


Гость






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

Сообщение отредактировано: volvo - 6.06.2007 21:02
 К началу страницы 
+ Ответить 
Andrewshkovskii
сообщение 7.06.2007 0:11
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 222
Пол: Мужской
Реальное имя: Andrew

Репутация: -  0  +


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

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


left и right обнилил в начале..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.06.2025 18:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"