我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux中内核链表的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux中内核链表的示例分析

这篇文章主要介绍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:%d\n",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 %d\n",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:%d\n",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中内核链表的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux中内核链表的示例分析

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

下载Word文档

猜你喜欢

Linux中内核链表的示例分析

这篇文章主要介绍Linux中内核链表的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux中的内核链表实例详解链表中一般都要进行初始化、插入、删除、显示、释放链表,寻找节点这几个操作,下面我对这几个操作进
2023-06-09

Linux内核双向链表的示例分析

小编给大家分享一下Linux内核双向链表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux 内核中自己实现了双向链表,可以在 include/li
2023-06-27

linux内核中list链表的源码分析

这篇文章将为大家详细讲解有关linux内核中list链表的源码分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。linux kernel里的很多数据结构都很经典, list链表就是其中之一,
2023-06-06

Linux内核中断的示例分析

这篇文章主要介绍了Linux内核中断的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时
2023-06-27

如何分析Linux内核双向链表

这篇文章将为大家详细讲解有关如何分析Linux内核双向链表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Linux中双向链表是指将双向链表节点嵌套在其它的结构体中;在遍历链表的时候,根据双链
2023-06-28

Linux中的内核链表实例详解

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

Linux 内核中reuseport 的演进示例分析

今天给大家介绍一下Linux 内核中reuseport 的演进示例分析。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。SO_REUSEPORT选项在Linux
2023-06-28

Linux内核编译的示例分析

小编给大家分享一下Linux内核编译的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  下载源代码Linux内核总是不断发展的,***的内核Kernel
2023-06-16

Linux系统中内核调试的示例分析

这篇文章主要介绍了Linux系统中内核调试的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。调试是软件开发过程中一个必不可少的环节,在 Linux 内核开发的过程中也不
2023-06-12

php中链表的示例分析

这篇文章将为大家详细讲解有关php中链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。链表的操作相对顺序表来说就复杂了许多。因为PHP确实已经为我们解决了很多数组操作上的问题,所以我们可以很方便
2023-06-20

Java中链表的示例分析

这篇文章将为大家详细讲解有关Java中链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。题目一 解法/** * Definition for singly-linked list. * publ
2023-06-29

Redis中链表的示例分析

这篇文章主要介绍Redis中链表的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1 链表和链表节点的结构1.1 节点结构节点的结构大概长下边这个样子:那么,把这些节点就连起来就成了这个样子:1.2 链表结构链
2023-06-22

Linux内核开发经历的示例分析

这篇文章主要为大家展示了“Linux内核开发经历的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux内核开发经历的示例分析”这篇文章吧。Linux内核社区在2016年庆祝了成立二十
2023-06-10

leetcode链表之分割链表的示例分析

这篇文章主要介绍了leetcode链表之分割链表的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或
2023-06-19

Linux内核编译与开发的示例分析

这篇文章将为大家详细讲解有关Linux内核编译与开发的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.Linux内核简介linux kernel map:linux 系统体系结构:linux k
2023-06-16

2017版Linux内核开发报告的示例分析

这篇文章给大家分享的是有关2017版Linux内核开发报告的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux 项目的现状本次的报告,所统计的数据是从内核的 4.7 算起,到 4.13 止,先看看L
2023-06-16

Linux中怎么实现内核链表

Linux中怎么实现内核链表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码如下:struct list_node{stuct list_node *pre;stuct li
2023-06-09

C语言中单链表的示例分析

这篇文章将为大家详细讲解有关C语言中单链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、思路步骤1. 定义结构体a.数据域:用来存放数据b.指针域:用来存放下一个数据的位置2.初始化申请头结
2023-06-25

Linux操作系统的NTFS和内核的示例分析

今天就跟大家聊聊有关Linux操作系统的NTFS和内核的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。传统编译内核模块的方法繁琐而费时,这里介绍一种快速编译所需要内核模块的新
2023-06-17

编程热搜

目录