我正在尝试为链表编写代码但是当我尝试添加节点时,代码会在add()函数中的while循环之后立即停留在该行,报告访问冲突错误。怎么了?
#include<iostream>
template <class T>
class linkedlist
{
struct node
{
T data;
node *lp;
}*p;
public:
linkedlist();
void add(T t);
};
template<class T>
void linkedlist<T>::add(T t)
{
node *r,*q;
r = q = p;
while(p!= NULL)
{
q = p;
p = p->lp;
}
q->lp = new node;
q->lp->data = t;
p = r;
}
template<class T>
linkedlist<T>::linkedlist()
{
p = NULL;
}
int main()
{
linkedlist<int> l1;
l1.add(3);
}
答案 0 :(得分:1)
您在构造函数中将p
初始化为NULL
,然后尝试在add
中解除引用(通过q
):
r = q = p;
// the while loop will not be executed as p == NULL
q->lp = new node;
您必须首先初始化p
- 在构造期间(在这种情况下,您的“空”列表不会在物理上为空,因此您必须专门处理此问题,例如在迭代/删除元素时),或者您应add
查看p == null
的情况,并以不同的方式处理。
旁注:p
应该指向你的head元素,因此使用它来遍历add
中的列表,然后恢复其原始值(存储在{{}中也是有风险的1}})。为什么不简单地保持它完好无损,并使用r
进行迭代?错误的机会少了一点。
答案 1 :(得分:0)
您应该在构造函数中初始化节点:
p = new Node;
因为在这里:
while(p!= NULL)
{
q = p;
p = p->lp;
}
q->lp = new node;
p
最初为NULL
,因此q
也将为NULL
,ergo q->lp
会导致未定义的行为以及崩溃。
初始化p
或重新考虑你的逻辑。