面试题答案
一键面试定时器组初始化步骤
- 包含必要头文件:
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <setjmp.h> #include <time.h>
- 定义定时器数据结构:
例如定义一个简单的定时器结构体来表示定时器组中的单个定时器,如:
typedef struct { int id; int interval; // 定时器间隔时间(单位:秒) void (*callback)(void); int is_running; } Timer;
- 初始化定时器组:
假设要初始化一个包含
n
个定时器的定时器组,可以这样做:Timer* timer_group_init(int n) { Timer* timer_group = (Timer*)malloc(n * sizeof(Timer)); if (timer_group == NULL) { perror("malloc"); return NULL; } for (int i = 0; i < n; i++) { timer_group[i].id = i; timer_group[i].interval = 0; timer_group[i].callback = NULL; timer_group[i].is_running = 0; } return timer_group; }
定时器数据结构组织
- 数组:可以将定时器存放在数组中,如上述代码中的
Timer* timer_group
数组,通过数组下标可以方便地访问和管理各个定时器,优点是访问速度快,实现简单。缺点是不便于动态添加和删除定时器。 - 链表:使用链表(如单链表或双链表)来组织定时器。链表可以动态地添加和删除定时器节点,更加灵活。例如,定义一个链表节点结构体:
这种方式在查找特定定时器时可能需要遍历链表,效率相对较低,但对于动态管理定时器数量很有优势。typedef struct TimerNode { Timer timer; struct TimerNode* next; } TimerNode;
- 堆(优先队列):如果定时器需要按照时间优先级(如最早到期的定时器优先处理)来管理,可以使用堆数据结构。例如最小堆,根节点总是最早到期的定时器。堆的操作(插入、删除等)复杂度为
O(log n)
,可以高效地管理大量定时器。