[英]How to check if a linked list is empty in C
我有这段代码:我尝试初始化一个指针,然后使用它检查我的列表是否为空
#include <stdio.h>
#include <stdlib.h>
typedef long T;
typedef struct SortedList {
T value;
struct SortedList* next;
} SortedList;
void init(SortedList** list)
{
list = (SortedList **) malloc (sizeof(SortedList*));
list=NULL;
printf("%p\n", list);
}
void isEmpty(SortedList** list)
{
printf("%p\n", list);
if(list == NULL) printf("List is empty\n");
}
int main()
{
SortedList **list;
init(list);
printf("Initialization with succes\n");
isEmpty(list);
return 0;
}
但是我得到这个输出,我不明白为什么:
(nil)
Initialization with succes
0x2
首先,您不需要双指针。 在此,使用NULL
初始化很重要。 (表示空白列表)。
SortedList *list = NULL;
这样做的好处是,现在,如果您要对其进行更改,则可以通过它的地址。
func(&list);
并且检查空列表将是
void func(SortedList **list){
if( *list == NULL )
/* empty */
}
这通常是列表的实现方式。
在您的情况下,您只分配了一个局部变量,而不是返回内存地址,而是使用NULL
覆盖了指针的值-代码中存在内存泄漏。
与您的代码将是类似 。 是的,初始化所做的只是将其分配给NULL
。 这是检查NULL
一种简便方法。 从一开始就使其为NULL
基本上表示列表为空(通常是这种情况)。
list
是一个指向指针的指针。 实际列表位于其指向的值中,因此您需要取消引用它。
空列表只是一个空指针,因此您不需要在init()
分配任何内容。
void init(SortedList** list)
{
*list=NULL;
printf("%p\n", *list);
}
void isEmpty(SortedList** list)
{
printf("%p\n", *list);
if(*list == NULL) printf("List is empty\n");]
}
在main
函数中,不需要双指针,您可以使用&
(address-of)运算符获取指针变量的地址。
int main()
{
SortedList *list;
init(&list);
printf("Initialization with succes\n");
isEmpty(&list);
return 0;
}
您实际上只需要用于修改列表的函数的双指针即可。 因此,您可以为isEmpty
使用普通的指针:
void isEmpty(SortedList* list)
{
printf("%p\n", list);
if(list == NULL) printf("List is empty\n");]
}
然后将其称为:
isEmpty(list);
但是在所有功能之间保持一致可能是最简单的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.