Помощь - Поиск - Пользователи - Календарь
Полная версия: Закольцевание двусвязан. спис. Проблемы с выводом
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Insel
Здравствуйте.
Помогите, пожалуйста, разобраться с этой задачей: создать двусвязанный список из целых чисел. Преобразовать его в кольцо. Предусмотреть возможность движения по кольцу в обе стороны с отображением местоположения текущего элемента.

Пользуясь материалом различный FAQ и форумов состряпал представленный ниже код. Добавление элементов в список и закольевание списка в кольцо проходит вроде нормально. Проблема возникает при выводе элементов.
Помогите, пожалуйста, разобраться, почему элементы не выводятся? И если есть ли где ошибки логики?
program Project1_1;

uses
SysUtils;

{$APPTYPE CONSOLE}
type TipElement=Integer;
svqz=^Zveno;
Zveno=Record
sled:svqz;
pred:svqz;
element:TipElement;
end;

var
start:svqz; {nachal'nyi element spiska}
kon:svqz; {konechnyi element spiska}
p:svqz; //!!!


{Добавление в начало списка}
Procedure AddToBegin(a: TipElement);
var
p: svqz;
Begin
New(p);
p^.Element:=a;
If (start=NIL) and (kon=NIL) Then
Begin
p^.pred:=NIL;
p^.sled:=NIL;
start:=p;
kon:=p;
End
Else
Begin
p^.sled:=start;
start^.pred:=p;
p^.pred:=NIL;
start:=p;
End;
End;

{Добавление в конец списка}
Procedure AddToEnd(a: TipElement);
var
p:svqz;
Begin
new(p);
p^.Element:=a;
If (start=NIL) and (kon=NIL) Then
Begin
p^.pred:=NIL;
p^.sled:=NIL;
start:=p;
End
Else
Begin
p^.sled:=NIL;
p^.pred:=kon;
kon^.sled:=p;
End;
kon:=p;
End;

procedure Vyvod_Forward(p:svqz);
var
UkZv:svqz;
Begin
UkZv:=p^.sled;
if p^.sled=p then
writeln('Koltso pusto')
else
begin
while UkZv<>p do
begin
Write (UkZv^.element, ' ');
ukzv:=ukzv^.sled;
end;
writeln;
end;
End;

procedure vyvod_back(p:svqz);
var
ukzv:svqz;
begin
ukzv:=p^.pred;
if p^.sled=p then
writeln('Koltso pusto')
else begin
while ukzv<>p do
begin
write(ukzv^.element, ' ');
ukzv:=ukzv^.pred;
end;
writeln;
end
End;
//----------------------
{Закольцовывание списка}
Procedure ToRing;
Begin
kon^.sled:=start;
start^.pred:=kon;
End;
//----------------------
{var
a:svqz;}
BEGIN
start:=NIL;
kon:=NIL;

AddToBegin(5);
AddToBegin(9);
AddToBegin(-6);
{AddToBegin(12);}
ToRing;

vyvod_back(p);

readln;
readln;
END.


Для написания использовался Delphi (Console Application).
klem4
К сожалению нету сейчас времени посмотерть твою задачу, пока никто ничего не подсказал, можешь заглянуть сюда - модуль для работы с двусвязными списками.
volvo
Поиском пользуемся:
Циклический список, вставка, удаление, печать списка - там приведена ссылка на реализацию кольцевого списка...
volvo
Что касается твоей программы, то проблема здесь:
begin
...
vyvod_back(p); { <-- !!! }
...
end.

Чему равно значение P к моменту вызова этой функции?
Segmentation Fault обеспечен :yes: Замени на
vyvod_back(start); { или vyvod_back(kon); }
Insel
Volvo большое спасибо за помощь. smile.gif
У меня только маленький вопрос, фраза из условия “Предусмотреть возможность движения по кольцу в обе стороны”, подразумевает на Ваш взгляд такую (или примерно такую) реализацию, как мои процедуры Vyvod_Forward и Vyvod_Back или препод имел в виду что-то другое?
Ещё раз спасибо, что помогли с задачей и нашли ошибку! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.