6.6.5 检测链表是否为空

在实际编程中,我们经常要判断一个链表是否为空,list.h中有相应的函数list_empty()和list_empty_careful(),通过调用这两个函数就可以实现相应的判断操作,这两个函数的实现如下:


static inline int list_empty(const struct list_head*head)

{

return head->next==head;

}

static inline int list_empty_careful(const struct list_head*head)

{

struct list_head*next=head->next;

return(next==head)&&(next==head->prev);

}


list_empty()函数和list_empty_careful()函数都是用来检测链表是否为空的,它们之间仅有的区别是第一个函数使用的检测方法是判断表头结点的下一个结点是否是其本身,如果是,则返回true,否则返回false;第二个函数使用的检测方法是判断表头的前一个结点和后一个结点是否为其本身,如果同时满足,则返回false,否则返回值为true。接下来通过一段具体的代码来看如何使用以上函数来判断链表是否为空。


include<stdio.h>

include<stdlib.h>

include"list.h"

typedef struct_stu

{

char name[20];

int num;

struct list_head list;

}stu;

int main()

{

stu*pstu;

stu*tmp_stu;

struct list_head stu_list;

struct list_head*pos;

int i=0;

INIT_LIST_HEAD(&stu_list);

pstu=malloc(sizeof(stu)*5);

for(i=0;i<5;i++)

{

sprintf(pstu[i].name,"Stu%d",i+1);

pstu[i].num=i+1;

list_add(&(pstu[i].list),&stu_list);

}

list_for_each(pos,&stu_list)

{

tmp_stu=list_entry(pos,stu,list);

printf("student num:%d\tstudent name:%s\n",tmp_stu->num,tmp_stu->name);

}

if(list_empty(&stu_list))

printf("使用list_empty()检测,链表为空\n");

else

printf("使用list_empty()检测,链表非空\n");

if(list_empty_careful(&stu_list))

printf("使用list_empty_careful()检测,链表为空\n");

else

printf("使用list_empty_careful()检测,链表非空\n");

free(pstu);

return 0;

}


运行结果:


root@ubuntu:/home/paixu/dlist_node#./a

student num:5 student name:Stu5

student num:4 student name:Stu4

student num:3 student name:Stu3

student num:2 student name:Stu2

student num:1 student name:Stu1

使用list_empty()检测,链表非空

使用list_empty_careful()检测,链表非空


上面的代码通过list_empty()函数和list_empty_careful()函数实现了对链表是否为空的检测。