广告
返回顶部
首页 > 资讯 > 操作系统 >Linux中的内核链表实例详解
  • 491
分享到

Linux中的内核链表实例详解

内核详解实例 2022-06-04 21:06:46 491人浏览 独家记忆
摘要

Linux中的内核链表实例详解 链表中一般都要进行初始化、插入、删除、显示、释放链表,寻找节点这几个操作,下面我对这几个操作进行简单的介绍,因为我的能力不足,可能有些东西理解的不够深入,造成一定的错误,请各

Linux中的内核链表实例详解

链表中一般都要进行初始化、插入、删除、显示、释放链表,寻找节点这几个操作,下面我对这几个操作进行简单的介绍,因为我的能力不足,可能有些东西理解的不够深入,造成一定的错误,请各位博友指出。

A、linux内核链表中的几个主要函数(下面是内核中的源码拿出来给大家分析一下)

1)初始化:


#define INIT_LIST_HEAD(ptr) do { 
(ptr)->next = (ptr); (ptr)->prev = (ptr); 
} while (0)  // ptr为struct list_head,其中包括两个指针next和prev,这里已经可以看出内核链表是双向循环链表

 

2)尾部插入:


static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
} //尾部插入,传入的参数是新节点中的两个指针和头结点中的两个指针

3)头部插入函数


static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
} //头插入函数,传入的参数是新节点中的两个指针和头结点中的两个指针

 

4)删除节点函数


static inline void list_del(struct list_head *entry)  //传入要删除节点中的指针域
{
__list_del(entry->prev, entry->next);//两个参数分别为所删除节点前一个节点和后一个节点
entry->next = (void *) 0;//删除节点后置为空
entry->prev = (void *) 0;
}

 

5)显示函数(如果要打印出链表中的信息的话要自己写成打印的函数,比如printf,因为这个其实是一个遍历的函数,没有显示的功能)


#define list_for_each_entry(pos, head, member) 
for (pos = list_entry((head)->next, typeof(*pos), member); 
&pos->member != (head); 
pos = list_entry(pos->member.next, typeof(*pos), member))



6)删除链表


#define list_for_each_safe(pos, n, head) 
for (pos = (head)->next, n = pos->next; pos != (head); 
pos = n, n = pos->next)

//这里面的pos和n都是list_head指针,n指针是用于在删除时不让链表断链

 

7)寻找节点(这也是用的内核中的遍历函数)


#define list_for_each_entry(pos, head, member) 
for (pos = list_entry((head)->next, typeof(*pos), member); 
&pos->member != (head); 
pos = list_entry(pos->member.next, typeof(*pos), member))

 

B.下面来段代码给大家看看具体的运用方法



#include"kernel.h"
#include<errno.h>
#include<stdio.h>
#include<stdlib.h>

typedef struct list_node
{
int data;
struct list_head list;//节点的指针域是被封装在struct list_head这个结构体内
//这个结构体中包括struct list_head *next,*prev
}*node,node1;


node init_head(node head)//初始化空链表
{
head = (node)malloc(sizeof(node1));//为节点分配空间
if(head == NULL)
{
perror("head");
return NULL;
}
INIT_LIST_HEAD(&(head->list));//#define INIT_LIST_HEAD(ptr) do { 
(ptr)->next = (ptr); (ptr)->prev = (ptr); 
} while (0)//调用内核中的初始化函数,传入的参数是
//节点的中两个指针,即struct list_head结构体中的两个指针
return head;
}

node insert_tail(node head,int data)//尾部插入函数
{
node new = (node)malloc(sizeof(node1));//为新节点分配空间
if(new == NULL)//判断一下分配空间是否成功
{
perror("new:");
return NULL;
}
new->data = data;
list_add_tail(&(new->list),&(head->list));//调用内核中的从尾部插入的函数,传入的参数为新节点中的两个指针
//和头结点中的两个指针
return 0;
}

 

head_insert_node(node head,int data)//头插入函数
{
node new;//创建一个新节点
new = (node)malloc(sizeof(node1));//为新节点分配空间
if(new == NULL)//判断一下分配空间是否成功
{
perror("new:");
return 0;
}
new->data = data;
list_add(&(new->list),&(head->list));//调用内核中从头插入的函数,传入的参数为新节点的两个指针和头结点的两个指针
return 0;
}

node search_node(node head,int data)//寻找节点函数
{
node p = NULL;
list_for_each_entry(p,&(head->list),list) //内核中的遍历函数
{
if(p->data == data) //p即为需要找的节点
{
printf("found the data:%dn",p->data);
Goto OK;
}
}

puts("not found the data!");
return NULL;

OK:
return p;
}

int show_node(node tmp)
{
if(tmp == NULL)
{
puts("tmp is NULL!");
return -1;
}
printf("the data is %dn",tmp->data);
return 0;
}

int delete_node(node head,int data)
{
node p = NULL;
list_for_each_entry(p,&(head->list),list)
{
if(p->data == data)
{
printf("found the data which you want to delete!n");
goto f;
}
}

f:
list_del(&(p->list));
free(p);
return 0;
}

int show_list(node head)
{
node p = NULL;
list_for_each_entry(p,&(head->list),list)
{
printf("data:%dn",p->data);
}
return 0;
}


int delete_list(node head)//删除链表函数
{
node p,q;
list_for_each_entry_safe(p,q,&(head->list),list)//这是内核中的安全删除函数
{
list_del(&(p->list));
free(p);
}

list_del(&(head->list));
free(head);
return 0;
}
int main(int arGC,char **argv)
{
node head;
node tmp;
head = init_head(head);//初始化空链表函数
insert_tail(head,45);//从末尾插入函数
insert_tail(head,55);
insert_tail(head,65);

head_insert_node(head,75);//从头插入函数
show_list(head); //显示链表函数 

tmp = search_node(head,55);//寻找结点函数
show_node(head);
delete_node(head,55);
//show_list(head);
delete_list(head);//删除链表函数
return 0;
}

以上就是Linux中的内核链表实例详解的实例如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

--结束END--

本文标题: Linux中的内核链表实例详解

本文链接: https://www.lsjlt.com/news/18679.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux中的内核链表实例详解
    Linux中的内核链表实例详解 链表中一般都要进行初始化、插入、删除、显示、释放链表,寻找节点这几个操作,下面我对这几个操作进行简单的介绍,因为我的能力不足,可能有些东西理解的不够深入,造成一定的错误,请各...
    99+
    2022-06-04
    内核 详解 实例
  • Linux中内核链表的示例分析
    这篇文章主要介绍Linux中内核链表的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux中的内核链表实例详解链表中一般都要进行初始化、插入、删除、显示、释放链表,寻找节点这几个操作,下面我对这几个操作进...
    99+
    2023-06-09
  • Linux中怎么实现内核链表
    Linux中怎么实现内核链表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码如下:struct list_node{stuct list_node *pre;stuct li...
    99+
    2023-06-09
  • Linux内核双向链表的示例分析
    小编给大家分享一下Linux内核双向链表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux 内核中自己实现了双向链表,可以在 include/li...
    99+
    2023-06-27
  • Linux内核链表实现过程
    关于双链表实现,一般教科书上定义一个双向链表节点的方法如下: struct list_node{stuct list_node *pre;stuct list_node *next;ElemType dat...
    99+
    2022-06-04
    内核 链表 过程
  • Linux内核中双向链表怎么实现
    这篇文章主要介绍了Linux内核中双向链表怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux内核中双向链表怎么实现文章都会有所收获,下面我们一起来看看吧。首先让我们看一下在 include/lin...
    99+
    2023-06-28
  • Linux内核中的数据双链表如何理解
    这篇文章给大家介绍Linux内核中的数据双链表如何理解,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Linux 内核中自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会首...
    99+
    2023-06-28
  • 怎么理解Linux内核中的循环链表结构
    本篇文章给大家分享的是有关怎么理解Linux内核中的循环链表结构,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。注:文章中引用的代码来源于LXR,所分析的内核版本是v2.6.31...
    99+
    2023-06-17
  • linux内核中list链表的源码分析
    这篇文章将为大家详细讲解有关linux内核中list链表的源码分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。linux kernel里的很多数据结构都很经典, list链表就是其中之一,...
    99+
    2023-06-06
  • 详解C语言内核中的链表与结构体
    Windows内核中是无法使用vector容器等数据结构的,当我们需要保存一个结构体数组时,就需要使用内核中提供的专用链表结构LIST_ENTRY通过一些列链表操作函数对结构体进行装...
    99+
    2022-11-13
  • 怎样全面了解Linux内核循环链表
    怎样全面了解Linux内核循环链表,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。随着Linux的发展,现在Linux越来越偏离以前的主题,越来越不符合它最初的含...
    99+
    2023-06-16
  • Linux内核设备驱动之内核中链表的使用笔记整理
    (1)介绍 在linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织。这些链表大多采用在include/linux/list.h实现的一个相当精彩的链表数据结构。 链表数据结构的...
    99+
    2022-06-04
    linux内核中链表的使用 linux内核设备驱动
  • Linux内核中的循环链表结构是什么
    Linux内核中的循环链表结构是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文章中引用的代码来源于LXR,所分析的内核版本是v2.6.31。linux内核通过定义li...
    99+
    2023-06-17
  • Linux链接命令的实例详解
    Linux链接命令的实例详解 一 语法 ln -s [源文件] [目标文件] 命令英文含义:link 功能描述:生成链接文件 选项:-s 创建软链接 二 硬链接特征 原文件和硬链接文件删除其...
    99+
    2022-06-04
    详解 实例 命令
  • python单向链表实例详解
    使用python实现单向链表,供大家参考,具体内容如下 单向链表:是将所有的数据作为一个个节点,将所有的节点链接在一起。每一个节点中又分为: 存储数据区,链接区 存储数据区: 存储具...
    99+
    2022-11-11
  • python双向链表实例详解
    使用python实现双向链表,供大家参考,具体内容如下 双向链表: 指的是讲数据链接在一起,每个数据是一个节点,每一个节点都有一个数据区,两个链接区,分别链接上一个节点和下一个节点数...
    99+
    2022-11-11
  • Linux内核宏Container_Of的详细解释
    目录1. 结构体在内存中是如何存储的2. container_of宏3. typeof4. (((type *)0)->member)5. const typeof(((type * )0) ->member...
    99+
    2022-06-04
    Linux内核宏中Container_Of Linux内核宏 Container_Of
  • 实例详解Linux 中的命令链接操作符
    && 与 || 配合 eg: cat test.sh #!/bin/bash [ -e /etc/hosts ] && echo "ok" || echo wSIRBKV"fail" bash test.sh o...
    99+
    2022-06-04
    linux 命令链接操作符 linux 操作符
  • Python 实现静态链表案例详解
    静态链表和动态链表区别 静态链表和动态链表的共同点是,数据之间"一对一"的逻辑关系都是依靠指针(静态链表中称"游标")来维持。 静态链表 使用静态链表存储数据,需要预先申请足够大的一...
    99+
    2022-11-12
  • python双向循环链表实例详解
    使用python实现双向循环链表,供大家参考,具体内容如下 双向循环链表: 将所有的数据存放到节点中,每一个节点相连接,首尾链接,每一个节点中有一个数据存储区,和两个链接区,一个链接...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作