如何检查链表是否为空

时间:2013-12-06 07:41:08

标签: c linked-list

我是C的新手并且有一个问题。

如何检查链表是否为空?

我有一个struct _node

typedef struct _node{
    int data;
    struct _node *next;
}node;

如果我初始化了node *list,但没有对它做任何事情(即没有给list->data赋值),我该怎么检查它是否为空?

我尝试if (node == NULL){break}但没有效果。

感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

<强>说明:

通常有两种方法可以使用链接列表:使用根元素而不使用。

如果没有root,当列表为空时,列表指针为NULL:

node *list;
...
if (list == NULL) { /* empty list */ }

使用root,总有一个元素。但它可以以两种方式使用:

要么只提供指向第一个元素的指针。

node *root;
...
if (root->next == NULL) { /* empty list */ }

或者让最后一个元素链接回根以形成一个循环。这个概念的优点是“next”元素永远不会为NULL,因此您无需检查它。在这种情况下,如果根指向自身,则列表为空。

node *root;
...
if (root->next == root) { /* empty list */ }

<强>答案:

现在,根据您的描述,您已经分配了一个节点。这或者意味着你想要“根”方法(第二或第三个例子)。但是,如果您想使用第一个变体,则不得分配节点,因为它不包含数据。

对于“root”方法,您确实有一个(且只有一个)节点不保存数据。但是对于简单的链表,所有节点都必须包含数据。

答案 1 :(得分:1)

我保持简单。

检查头指针 - 如果它是NULL,则列表中没有条目。

int isEmpty( node * list )
 {
   if( !list )
      return 1;
   return 0;
 }

答案 2 :(得分:0)

有时,当您创建变量时,C会将所有数据归零。其他时候,变量将包含垃圾。您需要了解管理此规则的规则,但作为初学者,您应该确保始终明确初始化变量。

对于链接列表,当您将节点附加到列表时,应始终确保将NULL设置为next指针,以便正确终止列表。

你的链表应该有一个“头”指针。如果头部设置为NULL,那么你有一个零长度的链表;如果头部具有NULL以外的任何值,则链接列表中必须至少有一个节点,因此列表的长度必须至少为1。

所以,只要你一直小心地将头指针初始化为NULL,你可以通过检查头指针是否为NULL来轻松地判断列表是否为空。

但你的问题实际上是data成员变量。那里总会有某种价值。正如我所说,有时C会为你设置为零,但有时候它将是不可预测的垃圾(一个值可以是任何整数值)。分配新节点时,需要将其初始化为合理的默认值。例如,data的有效值可能都大于零,因此您可以将data设置为零以指示它当前为空。

您可以编写一个遍历链表的简单循环并检查每个data成员,如果发现任何非{0}的data(或任何未使用的特殊值标志),则返回true )。如果它只找到默认值data或列表长度为零,则应该返回false。

答案 3 :(得分:-1)

构建链接列表时,最好有一个标头节点。然后,您可以添加节点以构建列表。让列表变量成为您的标题节点。然后检查链表是否为空,请使用:

typedef struct _node{
    int data;
    struct _node *next;
}*node;

然后实例化

node list;

检查链表是否为空使用

if((list->next)==null)
{
         break;
}