内核链表范例(首创)

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

时间: 2024-12-20 22:59:15

内核链表范例(首创)的相关文章

Linux 内核链表

一 . Linux内核链表 1 . 内核链表函数 1.INIT_LIST_HEAD:创建链表 2.list_add:在链表头插入节点 3.list_add_tail:在链表尾插入节点 4.list_del:删除节点 5.list_entry:取出节点 6.list_for_each:遍历链表 2.程序代码

例说Linux内核链表(二)

链表使用 我认为熟悉内核链表功能最好的方法就是看一些简单的实例,实例是一个非常好的素材去更好的理解链表. 下面是一个例子,包含创建,添加,删除和遍历链表. <span style="font-size:14px;"><span style="color:#330099;">#include <stdio.h> #include <stdlib.h> #include "list.h" struct

Linux 内核 链表 的简单模拟(2)

接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop cursor. * @head: the head for your list. */ #define list_for_each(pos, head) for (pos = (head)->next; pos != (head);

linux驱动开发要知道的那些知识(二)------list内核链表

内核链表 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据.链表的开销主要是访问的顺序性和组织链的空间损失. 通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节点之间的联系形式,链表又可以分为单链表.双链表.

深入分析Linux内核链表

1. 普通单链表 2. 内核链表 上图是本人从其他博客盗来的,差点被糊弄过去. 下图是本人自己用KeyNote画的(唉!!画图真的是让人心好累啊!!). 差异是不是很明显啊?! Read The Fucking Source Code 1. 初始化 /* include/linux/types.h */ struct list_head { struct list_head *next, *prev; }; /* include/linux/list.h *//*××××××××××××××××

10、内核链表的学习

首先是创建内核模块. 按照上面的那张图,我们知道,我们创建链是使用INIT_LIST_HEAD这个函数.现在我们来使用source insight查看该函数的结构. 该函数是对我们的链表头进行初始化的.我们把链表头做一个参数传进来之后.我们分别用next和prev指针同时指向他本身. 可以看到,该函数是个内联函数.该函数只有一个参数,是struct list_head类型的指针,他就是我们要初始化的链表头. 所以我们得来创建这个链表头结构.Struct list_head list score_

内核链表

能不能一种链表中链接不同的类型呢,相应这种号召,内核链表诞生了. 内核链表之所以能够链接不同的类型的数据,是因为它和普通链表不一样,它链接的不是数据结构的起始地址,而是链接的该数据结构中的的list_head属性. 下面是比较重要的函数: 其他的都很简单,专门介绍一下list_entry函数: 函数最后返回的是这个结构体节点起始地址.Ptr是这个节点中list_head属性的地址,type是这个结构体节点的真实类型,member是这个结点中list_head属性的名字. 其中typeof关键字调

例说Linux内核链表(一)

介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其他的语言,它不具备一个好的数据结构对象或者标准对象库的支持.所以可以借用Linux内核源码树的循环双链表是一件很值得让人高兴的事. 在include/linux/list.h文件中用C实现了一个好用的循环链表.它是有效而且易于操作的,否则它也不会被内核使用(译者注:在kernel中大量的使用了循环双链表结构,比如在在进程描述符实体中我们就可以看到很多struct list_head的身影).不管何时,依靠这种结构,在内核中都

例说Linux内核链表(三)

经常使用的linux内核双向链表API介绍 linux link list结构图例如以下: 内核双向链表的在linux内核中的位置:/include/linux/list.h 使用双向链表的过程,主要过程包括创建包括struct link_head结构的结构体(item),建立链表头.向链表中加入item(自己定义数据结构.双向链表数据单元).删除链表节点.遍历链表,判空等. 1.建立自己定义链表数据结构 struct kool_list{ int to; struct list_head li