您的位置:首页 > 编程语言 > C语言/C++

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

2018-01-04 19:56 645 查看
二叉搜索树具有平均操作时间复杂度为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: