内核链表范例(首创)

#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");
}

 

转载于:https://www.cnblogs.com/defen/p/5205076.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值