Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371830
  • 博文数量: 47
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 1290
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-25 16:14
文章分类

全部博文(47)

文章存档

2019年(1)

2014年(1)

2013年(9)

2012年(36)

分类: LINUX

2012-08-22 11:39:24

    我们前面分析了list.h中的函数,我们可以把内核态的链表用于到用户态下,以后写代码时就方便多了。下面我们具体看一个例子,我们定义一个学生的结构体:
  struct stu {
int num;
char name[20];
struct list_head list;     //调用了list.h中的结构体
};
 下面这段代码是创建head2链表,调用了list.h中的list_add_tail()函数,这样比我们手动的添加方便多了。


  1.     list_node = (struct stu *)malloc(sizeof(struct stu));
  2.     list_node->num = 4;
  3.     strcpy(list_node->name,"xiaoli");
  4.     list_add_tail(&list_node->list,&head2->list);
  5.     list_node = (struct stu *)malloc(sizeof(struct stu));
  6.     list_node->num = 5;
  7.     strcpy(list_node->name,"xiaozhang");
  8.     list_add_tail(&list_node->list,&head2->list);
下面这段代码是遍历我们自己创建的链表,用到了list_for_each()和list_entry()函数。


  1. if (list_empty(&head1->list)) {
  2.         printf("list is empty!\n");
  3.     } else {    
  4.         list_for_each(pos,&head2->list) {
  5.             pnode = list_entry(pos,struct stu,list);
  6.             printf("num:%d,name %s\n",pnode->num,pnode->name);    
  7.         }
  8.     }
下面这段代码实现的是对某一结点的删除,使用了list_del_init()函数:


  1. list_for_each_safe(pos,n,&head1->list) {
  2.      pnode = list_entry(pos,struct stu,list);
  3.      if(pnode->num==1)
  4.      {
  5.      list_del_init(pos);
  6.      printf("name %s is delete\n",pnode->name);    
  7.      free(pnode);
  8.      }
  9.      }
  还有很多对链表的实现都可以运用到用户态下,大家可以下去尝试一下!
阅读(2388) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~