内核链表范例(首创)

#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 ",p->data);

  }
  printf(" ");

}
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 ",p->data);//这个调试信息起到了关键的作用间接的让我明白了指针的移动行为。

  if(p->data%2==0&&j==1)
  {
    list_move_tail(&p->list,&L->list);//这个函数每运行完一次,p指针都会指向它的前一个数据。
// printf("%d ",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 ",p->data);
// printf("ok");

  }
  printf(" ");
}

原文地址:https://www.cnblogs.com/defen/p/5205076.html