Двойные связанные списки в C++

Каждый раз, когда эти плагины и опции не доступны, я просто использую своего хорошего ol друга блокнот. Контент вставки в блокнот, где это не примет дополнительное форматирование и затем скопирует его назад. Вид hacky, но о хорошо. Это работает!

8
задан Bill the Lizard 18 September 2012 в 14:10
поделиться

5 ответов

T val , который вы создаете, является автоматической переменной. Ваша ошибка заключается в сохранении адреса этой переменной стека.

Вы должны использовать new для выделения места в куче, как вы подозреваете, но ваш указатель данных должен указывать непосредственно на адрес, возвращаемый новый .

Ваша ошибка в вашей последней попытке здесь:

valp = &val;

Вы меняете valp на точку в другом месте (адрес val), когда вы, вероятно, пытаетесь скопировать данные val , а не его адрес.

6
ответ дан 5 December 2019 в 17:38
поделиться

Я не думаю, что вам следует это делать:

T val = *o;

Поскольку член o в структуре узла является указателем, а параметр insertFront также является указателем, ваш инструктор, вероятно, хочет, чтобы вы использовали данный указатель и сохранили его в списке, а не копировали объект и сохраняли указатель на него. Просто сохраните указатель o , переданный в insertFront , как член o узла, и все будет в порядке.

4
ответ дан 5 December 2019 в 17:38
поделиться
 T val = *o;

    np->o = &val;

Эта часть подозрительна. Подсказка состоит в том, что память, выделенная в стеке в функции, будет недоступна, когда функция выйдет за пределы области видимости.

0
ответ дан 5 December 2019 в 17:38
поделиться

Ваш код не соответствует вашему определению узла - в узле вы определяете элемент data , но в вашем коде вместо этого вы используете o .

В любом случае вам нужно будет сделать два динамических выделения для добавления каждого узла - одно для самого узла, а другое для объект данных, на который он будет указывать. Когда вы выделяете этот объект данных, вы также можете назначить возвращаемое значение из new непосредственно указателю в вашем узле. Затем вам нужно скопировать объект данных, указатель которого был передан, в только что выделенный вами объект данных, на который указывает указатель в узле.

0
ответ дан 5 December 2019 в 17:38
поделиться

Вы считают, что полезная нагрузка указателя неудобна. Но, возможно, список предназначен для создания ссылки поверх существующих объектов, например:

struct A { int i; };
A as[10] = { 1,2,3,4,5,6,7,8,9,10 };

LinkedList primes_in_my_data;
insertFront( primes_in_my_data, &as[1] );
insertFront( primes_in_my_data, &as[2] );
insertFront( primes_in_my_data, &as[3] );
insertFront( primes_in_my_data, &as[5] );
insertFront( primes_in_my_data, &as[7] );

// now I have a linked list of primes, and caused no extra memory allocation
// (except for the list overhead)
0
ответ дан 5 December 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: