访问空指针来检查C++中的链表是否为空

问题描述:

我正在使用C++进行数据结构课程,我们应该实现一个简单的单链表结构。访问空指针来检查C++中的链表是否为空

我有所有其他的方法,但当我检查列表是否为空时,它实际上,程序崩溃,导致分段错误。

当列表是空的,我的链表结构应该是这样的:

HEAD - > NULL

而如果它不是空的,它应该是这样的:

HEAD - > ...... - > NULL

我isListEmpty()看起来像:

bool singleList::isListEmpty(void) { 
    return (head->next == NULL); 
} 

我敢肯定,当我尝试访问一个空指针时转储核心,但我不知道在哪里。任何建议我应该看什么?

谢谢。

- 编辑 -

对不起,我还不够清楚。

我敢肯定头本身是不是一个空指针,因为在检查,如果我的代码工作,我喜欢的东西的工作:

list.list_insert_front(guy1); 
list.list_insert_front(guy2); 
list.list_remove(guy1); 
list.list_remove(guy2); 
list.isListEmpty(); //This line causes segmentation fault. 
+5

您是否考虑过'head'可能是NULL的可能性?无论如何,要么学着使用调试器,要么给我们提供[mcve]。 – YSC

+0

你确定'head'不是'nullptr'的空列表吗?这意味着默认的构造函数(可能构造一个空列表)创建一个“头”。也许你打算检查'head'是否为空列表的'nullptr'。 –

+0

您的插入和删除函数调用并不能确保'head'不为空,您可能会添加或删除函数内部的错误链接。将你的函数改为'head == null'来测试它。 – Confuzing

大部分的时间,在一个空列表headnull ,而不是它的next

看看两次初始化,并决定是否需要检查head或它的nextnull性。

+0

感谢您的回答。但是我们被告知要这样实现它,这样一个名为“head”的元素将永远存在,并且它将指向链表的第一个元素。 –

+0

@정진하你可以拥有一个总是存在的头部,但是如果没有第一个元素,那么'head'是'NULL' – user463035818

+0

@ tobi303哇,我真是太愚蠢了,谢谢。我还在学习使用gdb,我想这应该可以帮助我减少这些问题。非常感谢! –

Head是保持列表的第一个节点的轨道的指针。如果列表为空,则头应该指向空值。

当您尝试访问head-> next时,间接检查是否存在第一个节点(第二个节点)的下一个。

要查找列表是否为空,您需要检查头是否为NULL。

bool singleList::isListEmpty(void) { 
    return (head == NULL); 
} 
+0

头部不必是列表中的项目,可以简单地用于跟踪列表,取决于如何编程。虽然我同意他需要检查头是否为空。 – Confuzing

+0

是的,头只是一个定位点。在最简单的实现中,它只是一个跟踪指针。我们也可以实现一个头节点,它永远不会为NULL,并保存关于列表的元数据(如大小,节点数,访问时间等)和指向第一个数据节点的指针。 – nyemul

据我所知,即使你应该有一个单独的头节点,它将在每次列表为空时为空。

如果列表不为空,它只会指向列表的第一个节点。

例如:

LIST:A-> B->Ç - > ...-> Z->空 在这种情况下你的头将指向A.(相反的HEAD将是例如A.头= A)

LIST:null(head = null)

+0

如果头节点是独立的,那么通常它不应该是空的,至少在我的经验中是这样。它可以是一个单独的类,其中包含有关列表的数据或未使用的列表项,它们只是指向下一个列表的开始。 Null意味着它只是指向第一个项目的指针,而不是单独的头节点。 – Confuzing