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