Каждый раз, когда эти плагины и опции не доступны, я просто использую своего хорошего ol друга блокнот. Контент вставки в блокнот, где это не примет дополнительное форматирование и затем скопирует его назад. Вид hacky, но о хорошо. Это работает!
T val
, который вы создаете, является автоматической переменной. Ваша ошибка заключается в сохранении адреса этой переменной стека.
Вы должны использовать new
для выделения места в куче, как вы подозреваете, но ваш указатель данных должен указывать непосредственно на адрес, возвращаемый новый
.
Ваша ошибка в вашей последней попытке здесь:
valp = &val;
Вы меняете valp
на точку в другом месте (адрес val), когда вы, вероятно, пытаетесь скопировать данные val , а не его адрес.
Я не думаю, что вам следует это делать:
T val = *o;
Поскольку член o
в структуре узла является указателем, а параметр insertFront
также является указателем, ваш инструктор, вероятно, хочет, чтобы вы использовали данный указатель и сохранили его в списке, а не копировали объект и сохраняли указатель на него. Просто сохраните указатель o
, переданный в insertFront
, как член o
узла, и все будет в порядке.
T val = *o;
np->o = &val;
Эта часть подозрительна. Подсказка состоит в том, что память, выделенная в стеке в функции, будет недоступна, когда функция выйдет за пределы области видимости.
Ваш код не соответствует вашему определению узла
- в узле
вы определяете элемент data
, но в вашем коде вместо этого вы используете o
.
В любом случае вам нужно будет сделать два динамических выделения для добавления каждого узла - одно для самого узла, а другое для объект данных, на который он будет указывать. Когда вы выделяете этот объект данных, вы также можете назначить возвращаемое значение из new
непосредственно указателю в вашем узле. Затем вам нужно скопировать объект данных, указатель которого был передан, в только что выделенный вами объект данных, на который указывает указатель в узле.
Вы считают, что полезная нагрузка указателя неудобна. Но, возможно, список предназначен для создания ссылки поверх существующих объектов, например:
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)