Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2116727
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-11-18 16:34:15

1.链表的初始化
  1. #define INIT_LIST_HEAD(ptr) do { \
  2.     (ptr)->next = (ptr); (ptr)->prev = (ptr); \
  3. } while (0)
初始化后形成一个带头结点的链表,如下所示

1.1 判断链表是否为空
  1. static __inline__ int list_empty(struct list_head *head)
  2. {
  3.     return head->next == head;
  4. }
由head->next是不是指向head本身来判断链表是不是为空

2.链表的插入
2.1 有两种方式进行链表的插入 list_add与list_add_tail
  1. static __inline__ void list_add(struct list_head *new, struct list_head *head)
  2. {
  3.     __list_add(new, head, head->next);
  4. }
下面是list_add插入结点:注意这儿不需要malloc,结点指针必须在其它地方分配好

2.2 list_add_tail
  1. static __inline__ void list_add_tail(struct list_head *new, struct list_head *head)
  2. {
  3.     __list_add(new, head->prev, head);
  4. }
下面是list_add_tail插入结点:注意这儿不需要malloc,结点指针必须在其它地方分配好

2.3 他们都调用了__list_add进入指针的操作
  1. static __inline__ void __list_add(struct list_head * new,
  2.     struct list_head * prev,
  3.     struct list_head * next)
  4. {
  5.     next->prev = new;
  6.     new->next = next;
  7.     new->prev = prev;
  8.     prev->next = new;
  9. }
3.链表的删除
3.1 调用list_del进行结点的删除,注意参数entry就是要删除的结点,
  1. static __inline__ void list_del(struct list_head *entry)
  2. {
  3.     __list_del(entry->prev, entry->next);
  4. }
例如要删除node2,则参数entry=node2,list_del分别修改node3与node1的next与prev指针把node2从链表中删除

虽然head->next->next 或者head->prev->prev搜索链表时找不到node2了,表面上看node2是被删掉,
但是node2本身的prev与next还分别指向node3与node1

3.2 调用list_del_init进行结点的安全删除,注意参数entry就是要删除的结点,
并使删除后的node指向自己本身
  1. static __inline__ void list_del_init(struct list_head *entry)
  2. {
  3.     __list_del(entry->prev, entry->next);
  4.     INIT_LIST_HEAD(entry);
  5. }


阅读(1390) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~