- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章
嵌入式linux内核常见数据结构
在本章中,主要讲解嵌入式Linux内核中常见的链表、树、哈希表等数据结构以及相关算法。本章先讲解主要数据结构和算法,并分析在嵌入式Linux内核中的应用。
本章主要内容:
● 内核中的链表
● 内核中的树
● 内核中的哈希表
链表
链表是一种常见的重要数据结构它动态地进行存储分配根据需要开辟内存单元。
图4.1 链表结构
由图中,读者可以清楚地看到,每个链表都有一个头指针Head,其用于指示链表中第一个节点的存储位置。之后,链表由第一个节点指向第二个节点,依此类推。链表的最后一个数据元素由于没有直接后继节点,因此其节点的指针为空(NULL)。
单向链表
单链表的组织与存储
单向链表的每个点中除信息域以外还有一个指针域,用来指其后续点,最后一个点的指针域为空NULL)。单向链表由头指针一确定,因此单向链表可以用头指针的名字来命名,头指针指向单向链表的第一个点。在用C语言实现时,首先说明一个结构类型,在这个结构类型中包含一个或多个信息成员以及一个指针成员struct _link_node
{
element_type data; /* element_type为有效数据类型*/
struct _link_node *next;
} link_node;
typedef link_node *link_list;
链表结构中包含指针型的结构成员,类型为指向相同结构类型的指针。根据C语言的语法要求,结构的成员不能是结构自身类型,即结构不能自己定义自己,因为这样将导致一个无穷的递归定义,但结构的成员可以是结构自身的指针类型,通过指针引用自身这种类型的结构。int init_link(link_list *list)
{
/*用malloc分配函数分配节点*/
*list = (link_list)malloc(sizeof(link_node));
/*若分配失败,返回*/
if (!list)
{
return -1;
}
/*初始化链表节点的数据域*/
memset(((*list)-data), 0, sizeof(element_type));
/*初始化链表节点的指针域*/
(*list)-next = NULL;
return 0;
}
(2)数据查询
在操作链表时,通常需要检查在链表中是否存在某种数据,这时,可以通过顺序遍历链表来取得所需要的元素。
int get_element(link_list list, int i, element_type *elem)
{
/* list为带头节点的单链表的头指针 */
/*当第i个元素存在时,其值赋给elem并返回*/
link_list p = NULL;
int j = 0;
/*初始化,指向链表的第一个节点,j为计数器*/
p = list-next;
/* 为防止i过大,通过判断p是否为空来确定是否到达链表的尾部 */
while ((j++ i) (p = p-next));
/* 若第i个元素不存在,返回 */
if (!p || (j = i))
{
return -1;
}
/*取得第i个元素*/
*elem = p-data;
return 0;
}
(3)链表的插入与删除
链表的插入与删除是链表中最常见的操作,也是最能体现链表灵活性的操作。
在单向链表中插入一个点要引起插入位置前面点的指针的变化
图4.2 链表的节点插入过程
由图中可以看出,在链表中增加一个节点会依次完成如下操作。
创建新节点C
使C指向B:C→next = A→next。
使A指向C:A→next = C。
int link_insert(link_list list, int i, element_type elem)
{
/* list为带头节点的单链表的头指针 */
/* i为要插入的元素位置,elem为要插入的元素*/
link_list p = list, new_node;
int j = 0;
/* 找到第i位 */
while ((j++ i) (p = p-next));
if (!p || (j = i))
{
return 0;
}
/* 初始化链表节点 */
new_node = (link_list)malloc(sizeof(link_node));
new_node-data = elem;
/* 将s插入链表,并修改原先的指针 */
new_node-next = p-next;
p-next = new_no
您可能关注的文档
最近下载
- 【地理】河流与湖泊 课件-2025-2026学年地理人教版(2024)八年级上册.pptx VIP
- 2.1《职场应用写作与交流(一)求职和应聘》优秀获奖课件.pptx VIP
- 高中历史教学中人工智能协作学习评价与反馈体系构建教学研究课题报告.docx
- 电力系统微机继电保护教学课件电子教案全套课件.pptx VIP
- 2022年船载危险货物申报员和集装箱检查员从业资格考核全国统考试题.pdf VIP
- 石油小知识.ppt VIP
- 托福词汇词以类记-张红岩(完整有目录).pdf VIP
- 中考英语篇完型填空练习(附答案).pdf VIP
- 水浒传-林冲(共47张课件).pptx VIP
- 乡村医生考试题库及答案完整版.doc VIP
文档评论(0)