这是我的linked list
结构代码。我想使用一个向量来初始化树节点。但是在构造函数中,ptr->next = tem
有错误Exception thrown: write access violation.
ptr was 0xCDCDCDCD.
有人知道原因以及如何纠正它吗?
#include<iostream>
#include<vector>
using namespace std;
struct ListNode {
int val = 0;
ListNode* next = NULL;
ListNode(int val) : val(val){};
ListNode(vector<int> vec) {
if (vec.empty())
return;
val = vec[0];
ListNode* ptr = this;
for (int i = 1; i < vec.size();i++)
{
ptr->next = new ListNode(vec[i]);
ptr = ptr->next;
}
}
};
对于初学者来说,这是一个糟糕的设计。使用向量的元素初始化节点是没有意义的。
它是一个列表,可以由向量的元素而不是节点初始化。
构造函数ListNode
的定义也没有意义。
例如,其数据成员next
未初始化。
ListNode* ptr = next;
所以这个说法
ptr->next = tem;
调用未定义的行为。
已分配节点,然后删除
ListNode* tem = new ListNode(*it);
// ...
delete tem;
那么列表将包含什么?:)
使用这样的 typedef 也是一个坏主意
typedef vector<int>::iterator vit;
它只会使代码的读者感到困惑。
可以按演示程序中显示的方式定义类。当然,您自己需要将类定义与其他构造函数、赋值运算符和析构函数一起追加。
#include <iostream>
#include <vector>
class List
{
protected:
struct Node
{
int val;
Node *next;
} *head = nullptr;
public:
explicit List() = default;
List( const std::vector<int> &v )
{
Node **current = &head;
for ( const auto &value : v )
{
*current = new Node { value, *current };
current = &( *current )->next;
}
}
friend std::ostream & operator <<( std::ostream &, const List & );
};
std::ostream & operator <<( std::ostream &os, const List &list )
{
for ( List::Node *current = list.head; current != nullptr; current = current->next )
{
os << current->val << " -> ";
}
return os << "nullptr";
}
int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List list( v );
std::cout << list << 'n';
}
程序输出为
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> nullptr
由于接受向量的列表的构造函数不是显式的,因此您可以通过以下方式声明列表
List list( { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } );
在第一次迭代中,"next"将未初始化,因此ptr->next不会指向任何有意义的内容,并且可能会导致seg错误。
这不是该方法中唯一的错误。
此外,在调试模式下,某些编译器将特定的位模式放在未初始化的内存中以帮助调试。 0xCDCDCDCD看起来可疑地像这些位模式之一。
您的第一次迭代未正确初始化。
尝试
...
ListNode(vector<int> vec) {
ListNode* ptr = this;
...
它也没有正确对齐列表中的值。 设置this
的值,然后继续使用迭代器
vit it = vec.begin();
val = *it;
for ( ++it; it != vec.end(); it++)
{
ListNode* tem = new ListNode(*it);
ptr->next = tem;
ptr = ptr->next;
}
相反