设为首页 加入收藏

TOP

C语言的那些小秘密之链表(三) (三)
2014-11-23 22:30:40 来源: 作者: 【 】 浏览:5
Tags:语言 些小 秘密
这里使用了一种特殊的方法。注意:我在linux环境下以上宏的值不用修改是不会出错的,但是在vc下就会出错,不允许使用那两个值,所以要修改为NULL。

static inline void list_del_init(struct list_head *entry)

{

__list_del(entry->prev, entry->next);

INIT_LIST_HEAD(entry);

}

以上函数的功能为删除entry所指向的结点,同时调用LIST_INIT_HEAD()把被删除结点为作为链表头构建一个新的空双循环链表。

#include

#include

#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_del(&(pstu[3].list));

printf("使用list_del()删除pstu[3]\n");

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);

}

list_del_init(&(pstu[2].list));

printf("使用list_del_init()删除pstu[2]\n");

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);

}

free(pstu);

return 0;

}

运行结果为:

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

使用list_del()删除pstu[3]

student num: 5 student name: Stu5

student num: 3 student name: Stu3

student num: 2 student name: Stu2

student num: 1 student name: Stu1

使用list_del_init()删除pstu[2]

student num: 5 student name: Stu5

student num: 2 student name: Stu2

student num: 1 student name: Stu1

看了代码的使用之后我们再去理解之前的讲解就要轻松多了。读者可以结合上面相应的文字描述再分析下代码,以加深印象。接着往下看,坚持看完本篇博客的最后两个函数。

static inline void list_move(struct list_head *list, struct list_head *head)

{

__list_del(list->prev, list->next);

list_add(list, head);

}

static inline void list_move_tail(struct list_head *list,

struct list_head *head)

{

__list_del(list->prev, list->next);

list_add_tail(list, head);

}

看看上面两个函数list_move()和list_move_tail(),第一个list_move()函数的功能是把list移至head和head->next两个指针所指向的结点之间。而第二个list_move_tail()函数的功能是把list移至head和head->prev两个指针所指向的结点之间。如果读者觉得这样说不是太具体的话,那么我们来看看下面的代码。

#include

#include

#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_move(&(pstu[3].list),&stu_list);

printf("把pstu[3]移至head和head->next两个指针所指向的结点之间\n");

list_for_each(pos,&stu_list)

{

tmp_stu = list_entry(pos, stu, list);

printf("student num: %d\tstudent name: %s\n",tmp_

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇让你不再害怕指针2--指针的算术运.. 下一篇C语言的那些小秘密之链表(四)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: