Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2013, 19:08   #1
Катя Миронова
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 10
По умолчанию кольцевой двунаправленный список( Паскаль)

Нужно создать кольцевой двунаправленный список и удалить два последних элемента. Выбивает ошибку, что переменная не является записью или объектом, помогите исправить ошибку
Код:
PROGRAM DINSTR (INPUT,OUTPUT);
TYPE
 ZV=^POINTER;
 POINTER=RECORD
 ELEM:CHAR;
 NEXT:ZV
 END;
VAR
 VLAN, VSLOV:ZV;
 SYM:CHAR;
 PROCEDURE VUDAL(LANKA:ZV);
 VAR
 Q:ZV;
BEGIN
 Q:=LANKA^.NEXT;
 LANKA^.NEXT:=LANKA^.NEXT^.NEXT;
 DISPOSE(Q)
END;
 BEGIN
 NEW(VSLOV);
 VSLOV^.NEXT:=NIL;
 VLAN:=VSLOV;
 WRITELN(’????I?? ??????? ?? ??????’);
 REPEAT
 READ(SYM);
 VSTAV(VLAN,SYM);
 VLAN:=VLAN^.NEXT
 UNTIL SYM=’.’;
 {???I? ??????}
 WRITELN(’??????????? ?????’);
 
 VLAN:=VSLOV;
 VLAN:=VLAN^.NEXT;
 WHILE VLAN^.NEXT<>NIL DO
 BEGIN
 WRITE(VLAN^.ELEM);
 VLAN:=VLAN^.NEXT;
 END;
 WRITELN;
 VLAN:=VSLOV; 136
 VLAN:=VLAN^.NEXT;
 REPEAT
 
 IF VLAN^.ELEM=MIL THEN
 VYDAL(VLAN^.PRIV);
 VYDAL(VLAN^.PRIV^.PRIV);

 WRITELN(’РЕЗУЛЬТУЮЧИЙ РЯДОК’);
 VLAN:=VSLOV;
 VLAN:=VLAN^.NEXT;
 REPEAT
 WRITE(VLAN^.ELEM);
 VLAN:=VLAN^.NEXT
 UNTIL VLAN=NIL;
 WRITELN;
END.
Катя Миронова вне форума Ответить с цитированием
Старый 06.06.2013, 19:30   #2
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Катя Миронова,
1) хотелось бы видеть полный код программы, т.к. процедуру VSTAV я не нашёл, а она вызывается.
2) в коде, приведённом выше, реализован обычный список, а не кольцевой и не двунаправленный.
3) описана процедура VUDAL, а вызываете VYDAL
4) MIL вместо nil... Вы код взяли из книжки и распознали в FineReader-e?
zetrix вне форума Ответить с цитированием
Старый 06.06.2013, 19:47   #3
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Катя Миронова Посмотреть сообщение
Нужно создать кольцевой двунаправленный список и удалить два последних элемента.
Над Вами кто-то подшутил:
Список потому и называется кольцевым, что в нем нет ни первых, ни последних элементов.
s-andriano вне форума Ответить с цитированием
Старый 06.06.2013, 19:55   #4
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

s-andriano, кхе-кхе :-)

Разновидностью связных списков является кольцевой (циклический, замкнутый) список. Он тоже может быть односвязным или двусвязным. Последний элемент кольцевого списка содержит указатель на первый, а первый (в случае двусвязного списка) — на последний.
ссылка

У этого списка есть первый и последний элемент по определению.
zetrix вне форума Ответить с цитированием
Старый 06.06.2013, 20:16   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

И как искать у кольцевого списка эти начало и конец?
s-andriano вне форума Ответить с цитированием
Старый 06.06.2013, 20:37   #6
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

На рисунке как раз нарисовано (верхняя левая стрелка), отдельно храним указатель на начало (пусть будет HEAD).
А конец находим просто. Переходим по указателю HEAD к элементу списка, затем:
если список двунаправленный, бежим к предыдущему;
если список обычный (односвязный), пробегаем список до тех пор, пока адрес следующего не равен HEAD, тогда текущий и будет концом.
zetrix вне форума Ответить с цитированием
Старый 06.06.2013, 21:30   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Минуточку.
HEAD в кольцевом списке хранит не начало, а текущий элемент. Это далеко не одно и то же.

Пусть у нас есть список.
Предположим, что у списка есть начало.
Раз оно есть, оно где-то расположено и в нем записано вполне определенное значение.
Прокрутим список на несколько элементов в любую сторону.
Ответьте на вопрос: это тот же самый список или другой?
Если тот же самый, то и начало у него должно быть то же самое.
Если другой, то как он, - с теми же самыми элементами и с тем же самым размещением в памяти, а также привязанный к тому же самому HEAD, вдруг стал другим?

То, что Вы назвали определением, на самом деле не определение, а пояснение, как создавать такой список, и в качестве строгого определения, из которого можно получать строгие следствия (типа существования начала и конца), использовано быть не может.
Начало и конец у него были в процессе построения, пока мы не замкнули его в кольцо. После замыкания в кольцо они исчезли. Как исчезла необходимость отдельно хранить "начало", отдельно - "бегунок".
s-andriano вне форума Ответить с цитированием
Старый 06.06.2013, 21:41   #8
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

>Ответьте на вопрос: это тот же самый список или другой?
>Если тот же самый, то и начало у него должно быть то же самое.
Тот же самый. Начало тоже самое.

Верно, я ссылаюсь на определение "список", а написал лишь пояснение. По логике в списке начало и конец определяются по ходу добавления и удаления элементов. Ну а по связности и сути - да, у кольца нет ни начала, ни конца.
zetrix вне форума Ответить с цитированием
Старый 06.06.2013, 21:53   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от zetrix Посмотреть сообщение
>Ответьте на вопрос: это тот же самый список или другой?
>Если тот же самый, то и начало у него должно быть то же самое.
Тот же самый. Начало тоже самое.

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

Тогда вернемся к исходному вопросу:
Был список, предположим, у него есть определенное начало, его немножко покрутили (на сколько элементов - неизвестно), как найти это начало?
s-andriano вне форума Ответить с цитированием
Старый 07.06.2013, 20:28   #10
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Цитата:
его немножко покрутили (на сколько элементов - неизвестно), как найти это начало?
Если изначально мы не сохранили где-то указатель на начало, то никак не найти.
zetrix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление своих объектов в Добавление своих объектов в двунаправленный кольцевой список voidmain C# (си шарп) 3 21.03.2013 13:08
кольцевой двунаправленный список на паскале gerda_best92 Помощь студентам 4 21.06.2011 19:50
Кольцевой двунаправленный список. ООП. Purr Помощь студентам 5 30.11.2010 08:48
Паскаль,Кольцевой двунаправленый список enigma22 Помощь студентам 2 17.06.2010 01:47
Реализовать кольцевой двунаправленный список s20 Помощь студентам 3 19.10.2009 16:58