我正在尝试创建一个函数,该函数将创建一个新的链表,并给出指向整数数组的指针。
这是我的代码,更多信息如下:
#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-> next设置为newElement的地址,而不是创建一个与newElement相同的ListNode的新实例并将ptr-> next设置为其。
但是我想避免这种情况,并确保'='符号产生深拷贝,我只需要重载ListNode类中的赋值运算符即可。
此外,恰好在createNewList fn结束之前returnPtr-> val的值为2(我用gdb进行了验证),但是cout语句每次都会打印不同的值,因此它具有某种形式的未定义行为。我不明白原因。
如果我研究发现任何新事物,我会分享。我也可以根据要求提供更多信息。我真的很想了解指针移动的语义,因此链接到其他可能适用的情况或文章将大有帮助:)
感谢您阅读:)任何信息,我们感激不尽!
答案 0 :(得分:1)
您正在堆栈上创建列表元素,因此一旦离开该功能,它们就会消失。
代替
ListNode newElement = ListNode(-1);
尝试
ListNode* newElement = new ListNode(-1);
例如
ListNode* createNewList(int* x, int length) {
if (x == nullptr) return x;
ListNode* newList = new ListNode(-1);
ListNode* ptr = newList;
int count = 0;
while (count < length) {
ptr->val = *(x + counter);
ListNode* newElement = new ListNode(-1);
ptr->next = newElement;
ptr = ptr->next;
counter++;
}
return newList;
}
这是不必要的
int x [5] = {2, 4, 5, 7, 9};
int* y = x;
//create list: doesn't work.
ListNode* newList = createNewList(y, 5);
您可以直接直接传递x
ListNode* newList = createNewList(x, sizeof(x)/sizeof(*x));
答案 1 :(得分:0)
为什么不
std::list<int> newlist {x, x+length};