使用类的链表

Posted

技术标签:

【中文标题】使用类的链表【英文标题】:Linked List Using Classes 【发布时间】:2016-02-17 07:16:41 【问题描述】:

我创建了一个链表class VW,并使用函数Build 将节点添加到列表中。但是,当我运行代码来构建我的链表时,Build 函数会引发“访问冲突”错误。该错误是由Build 函数中的调用tmp->NextObj() 引发的。

如果class VW的对象是新创建的并且是第一次调用Build,那么Build函数中的条件if(tmp==NULL)应该为真,因此程序不应该进入@第一次致电Build 期间的987654331@ 部分。我在这里想念什么?你能帮忙吗?

   class VW

    World_Obj *head;
public:
    void Build(...);

;
 void VW::Build(...)
    
        World_Obj *newObj;
        newObj = new World_Obj;
        newObj->SetData(...);
        newObj->SetNext(NULL);

        World_Obj *tmp;
        tmp = this->head;

        if (tmp == NULL)
            this->head = newObj;
        else
        
            while (tmp->NextObj() != NULL)
            
                tmp = tmp->NextObj();
            
            tmp->SetNext(newObj);
        
    

int main()

    VW *g_w;    
    g_w = new VW;

          /* Reading arguments from input file*/

    g_w->Build(...);


【问题讨论】:

创建一个最小的例子,不要使用只包含文本的图片,它们无法被索引和搜索。 您是否尝试在调试器中捕获崩溃以帮助您定位它发生的位置? 是的,该错误是由于在 Build 函数的 else 部分中调用 tmp->NextObj() 引起的。但是,第一次调用 Build 时,head 应该为 null 并且 if 条件应该成立。我不确定我在这里错过了什么。 谢谢乌尔里希。我已根据您的 cmets 更新了问题。 我们怎么知道head应该是一个空指针?您不会在任何地方显示它正在初始化。请创建一个Minimal, Complete, and Verifiable Example 并向我们展示。 【参考方案1】:

问题是 VW 类中缺少构造函数,

VW() head=NULL;

谢谢大家!

【讨论】:

【参考方案2】:

这是一个问题:

tmp = this->head;

...

while (tmp->NextObj() != NULL)

    tmp = tmp->NextObj();

tmp->SetNext(newObj);

...

delete tmp;

当循环结束并执行tmp->SetNext(newObj) 之后,tmp 将指向列表中倒数第二个节点。然后您立即通过删除它来销毁它。

这意味着您的列表现在将在某个地方包含一个不再存在的节点,并且尝试取消引用它会导致未定义的行为并且很可能会导致崩溃。

解决办法就是不删除tmp

【讨论】:

感谢 Joachim 的快速响应。我删除了删除语句。但是,我仍然面临着我之前的问题。

以上是关于使用类的链表的主要内容,如果未能解决你的问题,请参考以下文章

Python 类的链表

使用类的链表中的分段错误。我的方法正确吗?

构造函数和析构函数的链表问题

Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

递归打印类中的链表c ++

基于节点的链表的参数化构造函数