• 大小: 11KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-08
  • 语言: C/C++
  • 标签: 二叉树  

资源简介

该程序用c++语言编写,主要用到数据结构中的二叉树,做的职工管理系统,主要用于其创建,查找,删除,添加等

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include
#include
#define LH 1//左高 
#define EH 0//等高 
#define RH -1//右高 
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0
#define MAXSIZE 20
char filename[30];
FILE *fp;

typedef struct{
int number;
char name[10];
float wage;
int age;
}worker;


typedef struct tree
{
worker data;
int bf;//节点平衡因子
struct tree *rchild*lchild;
}node*bitree;

int insert(bitree &tworker xbool &taller);
int  input()
{
int jn=0;
worker wor[MAXSIZE];
printf(“输入文件名\n“);
scanf(“%s“filename);
if((fp=fopen(“filename““w+“))==NULL)
{
printf(“the file error!\n“);
exit(0);
}
printf(“输入要录入的职工个数\n“);
scanf(“%d“&n);
printf(“输入%d个职工信息 职工号 姓名,工资,年龄 \n“n);
for(j=0;j {
scanf(“%d%s%f%d“&wor[j].numberwor[j].name&wor[j].wage&wor[j].age);
getchar();
}
for(j=0;j fprintf(fp“%-3d %-10s %-8f %-5d\n“wor[j].numberwor[j].namewor[j].wagewor[j].age);
fclose(fp);
return n;
}



void creat(int nbitree &t)
{//构建平衡排序树
int i;
bool taller=FALSE;
t=NULL;
worker wor;
if(n==0)
exit(0);
if((fp=fopen(“filename““r“))==NULL)
{
printf(“the file error\n“);
exit(0);
}
fscanf(fp“%d%s%f%d“&wor.numberwor.name&wor.wage&wor.age);
for(i=0;i {
insert(twortaller);
fscanf(fp“%d%s%f%d“&wor.numberwor.name&wor.wage&wor.age);
}
fclose(fp);
}



void r_rotate(bitree &t)
{//对以*t为根的二叉排序树作右旋转处理,处理之后t指向新的树根节点
// 即旋转之前的左子树的根节点
bitree lc=t->lchild;
t->lchild=lc->rchild;
lc->rchild=t;
t=lc;
}

void l_rotate(bitree &t)
{//对以*p为跟的二叉排序树作左旋转处理,处理之后p指向新的树根节点
// 即旋转之前的右子树的根节点
bitree rc=t->rchild;
t->rchild=rc->lchild;
rc->lchild=t;
t=rc;
}


void leftbalance(bitree &t)
{//对以指针t所指节点为根的二叉树作左平衡旋转处理,本算法结束时,指针t指向新的根节点
bitree lc=t->lchild;
switch(lc->bf)
{
case LH: //新节点插入在*t的左孩子的左子树上,要作单右旋处理 
t->bf = lc->bf = EH;
r_rotate(t);
break;
case RH: //新节点插入在*t的左孩子的右子树上,要作双旋处理 
bitree rd = lc->rchild;
switch(rd->bf)
{//修改*T及其孩子的平衡因子 
case LH:
t->bf = RH; 
lc->bf = EH;
break;
case EH:
t->bf = lc->bf = EH; 
break;
case RH:
t->bf = EH; 
lc->bf = LH; 
break;
}
rd->bf = EH;
l_rotate(t->lchild);//对*t的左子树作左平衡处理 
r_rotate(t);//对*t作右旋平衡处理 
break;
}
}


void rightbalance(bitree &t)
{//对以指针t所指节点为根的二叉树作右平衡旋转处理,本算法结束时,指针t指向新的根节点 
    bitree rc = t->rchild;
    switch(rc->bf)//检查*T的右子树的平衡度,并作相应的平衡处理 
    {
        case RH:
            //新节点插入在*t的右孩子的右子树上,要作单左旋处理 
            t->bf = rc->bf = EH;
            l_rotate(t); 
break;
        case LH: 
            //新节点插入在*t的右孩子的左子树上,要作双旋处理 
            bitree ld = rc->lchild;
            switch(ld->bf)
            {//修改*t及其孩子的平衡因子 
                case RH:
t->bf = LH;
rc->bf = EH; 
break;
                case EH:
t->bf = rc->bf = EH; 
break;
                case LH:

评论

共有 条评论