我是C的新手并且有一个问题。
如何检查链表是否为空?
我有一个struct _node
typedef struct _node{
int data;
struct _node *next;
}node;
如果我初始化了node *list
,但没有对它做任何事情(即没有给list->data
赋值),我该怎么检查它是否为空?
我尝试if (node == NULL){break}
但没有效果。
感谢您的帮助!
答案 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;
}