内核链表范例(首创)
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#include<kernel_list.h>
typedef struct node
{
int data;
struct list_head list;
}listnode,*linklist;
linklist init_list()
{
linklist L =malloc(sizeof(listnode));
INIT_LIST_HEAD(&L->list);//注意参数的类型
return L;
}
struct list_head *pos;
void show_list(struct list_head *pos,linklist L)
{
list_for_each(pos,&L->list)
{
listnode *p = list_entry(pos,listnode,list);
printf("%d\t",p->data);
}
printf("\n");
}
int main()
{
linklist L = init_list();
int i;
for(i=1;i<=10;i++)
{
linklist new = malloc(sizeof(listnode));
new->data = i;
list_add_tail(&new->list,&L->list);
}
/*listnode *q = list_entry(pos,listnode,list);
listnode *p = list_entry(pos->prev,listnode,list);
while(p!=q)
*/使用,证明是失败的
int j=0;
struct list_head *q;
list_for_each_prev(pos,L->list.next)
{
//j++; struct list_head *q;
listnode *p = list_entry(pos->prev,listnode,list);//获取数字10所在节点的地址,从后向前指
//printf("%d\n",p->data);//这个调试信息起到了关键的作用间接的让我明白了指针的移动行为。
if(p->data%2==0&&j==1)
{
list_move_tail(&p->list,&L->list);//这个函数每运行完一次,p指针都会指向它的前一个数据。
// printf("%d\t",p->data);
pos = pos->next;//注意指针指向的变化。
j=0;
}
else
{
j=1; //j的妙用,特别注意指针的指向。 使用的非常巧妙
continue;
}
// if(j==8)
// break;
}
//show_list(pos,&L->list);
list_for_each(pos,&L->list)
{
listnode *p = list_entry(pos,listnode,list);
printf("%d\t",p->data);
// printf("ok");
}
printf("\n");
}