访问冲突 - 无法写入位置

时间:2012-03-26 07:36:07

标签: c++ templates

我正在尝试为链表编写代码但是当我尝试添加节点时,代码会在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);
}

2 个答案:

答案 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或重新考虑你的逻辑。