平衡二叉树学生信息管理系统程序.docx
《平衡二叉树学生信息管理系统程序.docx》由会员分享,可在线阅读,更多相关《平衡二叉树学生信息管理系统程序.docx(18页珍藏版)》请在冰豆网上搜索。
平衡二叉树学生信息管理系统程序
#include
#include
typedefstructA
{
charNO[10];
charname[10];
charbirt[10];
charclas[10];
charsex[2];
}Elemtype;
typedefstructB
{
Elemtypedata;
intbf;
structB*lchild;
structB*rchild;
}node,*pnode;
voidleft1(pnode&ptree,int&taller)
{
pnodep1,p2;
if(ptree->bf==0)
{
ptree->bf=1;
taller=1;
}
elseif(ptree->bf==-1)
{
ptree->bf=0;
taller=0;
}
else
{
p1=ptree->lchild;
if(p1->bf==1)
{
ptree->lchild=p1->rchild;
p1->rchild=ptree;
ptree->bf=p1->bf=0;
ptree=p1;
}
elseif(p1->bf==-1)
{
p2=p1->rchild;
p1->rchild=p2->lchild;
p2->lchild=p1;
ptree->lchild=p2->rchild;
p2->rchild=ptree;
if(p2->bf==0)
ptree->bf=p1->bf=0;
elseif(p2->bf==1)
{
p1->bf=0;
ptree->bf=-1;
}
else
{
p1->bf=1;
ptree->bf=0;
}
ptree=p2;
ptree->bf=0;
}
taller=0;
}
}
voidright1(pnode&ptree,int&taller)
{
pnodep1,p2;
if(ptree->bf==0)
{
ptree->bf=-1;
taller=1;
}
elseif(ptree->bf==1)
{
ptree->bf=0;
taller=0;
}
else
{
p1=ptree->rchild;
if(p1->bf==-1)
{
ptree->rchild=p1->lchild;
p1->lchild=ptree;
ptree->bf=p1->bf=0;
ptree=p1;
}
elseif(p1->bf==1)
{
p2=p1->lchild;
p1->lchild=p2->rchild;
p2->rchild=p1;
ptree->rchild=p2->lchild;
p2->lchild=ptree;
if(p2->bf==0)
ptree->bf=p1->bf=0;
elseif(p2->bf==-1)
{
p1->bf=0;
ptree->bf=1;
}
else
{
p1->bf=-1;
ptree->bf=0;
}
ptree=p2;
ptree->bf=0;
}
taller=0;
}
}
intinsert(pnode&ptree,Elemtypee,int&taller)
{
if(ptree==NULL)
{
ptree=newnode;
ptree->data=e;
ptree->lchild=ptree->rchild=NULL;
ptree->bf=0;
taller=1;
}
else
{
if(strcmp(e.NO,ptree->data.NO)==0)
{
taller=0;
return0;
}
if(strcmp(e.NO,ptree->data.NO)<0)
{
if((insert(ptree->lchild,e,taller))==0)
return0;
if(taller==1)
left1(ptree,taller);
}
else
{
if((insert(ptree->rchild,e,taller))==0)
return0;
if(taller==1)
right1(ptree,taller);
}
}
return1;
}
voidleft2(pnode&ptree,int&taller)
{
pnodep1,p2;
if(ptree->bf==1)
{
ptree->bf=0;
taller=1;
}
elseif(ptree->bf==0)
{
ptree->bf=-1;
taller=0;
}
else
{
p1=ptree->rchild;
if(p1->bf==0)
{
ptree->rchild=p1->lchild;
p1->lchild=ptree;
p1->bf=1;
ptree->bf=-1;
ptree=p1;
taller=0;
}
elseif(p1->bf==-1)
{
ptree->rchild=p1->lchild;
p1->lchild=ptree;
ptree->bf=p1->bf=0;
ptree=p1;
taller=1;
}
else
{
p2=p1->lchild;
p1->lchild=p2->rchild;
p2->rchild=p1;
ptree->rchild=p2->lchild;
p2->lchild=ptree;
if(p2->bf==0)
{
ptree->bf=0;
p1->bf=0;
}
elseif(p2->bf==-1)
{
ptree->bf=1;
p1->bf=0;
}
else
{
ptree->bf=0;
p1->bf=-1;
}
p2->bf=0;
ptree=p2;
taller=1;
}
}
}
voidright2(pnode&ptree,int&taller)
{
pnodep1,p2;
if(ptree->bf==-1)
{
ptree->bf=0;
taller=1;
}
elseif(ptree->bf==0)
{
ptree->bf=1;
taller=0;
}
else
{
p1=ptree->lchild;
if(p1->bf==0)
{
ptree->lchild=p1->rchild;
p1->rchild=ptree;
p1->bf=-1;
ptree->bf=1;
ptree=p1;
taller=0;
}
elseif(p1->bf==1)
{
ptree->lchild=p1->rchild;
p1->rchild=ptree;
ptree->bf=p1->bf=0;
ptree=p1;
taller=1;
}
else
{
p2=p1->rchild;
p1->rchild=p2->lchild;
p2->lchild=p1;
ptree->lchild=p2->rchild;
p2->rchild=ptree;
if(p2->bf==0)
{
ptree->bf=0;
p1->bf=0;
}
elseif(p2->bf==1)
{
ptree->bf=-1;
p1->bf=0;
}
else
{
ptree->bf=0;
p1->bf=1;
}
p2->bf=0;
ptree=p2;
taller=1;
}
}
}
voiddelete2(pnodeq,pnode&r,int&taller)
{
if(r->rchild==NULL)
{
q->data=r->data;
q=r;
r=r->lchild;
deleteq;
taller=1;
}
else
{
delete2(q,r->rchild,taller);
if(taller==1)
right2(r,taller);
}
}
intdelete1(pnode&ptree,charx[10],int&taller)
{
intk;
pnodeq;
if(ptree==NULL)
return0;
elseif(strcmp(x,ptree->data.NO)<0)
{
k=delete1(ptree->lchild,x,taller);
if(taller==1)
left2(ptree,taller);
returnk;
}
elseif(strcmp(x,ptree->data.NO)>0)
{
k=delete1(ptree->rchild,x,taller);
if(taller==1)
right2(ptree,taller);
returnk;
}
else
{
q=ptree;
if(ptree->rchild==NULL)
{
ptree=ptree->lchild;
deleteq;
taller=1;
}
elseif(ptree->lchild==NULL)
{
ptree=ptree->rchild;
deleteq;
taller=1;
}
else
{
delete2(q,q->lchild,taller);
if(taller==1)
left2(q,taller);
ptree=q;
}
return1;
}
}
voidcreate(pnode&ptree,intn)
{
intj;
Elemtypee;
printf("输入学生信息:
姓名,学号,生日,班级,性别\n");
for(inti=0;i{
scanf("%s%s%s%s%s",e.name,e.NO,e.birt,e.clas,e.sex);
insert(ptree,e,j);
}
}
voiddisplay(pnodeptree)
{
if(ptree)
{
display(ptree->lchild);
printf("%-10s%-10s%-10s%-10s%-10s\n",ptree->data.name,ptree->data.NO,ptree->data.birt,ptree->data.clas,ptree->data.sex);
display(ptree->rchild);
}
}
voidfind(pnodeptree,char*ch)
{
if(ptree)
{
if(strcmp(ptree->data.name,ch)==0)
{
printf("姓名学号生日班级性别\n");
printf("%-10s%-10s%-10s%-10s%-10s\n\n",ptree->data.name,ptree->data.NO,ptree->data.birt,ptree->data.clas,ptree->data.sex);
return;
}
else
{
find(ptree->lchild,ch);
find(ptree->rchild,ch);
}
}
}
voidsave(pnodeptree,FILE*p)
{
if(ptree)
{
save(ptree->lchild,p);
p=fopen("student.txt","a");
fprintf(p,"%s\t%s\t%s\t%s\t%s\n",ptree->data.name,ptree->data.NO,ptree->data.birt,ptree->data.clas,ptree->data.sex);
fclose(p);
save(ptree->rchild,p);
}
}
voidread(pnode&ptree,FILE*p)
{
intj;
charc;
Elemtypee;
if((p=fopen("student.txt","r"))==NULL)
return;
while((c=fgetc(p))!
=EOF)
{
fscanf(p,"%s%s%s%s%s",e.name,e.NO,e.birt,e.clas,e.sex);
insert(ptree,e,j);
}
fclose(p);
}
voidPrint(pnodeptree,intindent)
{
if(ptree==NULL)
return;
for(inti=0;iprintf("|-----");
printf("%-10s%-10s%-10s%-10s%-10s\n",ptree->data.name,ptree->data.NO,ptree->data.birt,ptree->data.clas,ptree->data.sex);
Print(ptree->lchild,indent+1);
Print(ptree->rchild,indent+1);
}
voidchange(pnodeptree,Elemtypee)
{
if(ptree==NULL)
return;
else
{
if(strcmp(ptree->data.NO,e.NO)==0)
{
ptree->data=e;
return;
}
else
{
change(ptree->lchild,e);
change(ptree->rchild,e);
}
}
}
voidmale(pnodeptree)
{
charm[2]={"m"};
if(ptree)
{
male(ptree->lchild);
if(strcmp(ptree->data.sex,m)==0)
printf("%-10s%-10s%-10s%-10s%-10s\n",ptree->data.name,ptree->data.NO,ptree->data.birt,ptree->data.clas,ptree->data.sex);
male(ptree->rchild);
}
}
voidfmale(pnodeptree)
{
charm[2]={"f"};
if(ptree)
{
fmale(ptree->lchild);
if(strcmp(ptree->data.sex,m)==0)
printf("%-10s%-10s%-10s%-10s%-10s\n",ptree->data.name,ptree->data.NO,ptree->data.birt,ptree->data.clas,ptree->data.sex);
fmale(ptree->rchild);
}
}
voidmain()
{
intz;
FILE*p=NULL;
pnodeptree=NULL;
printf("请选择:
\n1------------------载入学生信息\n2------------------重新创建信息\n");
scanf("%d",&z);
if(z==1)
read(ptree,p);
Elemtypee,a;
intt=1;
charch[10],x[10];
intj,k,n;
while(t)
{
printf("********平衡二叉树实现学生基本信息管理********\n");
printf("***********************************************\n\n");
printf("1------------------------------------------创建\n");
printf("2------------------------------------------插入\n");
printf("3------------------------------------------删除\n");
printf("4------------------------------------------修改\n");
printf("5------------------------------------------查找\n");
printf("6------------------------------------------显示\n");
printf("7------------------------------------------排序\n");
printf("8------------------------------------------分组\n");
printf("9------------------------------------------保存\n");
printf("0------------------------------------------退出\n");
printf("输入操作选项(0--9)\n");
scanf("%d",&k);
switch(k)
{
case1:
printf("输入要创建的学生数\n");
scanf("%d",&n);
create(ptree,n);
break;
case2:
printf("输入学生信息:
姓名,学号,生日,班级,性别\n");
scanf("%s%s%s%s%s",e.name,e.NO,e.birt,e.clas,e.sex);
insert(ptree,e,j);
break;
case3:
printf("输入要删除的学生的学号\n");
scanf("%s",x);
delete1(ptree,x,j);
break;
case4:
printf("输入修改后的信息:
姓名,学号,生日,班级,性别\n");
scanf("%s%s%s%s%s",a.name,a.NO,a.birt,a.clas,a.sex);
change(ptree,a);
break;
case5:
printf("输入要查找的学生姓名\n");
scanf("%s",ch);
find(ptree,ch);
printf("\n");
break;
case6:
printf("凹入显示:
\n\n");
Print(ptree,0);
printf("\n");
break;
case7:
printf("按学号排序结果如下:
\n\n");
printf("姓名学号生日班级性别\n");
display(ptree);
printf("\n");
break;
case8:
printf("男生基本信息如下:
\n\n");
male(ptree);
printf("\n");
printf("女生基本信息如下:
\n\n");
fmale(ptree);
printf("\n");
break;
case9:
p=fopen("student.txt","wt");
fprintf(p,"\n");
fclose(p);
save(ptree,p);
printf("学生信息已存入文件\n\n");
break;
case0:
printf("谢谢使用,再见\n");
t=0;
break;
}
}
}