使用向量初始化C++中的链表



这是我的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;
}

相反

相关内容

  • 没有找到相关文章

最新更新