双向循环链表c语言源码,C语言双向循环链表api(源自gluster源码)

C语言双向循环链表api(源自gluster源码),基本的操作如增加、删除和遍历等。

#include

#include

#include

/*定义表头*/

struct list_head {

struct list_head *next;

struct list_head *prev;

};

/*表头初始化*/

#define INIT_LIST_HEAD(head) do {          \

(head)->next = (head)->prev = head; \

} while (0)

/*增加*/

static inline void

list_add (struct list_head *new, struct list_head *head)

{

new->prev = head;

new->next = head->next;

new->prev->next = new;

new->next->prev = new;

}

/*删除*/

static inline void

list_del (struct list_head *old)

{

old->prev->next = old->next;

old->next->prev = old->prev;

old->next = (void *)0xbabebabe;

old->prev = (void *)0xcafecafe;

}

/*判断链表是否为空*/

static inline int

list_empty (struct list_head *head)

{

return (head->next == head);

}

#define list_entry(ptr, type, member)                  \

((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

#define list_for_each(pos, head)                                        \

for (pos = (head)->next; pos != (head); pos = pos->next)

/*遍历,关于list_for_each_entry,百度*/

#define list_for_each_entry(pos, head, member)              \

for (pos = list_entry((head)->next, typeof(*pos), member);  \

&pos->member != (head);                    \

pos = list_entry(pos->member.next, typeof(*pos), member))

/*例:先定义一个结构体*/

typedef struct student

{

int num;        //学号

int score;      //分数

char name[20];

struct list_head student_list;

}STU;

STU *head=NULL;

int main(void)

{

STU *new=NULL;

new = (STU *)malloc(sizeof(STU));

bzero(new, sizeof(STU));

new->num = 8;

new->score = 8;

strcpy(new->name, "8888");

/*链表初始化*/

if(head == NULL)

{

// head = (STU *)malloc(sizeof(STU));

// bzero(head, sizeof(STU));

head = new;

INIT_LIST_HEAD(&head->student_list);

}

else

{

list_add(&new->student_list, &head->student_list);

}

if(list_empty(&head->student_list))

{

printf("list only head\n");

printf("head->num:%d, score:%d, name:%s\n", head->num, head->score, head->name);

}

/*将新成员插入链表*/

int i;

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

{

new = (STU *)malloc(sizeof(STU));

bzero(new, sizeof(STU));

new->num = i;

new->score = i+1;

strcpy(new->name, "2233");

list_add(&new->student_list, &head->student_list);

}

/*删除指定的成员*/

STU *pos=NULL;

list_for_each_entry(pos, &head->student_list, student_list)

{

if(pos->num == 2){

list_del(&pos->student_list);

free(pos);

pos = NULL;

break;

// printf("num:%d, score:%d, name:%s\n", pos->num, pos->score, pos->name);

}

}

/*遍历链表*/

list_for_each_entry(pos, &head->student_list, student_list)

{

printf("num:%d, score:%d, name:%s\n", pos->num, pos->score, pos->name);

}

return 0;

}

示例输出:

list only head

head->num:8, score:8, name:8888

num:4, score:5, name:2233

num:3, score:4, name:2233

num:1, score:2, name:2233

num:0, score:1, name:2233

截图:

ae4358ed584cf5db49a85905c6415f29.png

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值