Помощь - Поиск - Пользователи - Календарь
Полная версия: Закольцевание двусвязан. спис. Проблемы с выводом
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.