0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言的单链表应用

汽车电子技术 来源:玩转单片机 作者: noah 2023-02-20 15:03 次阅读

最近在看一些开源项目,大佬的思路还是很值得去学习,今天就简单介绍一下单链表的应用,配合回调函数可以玩出新花样,废话不多说直接看代码!

| 头文件

#include "stdio.h"
#include "stdint.h"


typedef struct sensor
{
    uint8_t flag;
    void (*callback)(void);
    struct sensor* next;
}sensor_t;


extern sensor_t sensor1;
extern sensor_t sensor2;
extern sensor_t sensor3;


void sensor1_callback(void);
void sensor2_callback(void);
void sensor3_callback(void);


void sensor_init(sensor_t* handle, void(*callback)(void));
void sensor_start(sensor_t* handle);
void sensor_handle(void);

| 源码

// 链表头指针
static sensor_t* head_handle = NULL;


// 创建对象
sensor_t sensor1;
sensor_t sensor2;
sensor_t sensor3;


// 回调函数
void sensor1_callback(void)
{
    printf("sensor1!\\r\\n");
}


void sensor2_callback(void)
{
    printf("sensor2!\\r\\n");
}


void sensor3_callback(void)
{
    printf("sensor3!\\r\\n");
}


// 传感器初始化
void sensor_init(sensor_t* handle, void(*callback)(void))
{
  handle->callback = callback;
  handle->flag = 0x00;
  sensor_start(handle);
}


// 传感器开始(往链表添加节点)
void sensor_start(sensor_t* handle)
{
  sensor_t* target = head_handle;
  if(head_handle == NULL)
  {
    /* 链表为空 */
    head_handle = handle;
    handle->next = NULL;
  }
  else
  {
    /* 链表中存在节点,遍历找最后一个节点 */
    while(target->next != NULL)
    {
      /* 去掉重复节点 */
      if(target == handle){
        break;
      }
      target = target->next;
    }
    target->next = handle;
    handle->next = NULL;
  }
}


// 传感器处理(遍历链表)
void sensor_handle(void)
{
  sensor_t* target = head_handle;
  while(target != NULL)
  {
    target->callback();
    target = target->next;
  }
}

| 运用

int main()
{
    sensor_init(&sensor1,sensor1_callback);
    sensor_init(&sensor2,sensor2_callback);
    sensor_init(&sensor3,sensor3_callback);
    sensor_handle();
    while (1)
    {
        /* code */
    }
}

这个写法是理论上只会受限于内存大小,理想状态下可以无限创建对象,通过绑定回调函数,能在一定程度上解决调用耦合的问题!

--END--

收录于合集 **#**c语言

2

上一篇C语言|void 指针

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4747

    浏览量

    68348
  • 回调函数
    +关注

    关注

    0

    文章

    87

    浏览量

    11543
  • 单链表
    +关注

    关注

    0

    文章

    13

    浏览量

    6915
收藏 人收藏

    评论

    相关推荐

    C语言-链表(单向链表、双向链表)

    在前面章节已经学习了数组的使用,数组的空间是连续空间,数组的大小恒定的,在很多动态数据存储的应用场景下,使用不方便;而这篇文章介绍的链表结构,支持动态增加节点,释放节点,比较适合存储动态数据的应用场景,而且链表的空间是存储在堆上面的,可以动态分配,释放
    的头像 发表于 09-09 11:30 1614次阅读

    源码|学生信息管理系统(C语言链表实现)

    源码|学生信息管理系统(C语言链表实现)
    发表于 11-03 10:24 497次阅读

    C语言实现静态链表的建立

    在这么卷的时代,我觉得硬件工程师还是 要掌握基本的C语言编写能力,链表在学生阶段是一个比较难的知识点,可能有些同学上完一个大学都不会链表的编写,但是在未来工作中,
    发表于 01-13 15:08 705次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>实现静态<b class='flag-5'>链表</b>的建立

    C语言链表的应用

    最近在看一些开源项目,大佬的思路还是很值得去学习,今天就简单介绍一下链表的应用,配合回调函数可以玩出新花样,废话不多说直接看代码!
    发表于 02-17 09:22 428次阅读

    C语言算法题:反转一个单向链表

    链表是编程学习的一个难点。其实,在C语言编程以及单片机裸机开发中,链表运用并不多。但是如果想提升嵌入式技能水平或收入水平,可以考虑深入嵌入式系统层面(如参与操作系统设计、深入学习新的操
    发表于 06-21 11:07 779次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>算法题:反转一个单向<b class='flag-5'>链表</b>

    C语言链表知识点(2)

    C语言链表知识点(2)
    发表于 08-22 10:38 313次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>链表</b>知识点(2)

    C语言链表

    C语言链表,,,
    发表于 11-07 17:19

    C语言玩转链表

    C语言是必学的一个课程,不管你是单片机还是嵌入式物联网,都是基础,所以还是要好好学习的今天推荐的资料是关于C语言链表的资料我自己看了一下主要
    发表于 11-13 13:50

    怎么实现c语言循环链表

    怎么实现c语言循环链表
    发表于 10-19 06:07

    C语言实现链表举例

    所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为链表、双向链表和循环链表
    发表于 07-11 16:40 87次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>实现<b class='flag-5'>单</b><b class='flag-5'>链表</b>举例

    C加加建立动态链表

    C加加建立动态链表利用C语言c++编写程序
    发表于 11-19 13:43 0次下载

    C语言链表的模拟学生成绩管理系统

    链表编写的模拟学生成绩管理系统,索要进行的项目可以再菜单中进行选择
    发表于 11-26 15:46 12次下载

    C语言链表相关资料下载

    C语言链表相关资料
    发表于 03-08 10:47 5次下载

    C语言_链表总结

    本篇文章介绍C语言链表相关知识点,涉及链表的创建、单向链表、循环链表、双向
    的头像 发表于 08-14 09:53 1753次阅读

    OpenHarmony中软件模块的链表实现

    为了性能考虑,嵌入式系统一般使用C语言进行开发,由于C语言标准库没有封装链表,所以嵌入式系统一般自己设计和实现
    发表于 08-30 09:25 332次阅读