【问题标题】:accessing null pointers to check if linked list is empty in C++ [closed]访问空指针以检查 C++ 中的链表是否为空 [关闭]
【发布时间】:2017-10-06 14:59:53
【问题描述】:

我正在学习使用 C++ 的数据结构课程,我们应该实现一个简单的单链表结构。

我已经找到了所有其他方法,但是当我检查列表是否为空时,程序崩溃,导致分段错误。

当列表为空时,我的链表结构应该如下所示:

HEAD -> NULL

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

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

我的 isListEmpty() 看起来像:

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

我很确定当我尝试访问空指针时核心被转储了,但我不确定在哪里。关于我应该在哪里看的任何建议?

谢谢。

--已编辑--

对不起,我不够清楚。

我很确定 head 本身不是空指针,因为在检查我的代码是否有效时,我使用了类似的东西:

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.

【问题讨论】:

  • 您是否考虑过head 可能是NULL 的可能性?无论如何,要么学习使用调试器,要么给我们提供minimal reproducible example
  • 您确定head 不是nullptr 的空列表吗?这意味着默认构造函数(可能构造一个空列表)创建一个head。也许您打算检查 head 是否为 nullptr 以获得空列表。
  • 您的插入和删除函数调用并不能确保head 不为空,您可能在函数内部添加或删除了错误的链接。将你的函数更改为head == null 进行测试。

标签: c++ data-structures linked-list segmentation-fault null-pointer


【解决方案1】:

大多数时候,在空列表中headnull,而不是next

仔细查看初始化并决定是否需要检查headnext 以获取nullity。

【讨论】:

  • 感谢您的回答。但是我们被告知要以这种方式实现它,以便始终存在一个名为“head”的元素,并且它将指向链表的第一个元素。
  • @정진하 你可以有一个始终存在的head,但如果没有第一个元素,那么head 就是NULL
  • @tobi303 哇,我太傻了,谢谢。我还在学习使用 gdb,我想这应该可以帮助我少问这些问题。非常感谢!
【解决方案2】:

Head 是跟踪链表第一个节点的指针。如果 list 为空,则 head 应指向 null。

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

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

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

【讨论】:

  • Head 不必是列表中的一个项目,可以简单地用于跟踪列表,这取决于它的编程方式。虽然我同意他需要检查 head 是否为空。
  • 是的,头部只是一个锚点。在最简单的实现中,它只是一个用于跟踪的指针。还可以实现一个头节点,它永远不会为 NULL,并保存有关列表的元数据(如 - 大小、节点数、访问时间等)和指向第一个数据节点的指针。
【解决方案3】:

据我了解,即使您应该有一个单独的头节点,每次列表为空时它都会为空。

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

示例:

列表:A->B->C->...->Z->null 在这种情况下,您的头将指向 A。(而是您的 HEAD 将是 A。例如 head = A)

LIST: null (head = null)

【讨论】:

  • 如果头节点是独立的,那么通常它不应该为空,至少根据我的经验。它可以是一个单独的类,其中包含有关列表的数据,也可以是一个未使用的列表项,它只是用 next 指向列表的开头。 Null 意味着它只是指向第一项的指针,而不是单独的头节点。
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多