0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
1

Указатели, список

21.11.2019, 11:22. Показов 436. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Читаю я Страуструп Б. - Программирование. Принципы и практика с использованием C++ (2е издание)
Дочитал до указателей и не понимаю что тут написано. Бьярне говорит нарисуй, так не понятно. Нарисовал только с 3 раза.
Указатели, список

Все равно не понятно, что тут вообще происходит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct Link {
    string value;
    Link* prev;
    Link* succ;
    Link(const string& v, Link* p = nullptr, Link* s = nullptr)
        : value(v), prev(p), succ(s) {}
};
 
void print_all(Link* p)
{
    cout << "{ ";
    while (p) {
        cout << p->value;
        if (p = p->succ) cout << ", ";
    }
    cout << " }" << endl;
}
 
int main()
{
    Link* norse_gods = new Link{ "Thor",0,0 };
    print_all(norse_gods);
    norse_gods = new Link{ "Odin",0,norse_gods };
    print_all(norse_gods);
    norse_gods->succ->prev = norse_gods;
    print_all(norse_gods);
    norse_gods = new Link{ "Freia",0,norse_gods };
    print_all(norse_gods);
    norse_gods->succ->prev = norse_gods;
    print_all(norse_gods);
}
Указатели, список

Вот так должно быть.

строка 21 (1 на рисунке) все понятно
строка 23 (2 на рисунке) все еще понятно
строка 25 (3 на рисунке) вот тут не понятно, я даже не понимаю зачем она. Ну и дальше конструкция только сложнее становится.
Указатели, список

Убрал
C++
1
norse_gods->succ->prev = norse_gods;
Получилось так же. Зачем она? Без нее будет просто добавляем ко 2 шагу на рисунке прямоугольник с Фрейей выше и левее Одина.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2019, 11:22
Ответы с готовыми решениями:

Указатели. Двусвязный список
struct Link { string value; Link *prev; Link *succ; Link (const string &amp;v) :value(v),...

список (в программе обнуляются указатели на структуры)
здравствуйте помогите найти ошибку, при возврате указателя на структуру из функции в функцию майн...

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

Добавить в список указатели на обьекты произвольных типов
Доброго времени суток, плиз помогите кто чем может ,имеется класс class TGarbageCollector ...

8
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.11.2019, 11:26 2
Цитата Сообщение от EvilingDark Посмотреть сообщение
C++Выделить код
1
norse_gods->succ->prev = norse_gods;
Получилось так же. Зачем она? Без нее будет просто добавляем ко 2 шагу на рисунке прямоугольник с Фрейей выше и левее Одина.
Это двусвязный список. В нём у каждого элемента есть указатели на следующий и предыдущий элемент. Здесь устанавливается указатель на предыдущий элемент при добавлении нового.
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
21.11.2019, 11:31  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это двусвязный список. В нём у каждого элемента есть указатели на следующий и предыдущий элемент. Здесь устанавливается указатель на предыдущий элемент при добавлении нового.
О я знаю что это двусвязный список. Без нее нормально же добавляет. Именно эта строка делает двусвязный список? Если так то мне не понятно каким образом.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.11.2019, 11:36 4
Цитата Сообщение от EvilingDark Посмотреть сообщение
Без нее нормально же добавляет. Именно эта строка делает двусвязный список? Если так то мне не понятно каким образом.
Без неё, т.е. без указателя на предыдущий элемент, это будет односвязный список.
Попробуй убрать эту строку и пробежаться по списку от хвоста к голове.

Добавлено через 2 минуты
Ту добавляешь в голову, у неё, у первого элемента prev == nullptr, нужно сделать, чтобы он указывал на новый элемент
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
21.11.2019, 11:37  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Без неё, т.е. без указателя на предыдущий элемент, это будет односвязный список.
Попробуй убрать эту строку и пробежаться по списку от хвоста к голове.
Я не знаю как заводить машину, но ты говоришь сьездий на ней в магазин.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.11.2019, 11:40 6
Цитата Сообщение от EvilingDark Посмотреть сообщение
Я не знаю как заводить машину, но ты говоришь сьездий на ней в магазин.
На твоих рисунках квадратики должны соединяться двумя стрелками, в одну и другую сторону. Каждый элемент должен присутствовать по одному разу, а не по два
0
474 / 426 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
21.11.2019, 11:46 7
EvilingDark, Вообще нарисовано не очень, особенно для понимания, поэтому ты и не понимаешь суть.
Нарисуй просто блок.
Блок раздели на 3 части:
1. Value - какое-то значение (сначала он nullptr весь (next/prev тоже)).
2. Next - указатель на следующий элемент
3. Prev - указатель на предыдущий элемент.

Дальше мы добавляем элемент, т.к. список пуст, записываем value в первый блок, указатели оставляем нулевые.
Далее добавляем прямо рядом новый блок, с каким-то значением (просто нарисуй его справа, с value = твоему).
Дальше тебе надо 2 эти блока "объединить", то бишь указать как они взаимосвязаны, стрелочками указываешь связь между указателями Next/Prev.

По факту, у тебя будет просто 2 стрелки туда-сюда (у первого элемента Prev - либо нулптр, либо указывает на хвост - если кольцевой список, с next последнего - аналогично, только на голову если кольцо).

Дальше добавляешь 3 блок, проделываешь тоже самое. Увидишь, что всё проще, чем кажется. Остальное уже ложится на руки твои, реализовать этот двусвязный список.
0
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 200
21.11.2019, 17:24  [ТС] 8
C++
1
2
p->prev=nullptr;
if (p->prev) p->prev->succ = n;
Условие будет выполняться?
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.11.2019, 17:26 9
Цитата Сообщение от EvilingDark Посмотреть сообщение
Условие будет выполняться?
Нет
0
21.11.2019, 17:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2019, 17:26
Помогаю со студенческими работами здесь

Указатели, связной список (Linked List) и динамическое выделение памяти
Я вообще не понимаю как сделать. Ребят! Помогите, как сможете! /* Написать связной список...

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать...


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

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

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