Я пытаюсь создать функцию, которая создаст новый связанный список с указателем на массив целых чисел.
Вот мой код, более подробная информация ниже:
#include "iostream"
using namespace std;
//Definition for singly-linked list.
struct ListNode {
//members
int val;
ListNode *next;
//constructor
ListNode(int x) : val(x), next(NULL) {}
//overload assignment operator
void operator=(const ListNode &right_list ) {
val = right_list.val;
next = right_list.next;
}
};
//error here:
//creating new linked list
ListNode* createNewList(int* x, int length) {
if (*x == NULL) return NULL;
ListNode newList = ListNode(-1);
ListNode* ptr = &newList;
int count = 0;
while (count < length) {
ptr->val = *(x + counter);
ListNode newElement = ListNode(-1);
ptr->next = &newElement;
ptr = ptr->next;
counter++;
}
ListNode* returnPtr = &newList;
return returnPtr;
}
int main() {
//create List contents
int x [5] = {2, 4, 5, 7, 9};
int* y = x;
//create list: doesn't work.
ListNode* newList = createNewList(y, 5);
cout << "debug test: neList first val is " << newList->val << endl;
return 0;
}
С помощью GDB я обнаружил, что ошибка в строке:
ptr-> next = & newElement;
После цикла while в списке есть элементы {2, -1, -1, -1-1Я полагаю, что это потому, что я просто устанавливаю ptr-> рядом с адресом newElement вместо создания нового экземпляра ListNode, идентичного newElement, и устанавливаю ptr-> рядом с ним.
Но я подумалчтобы избежать этого и убедиться, что знак '=' создает глубокую копию, мне просто нужно перегрузить оператор присваивания в классе ListNode, что я и сделал.
Кроме того, значение returnPtr-> val прямо перед концом createNewList fn равно 2 (я проверял это с помощью gdb), но оператор cout печатает разные значения каждый раз, поэтому его некоторая форма не определенаповедение.Я не понимаю причину.
Если я найду что-то новое и найду что-нибудь новое, я поделюсь.Также я могу дать больше информации по запросу.Я действительно хочу понять семантику перемещения указателя, поэтому ссылки на другие ситуации, которые могут быть применимы, или статьи будут иметь большое значение:)
Спасибо за чтение :) любая информация приветствуется!