我们前面分析了list.h中的函数,我们可以把内核态的链表用于到用户态下,以后写代码时就方便多了。下面我们具体看一个例子,我们定义一个学生的结构体:
struct stu {
int num;
char name[20];
struct list_head list; //调用了list.h中的结构体
};
下面这段代码是创建head2链表,调用了list.h中的list_add_tail()函数,这样比我们手动的添加方便多了。
- list_node = (struct stu *)malloc(sizeof(struct stu));
- list_node->num = 4;
- strcpy(list_node->name,"xiaoli");
- list_add_tail(&list_node->list,&head2->list);
- list_node = (struct stu *)malloc(sizeof(struct stu));
- list_node->num = 5;
- strcpy(list_node->name,"xiaozhang");
- list_add_tail(&list_node->list,&head2->list);
下面这段代码是遍历我们自己创建的链表,用到了list_for_each()和list_entry()函数。
- if (list_empty(&head1->list)) {
- printf("list is empty!\n");
- } else {
- list_for_each(pos,&head2->list) {
- pnode = list_entry(pos,struct stu,list);
- printf("num:%d,name %s\n",pnode->num,pnode->name);
- }
- }
下面这段代码实现的是对某一结点的删除,使用了list_del_init()函数:
- list_for_each_safe(pos,n,&head1->list) {
- pnode = list_entry(pos,struct stu,list);
- if(pnode->num==1)
- {
- list_del_init(pos);
- printf("name %s is delete\n",pnode->name);
- free(pnode);
- }
- }
还有很多对链表的实现都可以运用到用户态下,大家可以下去尝试一下!
阅读(2438) | 评论(0) | 转发(0) |