内核链表的使用

news2024/9/25 21:26:01

目录

📎list.rar

链表的作用

使用list.h使用例

练习

答案:


📎list.rarhttps://www.yuque.com/attachments/yuque/0/2023/rar/35243076/1687947573309-b0609eda-c0ac-475d-8d13-b901a3359cad.rar

链表的作用

链表在动态内存分配、插入删除操作、构建其他数据结构、高效查找、缓存和回收等方面发挥着重要作用。它是一种灵活、高效的数据结构,适用于各种场景和问题的解决方案。

下面是一个简单的链表应用:

假设学生结构体信息如下,封装一个单链表的插入接口遍历输出的接口,在主函数中利用封装的接口生成一个学生链表,并遍历输出链表的学生信息。

struct stu_node
{
    int age;
    char name[64];
};

//定义一个链表头节点
static xxx head;

//头插法插入,参数为新插入的节点信息
int insert_head(struct xxx data)
{

}

//遍历输出节点的信息
void print_list()
{

}

int main(int argc, char const *argv[])
{
    head.next = NULL;
    
    //定义新的节点并赋值
    
    //调用插入方法
    insert_head(data1);
    insert_head(data2);    
    
    //遍历输出
    print_list();
}

上面是一个学生结构体,假设我们换了一个老师结构体,上面的链表的实现逻辑不变,但还是需要进行大量修改。

为了提高开发效率,减少重复工作,linux内核给我们提供了链表。

https://www.cnblogs.com/wangzahngjun/p/5556448.htmlhttps://www.cnblogs.com/wangzahngjun/p/5556448.html

但是linux提供的内核链表还是不太满足初学者需求,我从某些途径获取到了一个修改后的内核链表,能满足一些需求。(放到文章顶部了)

使用list.h使用例

#include <stdio.h>
#include <string.h>
#include "list.h"

// 定义学生结构体
struct student
{
    int age;                    // 年龄
    char name[64];              // 姓名
    struct list_head list;      // 链表节点
};

int main()
{
    struct list_head head;
    INIT_LIST_HEAD(&head);      // 初始化链表头部

    // 创建学生节点
    struct student stu1;
    strcpy(stu1.name, "张三");
    stu1.age = 1;

    struct student stu2;
    strcpy(stu2.name, "李四");
    stu2.age = 2;

    struct student stu3;
    strcpy(stu3.name, "王五");
    stu3.age = 3;

    // 将学生节点添加到链表头部
    list_add(&stu1.list, &head);
    list_add(&stu2.list, &head);
    list_add(&stu3.list, &head);

    struct list_head *pos;
    struct student *tmp;

    printf("初始化链表\n");
    // 遍历链表并打印每个节点的信息
    list_for_each(pos, &head)
    {
        tmp = list_entry(pos, struct student, list);
        printf("姓名:%s,年龄:%d\n", tmp->name, tmp->age);
    }
    printf("\n");

    pos = get_first(&head);
    tmp = list_entry(pos, struct student, list);
    printf("第一个节点是:%s\n\n", tmp->name);

    pos = get_last(&head);
    tmp = list_entry(pos, struct student, list);
    printf("最后一个节点是:%s\n\n", tmp->name);

    puts("删除最后一个节点");
    // 删除最后一个节点
    list_del(pos);

    printf("删除后:");
    // 再次遍历链表确认删除操作的效果
    list_for_each(pos, &head)
    {
        tmp = list_entry(pos, struct student, list);
        printf("%d ", tmp->age);
    }
	puts("\n");

    return 0;
}

练习

将下面的数据节点信息转换为链表结构,并遍历输出。要求根据type的值来决定val的类型。type为1代表bool类型,2代表整形,3代表浮点型。无需解析文本,直接赋值形成节点即可。

"data": 
[
    {
      "key": 1,
      "type": 2,
      "val": "10"
    },
    {
      "key": 2,
      "type": 1,
      "val": "0"
    },
    {
      "key": 3,
      "type": 3,
      "val": "22.5"
    }
]

答案:

#include <stdio.h>
#include <string.h>
#include<stdbool.h>
#include "list.h"
union val_t
{
bool b_val;
int i_val;
float f_val;
};

struct student
{
    int key;
    int type;
    union val_t val;
    struct list_head list;
};

void main()
{
    struct list_head head; //定义头
    INIT_LIST_HEAD(&head);

    struct student stu1;
    stu1.key=1;
    stu1.type = 2; //int
    stu1.val.i_val=10;

    struct student stu2;
    stu2.key=2;
    stu2.type = 1;//bool
    stu2.val.b_val=0;

    struct student stu3;
    stu3.key=3;
    stu3.type =3;//float
    stu3.val.f_val=22.5;
    //使用提供函数添加,我选择头插法
    list_add(&stu3.list, &head);
    list_add(&stu2.list, &head);
    list_add(&stu1.list, &head);


    struct list_head *pos;
    struct student *tmp;

    list_for_each(pos, &head)
{
    tmp = list_entry(pos, struct student, list);
    if(tmp->type==1)
{
    printf("{\nkey:%d,\ntype:%d,\nval:%d\n", tmp->key, tmp->type,tmp->val.b_val);
    printf("},\n");
}else if(tmp->type==2)
{
    printf("{\nkey:%d,\ntype:%d,\nval:%d\n", tmp->key, tmp->type,tmp->val.i_val);   
    printf("},\n");
}else if (tmp->type==3)
{
    printf("{\nkey:%d,\ntype:%d,\nval:%.1f\n", tmp->key, tmp->type,tmp->val.f_val);
    printf("},\n");   
}  
}
    printf("\n");
    list_del(pos);
    return ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/696187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端工程化】Docker入门

背景 当我们使用&#xff08;开发&#xff09;某个软件&#xff0c;可能得确保操作系统、依赖、环境变量相同的问题&#xff0c;这些配置可能就需要花费很多时间。使用虚拟机&#xff0c;可以解决上述部分问题&#xff0c;但是它又引发了其他问题&#xff1a;资源占用多、冗余…

星辰秘典:揭示Python项目的宇宙奥秘——宇宙星空模拟器(改)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;html css js&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;你好&#x…

2.7C++基类和派生类转换

C 基类和派生类转换 C中基类与派生类之间的转换有两种方式&#xff1a; 1、向上转换 向上转换是将派生类的指针或引用转换为基类的指针或引用。 向上转换是安全的&#xff0c;因为基类是派生类的公共部分&#xff0c;可以保证派生类对象的所有成员都可以被基类指针或引用访…

Windows11 anaconda配置pytorch环境

生成 .condarc 文件&#xff0c;位于C:\Users\Admin\ conda config --set show_channel_urls yes 记事本打开 .condarc 文件&#xff0c;添加以下内容&#xff1a; channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ - https://mirrors.tuna.tsingh…

北上广深共享办公室市场概览

在北上广深这四个城市&#xff0c;共享办公室已经成为一种日益流行的办公模式。随着经济的快速发展和科技创新的不断推进&#xff0c;越来越多的企业开始青睐共享办公室&#xff0c;以适应灵活办公和协作办公的需求。那么&#xff0c;2023年共享办公室市场的前景如何呢&#xf…

头条搜索精选 参数分析

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!头条搜索精选 参数分析 环境 win10Python3.9Chrome抓包接口分析 主要是需要这一块的内容 通过抓包分析发…

一、机器学习概述

一、机器学习概述1.机器学习初步认识2.机器学习类型1&#xff09;监督学习a.分类b.回归 2&#xff09;无监督学习a.聚类b.降维 3.机器学习方法1&#xff09;模型2&#xff09;损失函数3&#xff09;优化算法4&#xff09;模型评估指标 4.开发流程 一、机器学习概述 1.机器学习初…

Openlayers图文版实战,vue项目从0到1做基础配置

Openlayers的实战教程 分为**图文版** 和 **视频版**&#xff0c; 这里的是图文版&#xff0c;包含基础知识介绍和*实战的源代码*&#xff0c;示例效果以gif动图的形式展现出来。 **视频版** 正在录制中&#xff0c;很快会上线&#xff0c;敬请期待~&#xff0c; 如有问题&am…

Java如何实现手动连接数据库(Mysql或Oracle) | 超级详细,建议收藏

&#x1f468;‍&#x1f393;作者&#xff1a;bug菌 ✏️博客&#xff1a; CSDN、 掘金、 infoQ、 51CTO等 &#x1f389;简介&#xff1a;CSDN博客专家&#xff0c;C站历届博客之星Top50&#xff0c;掘金/InfoQ/51CTO等社区优质创作者&#xff0c;全网粉丝合计10w&#xff0c…

ant design vue 配置菜单外部打开

实现如下 菜单配置 前端项目地址&#xff1a;http://localhost:3000 菜单路径&#xff1a;dataCenter/HealthData 打开方式&#xff1a;外部 在项目中src-->config-->router.config.js文件 将需要再外部打开的菜单地址进行如下配置 菜单地址&#xff1a;/dataCenter/Hea…

软件测试面试题(完整版)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c…

力姆泰克LBP滚珠丝杠电动推杆

LBP滚珠丝杠电动推杆 内含长寿命润滑脂&#xff0c;免维护 向下翻动查看更多 力姆泰克电动推杆 高强度/高耐磨材料选择&#xff0c;高精度的零部件加工&#xff0c;先进的壳体设计理念&#xff0c;造就高承载能力&#xff0c;抗冲击&#xff0c;低噪音&#xff0c;长寿命的优…

【AUTOSAR】BMS开发实际项目讲解(八)----BMS热管理冷却功能

热管理参数 项目 模式 BEV 进入条件&#xff08;℃&#xff09; 退出条件&#xff08;℃&#xff09; 目标水温&#xff08;℃&#xff09; 目标流速&#xff08;L/min&#xff09; 冷却 一级冷却 行车 T1_in35 T1_out28 20 20 快充 T1_in30 T1_out…

Vue3 刨析响应式 ref 原理

目标 了解 Vue &#xff0c;手写一个方法&#xff0c;实现响应式&#xff0c;并读懂响应式 源码 class MyRef {constructor(value) {this._value value}// 访问器get value() {console.log(触发 getter 函数 访问);return this._value}// 读取器set value(newVal) {console.l…

微电网数字化系统硬件设备在储能行业中的应用

安科瑞虞佳豪 1如果说火爆的储能行业堪比新能源赛道上的皇冠&#xff0c;那么工商业储能就是皇冠上的明珠。 提及储能&#xff0c;人们习惯更多地关注源网侧储能电站&#xff08;大储&#xff09;身上&#xff0c;探讨发电侧配储、利用率、共享储能模式等话题&#xff0c;但其…

不一般!R型变压器直流电阻和绝缘电阻背后的秘密原来是这样!

一般来说&#xff0c;除了技术人员之外&#xff0c;我们可能不太清楚变压器的一些内部电阻&#xff0c;比如什么是R型变压器的直流电阻&#xff1f;事实上&#xff0c;这些都是变压器参数中的一些重要信息&#xff0c;通常与变压器的质量和使用有关。让我们和小r一起来看看什么…

AR项目问题汇总

1、unity使用URP 导致ARFoundation黑屏 (16条消息) unity使用URP 导致ARFoundation黑屏_arfoundation运行iphone黑屏_weixin_46813963的博客-CSDN博客https://blog.csdn.net/weixin_46813963/article/details/117509322Configuring the AR Camera background using a Scriptab…

Android Studio中App Inspection 或Profiler里网络请求数据显示中文乱码解决办法

如题&#xff0c;在Android开发时经常需要网络请求分析&#xff0c;但是Response 里面的中文经常乱码&#xff0c;用如下办法可解决 效果如下&#xff1a; 解决办法 Android studio在 Help中找到Edit Custom VM Options… 并打开文件&#xff0c;在文件中添加 -Dfile.encod…

记录一次 vite 配置别名路径 打包时出错的bug

vite多页应用,由于在vite.config.ts中define中配置的常量pages,而路径别名也有pages,所有导致打包时替换路径出错,将pages常量注释掉就好了 export default defineConfig({root: getRoot(), // 项目根路径base: "/", // 公共基础路径envDir: resolve(__dirname), /…

SpringBoot03:yaml配置注入

目录 一、yaml语法学习 1、配置文件 2、yaml概述 3、yaml基础语法 3.1、字面量&#xff1a;普通的值【数字、布尔值、字符串】 3.2、对象、Map(键值对) 3.3、行内写法&#xff1a; 3.4、数组&#xff08;list、set&#xff09; 二、注入配置文件 1、yaml注入配置文件…