• 递归结构体数组链表实现


    1. #ifndef _MODEL_SCHEDULE_H_
    2. #define _MODEL_SCHEDULE_H_
    3. #define MODEL_SCHEDULE_IDLE 0x00000000
    4. #define MODEL_SCHEDULE_OCCUPY 0x5A555A55
    5. #define MODEL_SCHEDULE_NUM 10
    6. typedef struct model_schedule_linked_list_unit
    7. {
    8. int idleFlag; //资源是否被占用
    9. void (*pfun)(void); // 事件内容
    10. int timeNode; // 执行时间
    11. struct model_schedule_linked_list_unit *next; // 下一个事件
    12. } model_schedule_linked_list_unit;
    13. typedef struct
    14. {
    15. model_schedule_linked_list_unit *head;
    16. model_schedule_linked_list_unit linked_list_space[MODEL_SCHEDULE_NUM]; // 下一个事件
    17. } model_schedule_linked_list;
    18. bool model_schedule_push(model_schedule_linked_list *pLinked_list, void (*Pfun)(void), int delayTime);
    19. void model_schedule_check(model_schedule_linked_list *pLinked_list);
    20. #endif
    21. #include "main.h"
    22. #include "model_schedule.h"
    23. /// @brief 添加事件
    24. /// @param pLinked_list 事件容器
    25. /// @param Pfun 定时事件
    26. /// @param delayTime 定时时间
    27. /// @return
    28. bool model_schedule_push(model_schedule_linked_list *pLinked_list, void (*Pfun)(void), int delayTime)
    29. {
    30. int index; //事件下标
    31. for(index=0;index<MODEL_SCHEDULE_NUM;index++) //寻找空闲空间
    32. {
    33. if(pLinked_list->linked_list_space[index].idleFlag!=MODEL_SCHEDULE_OCCUPY) break; //找到空闲空间
    34. }
    35. if(index>=MODEL_SCHEDULE_NUM) return FALSE; //未找到空闲空间,返回失败
    36. pLinked_list->linked_list_space[index].idleFlag = MODEL_SCHEDULE_OCCUPY; //占用资源
    37. pLinked_list->linked_list_space[index].pfun = Pfun; //添加事件
    38. pLinked_list->linked_list_space[index].timeNode = g_GlobalReferenceClock+delayTime; //添加时间节点
    39. model_schedule_linked_list_unit **ppCurrent_unit = &pLinked_list->head; //定义临时变量
    40. while(1)
    41. {
    42. if((*ppCurrent_unit)==NULL) //如果链表为空
    43. {
    44. (*ppCurrent_unit) = &pLinked_list->linked_list_space[index];
    45. return TRUE;
    46. }
    47. if(pLinked_list->linked_list_space[index].timeNode < pLinked_list->head->timeNode) //如果插入值为最小值
    48. {
    49. pLinked_list->linked_list_space[index].next = (*ppCurrent_unit);
    50. (*ppCurrent_unit) = &pLinked_list->linked_list_space[index];
    51. return TRUE;
    52. }
    53. if((*ppCurrent_unit)->next==NULL) //经过比较后遇到链表尾巴
    54. {
    55. (*ppCurrent_unit)->next = &pLinked_list->linked_list_space[index];
    56. return TRUE;
    57. }
    58. if(pLinked_list->linked_list_space[index].timeNode < (*ppCurrent_unit)->next->timeNode) //插入中间值
    59. {
    60. pLinked_list->linked_list_space[index].next = (*ppCurrent_unit)->next;
    61. (*ppCurrent_unit)->next = &pLinked_list->linked_list_space[index];
    62. return TRUE;
    63. }
    64. ppCurrent_unit = &(*ppCurrent_unit)->next; //指向下一个节点
    65. }
    66. }
    67. /// @brief 处理事件
    68. void model_schedule_check(model_schedule_linked_list *pLinked_list)
    69. {
    70. while (pLinked_list->head!=NULL) //如果表头不为空
    71. {
    72. if(g_GlobalReferenceClock > pLinked_list->head->timeNode)
    73. {
    74. if(pLinked_list->head->pfun!=NULL) //事件不为空
    75. {
    76. pLinked_list->head->pfun(); //定时事件执行
    77. }
    78. model_schedule_linked_list_unit *pCurrent_unit = pLinked_list->head; //保留原有列表地址,
    79. pLinked_list->head=pLinked_list->head->next; //指向下一个事件
    80. memset(pCurrent_unit, 0, sizeof(model_schedule_linked_list_unit)); //释放资源
    81. }
    82. }
    83. }
    84. void model_schedule_printf_timeNode(model_schedule_linked_list *pLinked_list)
    85. {
    86. model_schedule_linked_list_unit *pCurrent_unit = pLinked_list->head;
    87. while (pCurrent_unit!=NULL)
    88. {
    89. printf("timeValue:%d\r\n", pCurrent_unit->timeNode-g_GlobalReferenceClock);
    90. pCurrent_unit = pCurrent_unit->next;
    91. }
    92. }

  • 相关阅读:
    javaweb-响应字符数据
    毕业设计 基于大数据的服务器数据分析与可视化系统 -python 可视化 大数据
    【图论】最小生成树(python和cpp)
    设计模式---模板方法模式
    Java面试八股文 2021年最新Java面试题及答案汇总
    Salesforce业务分析师(BA)认证—备考指南
    173. 二叉搜索树迭代器
    压测必经之路,Jmeter分布式压测教程
    前8月,超百万台标配!高阶智驾域控「新」变化
    电大搜题——赋能学习,助力广东开放大学学子
  • 原文地址:https://blog.csdn.net/weixin_53592457/article/details/134558714