用C语言实现基于二叉搜索树的时钟管理程序

本文介绍了一个使用C语言实现的基于二叉搜索树的数据结构来管理任务超时机制的方法。该实现利用二叉搜索树的特性进行高效的时间管理,包括节点的插入、删除以及超时检查等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉搜索树具有平均操作时间复杂度为O(lgn)的优点,其实现的主要难点在删除操作。项目中需要给一些任务设定超时机制,因此需要用到时钟管理。但平台使用的是c语言,因为没有引用,实现起来特别麻烦(要涉及三重指针)。一下是程序部分:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdlib.h>
#define i32 int
#define u32 unsigned int
#define u8 unsigned char
#define i16 short int
#define TIMER_MAX_NUM 80
#define SET_TIMER_FAILURE     0UL
#define SET_TIMER_SUCCESS     1UL
#define RESULT_TIMEOUT   0x03
using namespace std;
typedef struct
{
	u32 timeout;	      //定时的值
	u8* timeoutflag;      //指针变量标志
}TIMERMANAGE_MS_TYPE;

typedef struct node_{	//二叉树的结点
	TIMERMANAGE_MS_TYPE data;
	struct node_* left;
	struct node_* right;
	struct node_* parent;
}node;

node* timerMsMgr;		//存放所有需要进行timer超时管理的timer

u32 get_boot_time(){
	return 123456789;
}

/*
*查找tree的最小结点
*/
node* tree_minimum(node* tree){
	while (tree->left != NULL)
		tree = tree->left;
	return tree;
}

/*
*查找结点x的后继
*/
node* tree_successor(node* x){
	if (x->right != NULL)
		return tree_minimum(x->right);
	node* y = x->parent;
	while (y != NULL && x == y->right){
		x = y;
		y = y->parent;
	}
	return y;
}

/*
*用v子树替换u子树
*/
void transplant(node*** u, node*** v){
	node* t = **u;
	if ((**u)->parent == NULL)
		timerMsMgr = **v;
	else if ((**u) == (**u)->parent->left)
		(**u)->parent->left = (**v);
	else
		(**u)->parent->right = (**v);
	if ((**v) != NULL)
		(**v)->parent = (**u)->parent;
}
/*
*删除结点z
*/
void tree_delete(node** z){
	node* t = *z;
	if ((*z)->left == NULL){
		node** y = &((*z)->right);
		transplant(&z, &y);
	}
	else if ((*z)->right == NULL){
		node** y = &((*z)->left);
		transplant(&z, &y);
	}
	else{
		node* y = tree_minimum((*z)->right);
		node** yp = &y;
		if (y->parent != (*z)){
			node** yrp = &(y->right);
			transplant(&yp, &yrp);
			y->right = (*z)->right;
			y->right->parent = y;
		}
		transplant(&z, &yp);
		y->left = (*z)->left;
		y->left->parent = y;
	}
	free(t);
}
/*
*根据timeoutflag查找结点
*/
node* tree_search(node* tree, u8* timeoutflag){
	if (tree == NULL || timeoutflag == tree->data.timeoutflag)
		return tree;
	if (timeoutflag < tree->data.timeoutflag)
		return tree_search(tree->left, timeoutflag);
	else
		return tree_search(tree->right, timeoutflag);
}
//timer初始化
void timer_init(void)
{
	cout<<"timer_init \r\n"<<endl;
	timerMsMgr = NULL;
	cout<<"timer_init done \r\n"<<endl;
}

//添加指定timer
u8 timer_add(node** tree, node* p,u32 timeout, u8 *timeoutflag)
{
	//Logi("timer_add \r\n");
	if (*tree == NULL){
		*tree = (node*)malloc(sizeof(node));
		if (*tree == NULL)
			return SET_TIMER_FAILURE;
		(*tree)->data.timeout = timeout;
		(*tree)->data.timeoutflag = timeoutflag;
		(*tree)->left = NULL;
		(*tree)->right = NULL;
		(*tree)->parent = p;
		return SET_TIMER_SUCCESS;
	}
	else if (timeoutflag < (*tree)->data.timeoutflag){
		timer_add(&((*tree)->left), (*tree), timeout, timeoutflag);
	}
	else{
		timer_add(&((*tree)->right), (*tree), timeout, timeoutflag);
	}
}

//前序遍历
void timer_process(node** tree)
{
	if (*tree == NULL){
		return;
	}
	if (get_boot_time() >= (*tree)->data.timeout)
	{
		*((*tree)->data.timeoutflag) = RESULT_TIMEOUT;
		(*tree)->data.timeout = 0;
		cout << "(" << (int)(*tree)->data.timeoutflag << "," << (int)*((*tree)->data.timeoutflag) << ")" << endl;
	}
	timer_process(&((*tree)->left));
	timer_process(&((*tree)->right));
}

//删除指定timer
void timer_delete(node** tree,u8 *timeoutflag)
{
	node* y = tree_search(timerMsMgr, timeoutflag);
	tree_delete(&y);
}
int main()
{
	u8 tim[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 ,10};
	for (int i = 0; i < 10; i++)
		cout << (int)(&tim[i]) << endl;
	timer_add(&timerMsMgr, NULL, 567, &tim[1]);
	timer_add(&timerMsMgr, NULL, 567, &tim[0]);
	timer_add(&timerMsMgr, NULL, 567, &tim[2]);
	timer_add(&timerMsMgr, NULL, 567, &tim[3]);
	timer_add(&timerMsMgr, NULL, 567, &tim[4]);
	timer_add(&timerMsMgr, NULL, 567, &tim[5]);
	timer_add(&timerMsMgr, NULL, 567, &tim[6]);
	timer_add(&timerMsMgr, NULL, 567, &tim[7]);
	timer_add(&timerMsMgr, NULL, 567, &tim[8]);
	timer_add(&timerMsMgr, NULL, 567, &tim[9]);
	timer_delete(&timerMsMgr, &tim[8]);
	timer_delete(&timerMsMgr, &tim[3]);
	timer_process(&timerMsMgr);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值