6 / 6 / 4
Регистрация: 09.10.2016
Сообщений: 54
1

Указатели. Двусвязный список

06.06.2017, 20:16. Показов 2365. Ответов 9
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct Link {
    string value;
    Link *prev;
    Link *succ;
    Link (const string &v) :value(v), prev(0),succ(0){}
};
 
Link *insert(Link *p, Link *n)      //Вставляет n перед p; воздвращает n
{
    if (n == 0) return p;
    if (p == 0) return n;
    n->succ = p;                        //p следует после n
    if (p->prev) p->prev->succ = n;     
    n->prev = p->prev;                  //предшественник p становится предшественником n
    p->prev = n;                        //n становится предшественником p
    return n;
}
Собственно, есть фрагмент кода в котором мне непонятна одна строка. Точнее, как работает эта строка.
C++
1
if (p->prev) p->prev->succ = n;
Я так понимаю, что условие проверяет на ненулевой указатель?
А что происходит после условия, конкретно вот этот фрагмент:
C++
1
p->prev->succ = n;
?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2017, 20:16
Ответы с готовыми решениями:

Отсортировать двусвязный список через указатели
До последнего пытался решить полностью задачу сам, но никак не могу отсортировать элементы в...

Переделать двусвязный список в двусвязный кольцевой
Здравствуйте, у меня єсть двусвязный список однако он не кольцевой! как это запрограммировать? и...

Сформировать список из 10 работников, используя динамическую структуру данных двусвязный список
спасайте Сформировать список из 10 работников, используя динамическую структуру данных...

Двусвязный список (в конец двусвязного списка добавить другой список)
здравствуйте, подскажите пожалуйста, как в конец двусвязного списка добавить другой список?

9
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
06.06.2017, 20:27 2
Цитата Сообщение от FunProgrammer Посмотреть сообщение
Я так понимаю, что условие проверяет на ненулевой указатель?
Если перед p есть элемент, взять этот элемент и вписать что после него идет n.
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
06.06.2017, 20:38 3
Цитата Сообщение от FunProgrammer Посмотреть сообщение
Двусвязный список
Лучший способ строить 2-х связный список - это строить циклический (без NULL) 2-х связный список, как это сделали везде в ядре Linux после ядра 2.6.
Меня удивляет, что студентов всё снова и снова обучают такому идиотизму, как список с NULL на концах.
Поэтому лучший способ - взять файл исходного кода из открытых кодов ядра Linux - list.orig.h (и не заниматься этим идиотизмом).
Упрощённый вариант: list.h
Тест использования, пример: dlink.cc
1
6 / 6 / 4
Регистрация: 09.10.2016
Сообщений: 54
06.06.2017, 20:38  [ТС] 4
Цитата Сообщение от Renji Посмотреть сообщение
Если перед p есть элемент, взять этот элемент и вписать что после него идет n
А, понял, p->prev->succ=n;
Он входит в "прошлую структуру" (p->prev) и меняет в ней succ (prev->succ) на n. Верно?
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
06.06.2017, 20:43 5
Цитата Сообщение от FunProgrammer Посмотреть сообщение
Он входит в "прошлую структуру" (p->prev) и меняет в ней succ на n. Верно?
Да.

Добавлено через 4 минуты
Цитата Сообщение от Olej Посмотреть сообщение
Меня удивляет, что студентов всё снова и снова обучают такому идиотизму, как список с NULL на концах.
Если делать дубово, то элемент-заголовок будет держать место под никем не используемое value. Если выделить просто узел списка который будет заголовком и узел с value который наследник от "просто узла", то "вы наследование еще не проходили".

Хотя, скорее преподы банально не занимаются самообразованием и методички не обновляли со времен перфолент. Так то кольцевой список еще у Кнута описывался.
1
6 / 6 / 4
Регистрация: 09.10.2016
Сообщений: 54
06.06.2017, 20:45  [ТС] 6
А в каких случаях эти условия будут истинны? Это какой экземпляр структуры можно передать в функцию, чтобы её адрес был нулевым?
C++
1
2
 if (n == 0) return p;
if (p == 0) return n;
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
06.06.2017, 20:47 7
Цитата Сообщение от FunProgrammer Посмотреть сообщение
А в каких случаях эти условия будут истинны?
В случае "отдельный класс-список ниасилил". p==0 должно изображать вставку в пустой список.
1
6 / 6 / 4
Регистрация: 09.10.2016
Сообщений: 54
06.06.2017, 20:54  [ТС] 8
Цитата Сообщение от Renji Посмотреть сообщение
Хотя, скорее преподы банально не занимаются самообразованием и методички не обновляли со времен перфолент. Так то кольцевой список еще у Кнута описывался.
Да не, это я книгу Страуструпа "Принципы и практика использования С++" осваиваю

Добавлено через 5 минут
Цитата Сообщение от Renji Посмотреть сообщение
Хотя, скорее преподы банально не занимаются самообразованием и методички не обновляли со времен перфолент. Так то кольцевой список еще у Кнута описывался.
Да не, это я книгу Страуструпа "Принципы и практика использования С++" осваиваю
Цитата Сообщение от Renji Посмотреть сообщение
В случае "отдельный класс-список ниасилил". p==0 должно изображать вставку в пустой список.
Можно подробнее? К примеру, фрагмент вызова этой функции такой, чтобы одно из этих условий сработало внутри функции?
0
2753 / 1908 / 568
Регистрация: 05.06.2014
Сообщений: 5,559
06.06.2017, 21:05 9
Лучший ответ Сообщение было отмечено FunProgrammer как решение

Решение

Цитата Сообщение от FunProgrammer Посмотреть сообщение
Можно подробнее? К примеру, фрагмент вызова этой функции такой, чтобы одно из этих условий сработало внутри функции?
Подробнее тут.

Добавлено через 7 минут
Цитата Сообщение от FunProgrammer Посмотреть сообщение
Можно подробнее? К примеру, фрагмент вызова этой функции такой, чтобы одно из этих условий сработало внутри функции?
UPD А, тьфу-ты, перепутал. Подробнее:
C++
1
2
Link*list=nullptr;//типа, пустой список
list=insert(list,some_object);//вставили в список какой-то объект
1
6 / 6 / 4
Регистрация: 09.10.2016
Сообщений: 54
06.06.2017, 21:10  [ТС] 10
Ясно, спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2017, 21:10
Помогаю со студенческими работами здесь

Составить двусвязный список на основе класса, объекты которого будут формировать этот список
Составить двусвязный список на основе класса, объекты которого будут формировать этот список. В...

Заменить массив структур на односвязный список, и на двусвязный список
Взять текст задания и заменить массив структур на односвязный список, и на двусвязный список ...

Создать двусвязный список групп факультета, где каждая группа представляет собой односвязный список студентов
Задание: создайте двусвязный список групп факультета. Каждая группа представляет собой односвязный...

Преобразовать односвязный список в двусвязный список
Доброго времени суток! Помогите, пожалуйста, преобразовать программу из односвязного списка в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru