繁体   English   中英

如何检查链接列表在C中是否为空

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM