C/C++

В чем здесь проблема? Подскажите пж. (структури даних) С++ Спасибо!

Elem* p;
p = new Elem; // 1
p->info = 1; // 2
p->link1 = NULL; // 3
p->link2 = new Elem; // 4
p->link2->info = 2; // 5
p->link2->link1 = new Elem; // 6
p->link2->link1->info = 4; // 7
p->link2->link1 = p; // 8
p->link2->link1->link2 = new Elem; // 9 < Функция останавливается
p->link2->link1->link2->info = 3; // 10 <
p->link2->link1->link2->link1 = p; // 11
p->link2->link1->link2->link1 = p->link2; // 12
p->link2->link1 = p->link1; // 13
   По-моему Вы просто запутали себя… Предлагаю Вам использовать мнемонические имена, чтобы не путаться в них.

   Значит, Вы пытаетесь построить двусвязный список. Если верить строкам // 1, // 2, // 3, // 4, // 5, связь со следующим элементом списка осуществляется через поле link2. Однако, в строке // 6 Вы создаёте ещё один элемент, присваивая его адрес полю link1. Вот здесь Вы и нарушили свою собственную логику!
   Думаю, поле link1 любого элемента списка должно указывать на предыдущий элемент. У Вас это реализовано в строке // 8 .
   Правильный вариант строки // 6 скорее всего такой:

p->link2->link2 = new Elem; // 6

  А теперь посмотрите, к чему приводят следующие две строки:

p->link2->link1 = p; // 8
p->link2->link1->link2 = new Elem; // 9 < Функция останавливается

   Вы теряете прежнее значение p->link2

   ГЕНЕРАЛЬНЫЙ СОВЕТ: вернитесь к изучению теории и постарайтесь понять её правильно.
Viktor
Viktor
16 172
Лучший ответ
Viktor Маленький совет: используйте объявление

const Elem * p = new Elem;

И объявите ещё одну переменную, которая сначала будет равна p, а потом будет указывать на каждый последующий элемент. Но значение указателя p не должно меняться.
Viktor Насчёт мнемонических имён: раз уж Вы используете в качестве имён английские слова, то можете заменить link1 на predecessor (что означает ‘предшественник’), а link2 на successor (что означает ‘последователь’), сократить можно по собственному усмотрению.
Viktor Вот это упрощает всё:

x->successor = new Elem; // создаётся следующий элемент
x->successor->predecessor = x; // cохраняется обратная ссылка
x = x->successor; // а здесь указатель x переставляется на следующий элемент

___________
Такое можно повторять в цикле!
+ тут однозначно есть утечка памяти.
p = new Elem; //ok

p->link2 = new Elem; // ok link2 создался
....
p->link2->link1 = p; // Вы только что сделали кольцевую ссылку
....
p->link2->link1->link2 = new Elem;
но p->link2->link1 = p! соотв. Вы не освобождая памяти от p->link2 снова выделяете память
объясни, что происходит на строчке // 8
+ покажи определение Elem