打印
[综合信息]

递归结构体数组链表实现

[复制链接]
828|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-1-21 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一:在C语言中,递归结构体是一种可以包含自身类型实例的结构体。这意味着结构体的定义中可以包含对同一种结构体的引用,形成递归的关系。

        递归结构体通常用于表示具有层次结构的数据,如链表,树等。通过递归结构体,可以方便地定义这些数据结构的节点,并且能够实现自动的内存管理。

typedef struct ListNode {  
    int value;  
    struct ListNode* next;  
} ListNode;  

typedef struct TreeNode {  
    int value;  
    struct TreeNode* left;  
    struct TreeNode* right;  
} TreeNode;  
二:通过递归结构体实现事件时间链表,利用动态数组和链表排序实现对事件的频繁插入

#ifndef _MODEL_SCHEDULE_H_
#define _MODEL_SCHEDULE_H_

#define MODEL_SCHEDULE_IDLE     0x00000000
#define MODEL_SCHEDULE_OCCUPY   0x5A555A55

#define MODEL_SCHEDULE_NUM  10

typedef struct model_schedule_linked_list_unit
{
    int idleFlag;         //资源是否被占用
    void (*pfun)(void);   // 事件内容
    int timeNode;         // 执行时间
    struct model_schedule_linked_list_unit *next; // 下一个事件
} model_schedule_linked_list_unit;

typedef struct
{
    model_schedule_linked_list_unit *head;
    model_schedule_linked_list_unit linked_list_space[MODEL_SCHEDULE_NUM]; // 下一个事件
} model_schedule_linked_list;

bool model_schedule_push(model_schedule_linked_list *pLinked_list, void (*Pfun)(void), int delayTime);
void model_schedule_check(model_schedule_linked_list *pLinked_list);
void model_schedule_printf_timeNode(model_schedule_linked_list *pLinked_list);
#endif






#include "main.h"
#include "model_schedule.h"

/// @brief 添加事件
/// @param pLinked_list 事件容器
/// @param Pfun 定时事件
/// @param delayTime 定时时间
/// @return
bool model_schedule_push(model_schedule_linked_list *pLinked_list, void (*Pfun)(void), int delayTime)
{
    int index;  //事件下标

    for(index=0;index<MODEL_SCHEDULE_NUM;index++)   //寻找空闲空间
    {
        if(pLinked_list->linked_list_space[index].idleFlag!=MODEL_SCHEDULE_OCCUPY)   break;    //找到空闲空间
    }
    if(index>=MODEL_SCHEDULE_NUM) return FALSE; //未找到空闲空间,返回失败

    pLinked_list->linked_list_space[index].idleFlag = MODEL_SCHEDULE_OCCUPY;   //占用资源
    pLinked_list->linked_list_space[index].pfun = Pfun;    //添加事件
    pLinked_list->linked_list_space[index].timeNode = g_GlobalReferenceClock+delayTime;    //添加时间节点

    model_schedule_linked_list_unit **ppCurrent_unit = &pLinked_list->head;     //除了要获取指向的地址还要修改指向的地址

    while(1)
    {
        if((*ppCurrent_unit)==NULL)     //如果链表为空
        {
            (*ppCurrent_unit) = &pLinked_list->linked_list_space[index];
            return TRUE;
        }
        if(pLinked_list->linked_list_space[index].timeNode < pLinked_list->head->timeNode)   //如果插入值为最小值
        {
            pLinked_list->linked_list_space[index].next = (*ppCurrent_unit);
            (*ppCurrent_unit) = &pLinked_list->linked_list_space[index];
            return TRUE;
        }
        if((*ppCurrent_unit)->next==NULL)   //经过比较后遇到链表尾巴,只管加尾巴
        {
            (*ppCurrent_unit)->next = &pLinked_list->linked_list_space[index];
            return TRUE;
        }
        if(pLinked_list->linked_list_space[index].timeNode < (*ppCurrent_unit)->next->timeNode)     //插入中间值
        {
            pLinked_list->linked_list_space[index].next = (*ppCurrent_unit)->next;
            (*ppCurrent_unit)->next = &pLinked_list->linked_list_space[index];
            return TRUE;
        }
        ppCurrent_unit = &(*ppCurrent_unit)->next;    //指向下一个节点
    }
}

/// @brief 事件处理
/// @param pLinked_list
void model_schedule_check(model_schedule_linked_list *pLinked_list)
{
    while (pLinked_list->head!=NULL)    //如果表头不为空
    {
        if(g_GlobalReferenceClock > pLinked_list->head->timeNode)
        {
            if(pLinked_list->head->pfun!=NULL)      //事件不为空
            {
                pLinked_list->head->pfun();     //定时事件执行
            }
            model_schedule_linked_list_unit *pCurrent_unit = pLinked_list->head;     //保留原有列表地址,
            pLinked_list->head=pLinked_list->head->next;      //指向下一个事件
            memset(pCurrent_unit, 0, sizeof(model_schedule_linked_list_unit));    //释放资源
        }
        else
        {
            return;
        }
    }
}

/// @brief 打印
/// @param pLinked_list
void model_schedule_printf_timeNode(model_schedule_linked_list *pLinked_list)
{
    model_schedule_linked_list_unit *pCurrent_unit = pLinked_list->head;
    while (pCurrent_unit!=NULL)
    {
        printf("timeValue:%d\r\n", pCurrent_unit->timeNode-g_GlobalReferenceClock);
        pCurrent_unit = pCurrent_unit->next;
    }
}
————————————————
版权声明:本文为CSDN博主「嵌入式小宁」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_53592457/article/details/134558714

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1944

主题

15669

帖子

12

粉丝