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

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

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

 
 Ответить  Открыть новую тему 
> Закольцевание двусвязан. спис. Проблемы с выводом, Проблемы с выводом элементов кольца
сообщение
Сообщение #1


Гость






Здравствуйте.
Помогите, пожалуйста, разобраться с этой задачей: создать двусвязанный список из целых чисел. Преобразовать его в кольцо. Предусмотреть возможность движения по кольцу в обе стороны с отображением местоположения текущего элемента.

Пользуясь материалом различный 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).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

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

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


К сожалению нету сейчас времени посмотерть твою задачу, пока никто ничего не подсказал, можешь заглянуть сюда - модуль для работы с двусвязными списками.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Поиском пользуемся:
Циклический список, вставка, удаление, печать списка - там приведена ссылка на реализацию кольцевого списка...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Что касается твоей программы, то проблема здесь:
begin
...
vyvod_back(p); { <-- !!! }
...
end.

Чему равно значение P к моменту вызова этой функции?
Segmentation Fault обеспечен :yes: Замени на
vyvod_back(start); { или vyvod_back(kon); }
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Volvo большое спасибо за помощь. smile.gif
У меня только маленький вопрос, фраза из условия “Предусмотреть возможность движения по кольцу в обе стороны”, подразумевает на Ваш взгляд такую (или примерно такую) реализацию, как мои процедуры Vyvod_Forward и Vyvod_Back или препод имел в виду что-то другое?
Ещё раз спасибо, что помогли с задачей и нашли ошибку! smile.gif
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 18.04.2025 16:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name