簡體   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