递归结构体数组链表实现

一:在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;
    }
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值