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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2017, 15:39   #1
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию [Pascal] сформировать двунаправленный кольцевой список с заголовком, код в теме

Объявлена структура такая
Код:
pList  = ^TList2;
    TList2 = record
                info : integer;
                next : pList;
                prev : pList;
             end;

var
   pFirst, pTemp, pNew : pList;
         r,i,k,n : integer;
Задача была сформировать двунаправленный кольцевой список с заголовком. (элементы списка неважно)

Сделал функцию которая добавляет элементы списка сначала сам
Код:
            pNew^.next := pFirst;
            pNew^.prev := pTemp;
            pNew^.info := i;
            pFirst^.prev := pNew;
            pTemp^.next := pNew;
            pTemp := pNew;
Потом по учебнику
Код:
            pNew^.next := pTemp^.next;
            pNew^.prev := pTemp;
            pNew^.info := i;
            pNew^.next^.prev  := pNew;
            pTemp^.next := pNew;
            pTemp := pNew;
Правильно ли заменить то что выделил красным?
проверил командой пока текущий элемент не равен заголовку ( pTemp <> pFirst) выводить на экран элементы в обоих случаях одно и тоже.
goto ∞ вне форума Ответить с цитированием
Старый 21.06.2017, 16:15   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Сделал функцию которая добавляет элементы списка сначала сам
добавляет куда - в начало списка, в конец?

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Правильно ли заменить то что выделил красным?
код приведён куском, он не полный.
начиная с того, что не видно, что pNew - это указатель на выделенную область памяти (но об этом можно догадаться) и заканчивая тем, что такое pTemp (предполагаю, что это указатель на "хвост" / последний элемент списка.

ну и не вижу проверки на пустой список (добавление элемента в пустой список отличается от добавления в не пустой).

выложите свой код полностью, будет повод для разговора.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2017, 16:28   #3
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Добавляет в конец списка, список сам динамический двунаправленный с заголовком(это важно)
да pTemp указатель на хвост списка, если список пустой он указывает на заголовок
pFirst указатель только на заголовок.

В списке с заголовком поле next заголовка указывает на след элемент то есть на 1 элемент списка, поле prev на последний элемент списка, если их нету то они указывают на сам заголовок
последний элемент списка в поле next указывает на заголовок, получается кольцевой список

Последний раз редактировалось goto ∞; 21.06.2017 в 16:32.
goto ∞ вне форума Ответить с цитированием
Старый 21.06.2017, 16:34   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Добавляет в конец списка,
тогда вот это:

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Код:
pNew^.next := pFirst;
полная чушь.

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

p.s. а ваш код я так и не увидел.

p.p.s. на форуме неоднократно выкладывался рабочий код на Паскале по работе с двухнаправленными списками.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2017, 16:40   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
полная чушь.
Почему? У ТС кольцевой, вот последний и указывает на первый.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.06.2017, 16:46   #6
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
полная чушь.
Ну во первых как выше сказали у меня кольцевой список
во вторых вопрос был в том правильно ли заменить
pNew^.next := pTemp^.next;
на
pNew^.next := pFirst;
я в этом новичок, но по моему правильно. это одно и то же выраженное по разнмоу
goto ∞ вне форума Ответить с цитированием
Старый 21.06.2017, 17:04   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

да, приношу свои извинения.

последний элемент (pTemp^ ) в поле next указывает на головной элемент.
поэтому pTemp^.next равен pFirst

это одно и то же.

ну и раз мы присвоили pNew^.next := pFirst
тогда
pNew^.next^.prev := pNew;
это тоже самое, что pFirst^.prev := pNew
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.06.2017, 17:09   #8
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Ок, спасибо всем
goto ∞ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
кольцевой двунаправленный список( Паскаль) Катя Миронова Помощь студентам 9 07.06.2013 20:28
кольцевой двунаправленный список на паскале gerda_best92 Помощь студентам 4 21.06.2011 19:50
Кольцевой двунаправленный список. ООП. Purr Помощь студентам 5 30.11.2010 08:48
Реализовать кольцевой двунаправленный список s20 Помощь студентам 3 19.10.2009 16:58