使用类的链表
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 的快速响应。我删除了删除语句。但是,我仍然面临着我之前的问题。以上是关于使用类的链表的主要内容,如果未能解决你的问题,请参考以下文章