二叉排序树问题
程序代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
void divide();//判断等级
void Load();//加载文件中的员工信息
void save();//以二进制保存到文件中
void Input();//录入员工信息
void Display();//输出所有员工信息
void displayone();//输出某一员工信息
void modify();//修改某一员工信息
void search();//查询某一员工信息
void Delete();//删除某一员工信息
void count();//统计员工人数
void sort();//对员工信息进行排序
typedef struct
{
int eid; //员工号
char name[30]; //姓名
char gender[10]; //性别
int age; //年龄
double score; //综合得分
char level; //等级
}employee;
typedef struct list
{
employee person;
struct list* next;
}list,temp;
//定义一个头结点
list *Init()
{
list *head;
head=(list *)malloc(sizeof(list));
if(head==NULL)
return NULL;//申请失败
head->next=NULL;
return head;
}
//等级判断
void divide(list *head)
{
list *q;
q=head;
while(q!=NULL)
{
if((q->person.score)>=90) q->person.level='O';
else if((q->person.score)>=80) q->person.level='E';
else if((q->person.score)>=70) q->person.level='A';
else if((q->person.score)>=60) q->person.level='P';
else if(60>(q->person.score)) q->person.level='D';
q=q->next;
}
}
//读取文件中的数据
void Load(list *head)
{
FILE *fp;
list *p,*q;
p=head;
p->next=NULL;
if(0==access("c:\\配置.ini",0))
{
if((fp=fopen("c:\\配置.ini","rb"))==NULL) return;
do
{
q=(list *)malloc(sizeof(list));
if(q!=NULL)
{
if(1==fread(q,sizeof(employee),1,fp))
{
p->next=q;
q->next=NULL;
p=p->next;
}
else
{
q=NULL;
}
}
}
while(q);
fclose(fp);
}
}
//保存到文件中
void save(list *head)
{
FILE *fp;
list *p;
if((fp=fopen("c:\\配置.ini","wb"))==NULL)
{
printf("文件无法创建请重试!\n");
}
p=head->next;
while(p!=NULL)
{
if(fwrite(p,sizeof(employee),1,fp)!=1)
printf("文件写入错误!\n");
p=p->next;
}
printf("文件写入成功!\n");
fclose(fp);
}
//录入员工数据
void Input(list *head)
{
char ch;
list *p,*q;
p=head;
while(p->next!=NULL)
p=p->next;
do
{
q=(list *)malloc(sizeof(list));
fflush(stdin);
printf("请输入员工的信息。\n");
printf("工号:");
scanf("%d",&q->person.eid);
printf("姓名:");
scanf("%s",q->person.name);
printf("性别:");
scanf("%s",q->person.gender);
printf("年龄:");
scanf("%d",&q->person.age);
printf("综合得分:");
q->person.score=q->person.score;
scanf("%lf",&q->person.score);
q->next=NULL;
p->next=q;
p=p->next;
divide(head);
printf("录入员工%s成功,是否继续录入?(Y/N) ",q->person.name);
fflush(stdin);
ch=getchar();
}
while(ch!='N'&&ch!='n');
save(head);
}
//读出数据
void Display(list *head)
{
list *q;
q=head->next;
printf("\n-----------------------------------------------------");
printf("\n%-s\t%-s\t%-s\t%-s\t%-s\t%-s","工号","姓名","性别","年龄","综合得分","等级");
printf("\n-----------------------------------------------------");
while(q!=NULL)
{
printf("\n%-d",q->person.eid);
printf("\t%-s",q->person.name);
printf("\t%-s",q->person.gender);
printf("\t%-d",q->person.age);
printf("\t%-0.1f",q->person.score);
printf("\t\t%-c",q->person.level);
q=q->next;//指向下一员工
}
printf("\n-----------------------------------------------------");
printf("\n");
}
//读取某一人的数据
void displayone(list *p)
{
if(p!=NULL)
{
printf("\n-----------------------------------------------------");
printf("\n%-s\t%-s\t%-s\t%-s\t%-s\t%-s","工号","姓名","性别","年龄","综合得分","等级");
printf("\n-----------------------------------------------------");
printf("\n%-d",p->person.eid);
printf("\t%-s",p->person.name);
printf("\t%-s",p->person.gender);
printf("\t%-d",p->person.age);
printf("\t%-0.1f",p->person.score);
printf("\t\t%-c",p->person.level);
printf("\n-----------------------------------------------------");
printf("\n");
}
}
//修改员工信息
void modify(list *head)
{
list *p;
int ID;
char c_name[30];
char c_gender[10];
int c_age;
double c_score;
printf("\t\t请输入需要修改的员工工号:");
scanf("%d",&ID);
p=head->next;
while(p)
{
if(ID==p->person.eid)
break;
p=p->next;
}
if(p!=NULL)
{
displayone(p);
printf("请输入修改后的值(如果某项不修改,请输入0)\n");
fflush(stdin);
printf("姓名:");
scanf("%s",c_name);
if(strcmp(c_name,"0")!=0)
strcpy(p->person.name,c_name);
printf("性别:");
scanf("%s",c_gender);
if(strcmp(c_gender,"0")!=0)
strcpy(p->person.name,c_gender);
printf("年龄:");
scanf("%d",&c_age);
if(c_age!=0)
p->person.age=c_age;
printf("综合得分:");
scanf("%lf",&c_score);
if(c_score!=0)
p->person.score=c_score;
divide(head);
save(head);
}
else
{
printf("\t\t没有工号为%d的员工!",ID);
}
}
//查找员工信息
void search(list *head)
{
int choice;
char srchname[30]={0};
int srcheid=0;
list *p;
p=head;
printf("\t\t1.按照员工号查找\n\t\t2.按照姓名查找\n\t\t0.退出查找\n\t\t请选择查找内容:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("\t\t请输入查找的员工的员工号:");
scanf("%d", &srcheid);
while (p!=NULL)
{
if(srcheid==p->person.eid)
{
displayone(p);
break;
}
p = p->next;
}
if(p==NULL)
printf("\t\t查无此人!请核对后再次查找。\n");
break;
case 2:
printf("\t\t请输入查找的员工的姓名:");
scanf("%s",srchname);
p=p->next;
while (p!=NULL)
{
if(strcmp(srchname,p->person.name)==0)
{
displayone(p);
break;
}
p = p->next;
}
if(p==NULL)
printf("\t\t查无此人!请核对后再次查找。\n");
break;
case 0:
return;
}
}
//删除员工信息
void Delete(list *head)
{
list *p,*q;
int eid,choice;
char ch,name[30];
p=head;
printf("\t\t1.按照员工号删除\n\t\t2.按照姓名删除\n\t\t0.退出删除\n\t\t请选择删除方式:");
scanf("%d",&choice);
switch(choice)
{
case 0:
break;
case 1:
printf("请输入需要删除的员工的员工号:");
scanf("%d",&eid);
while(p!=NULL&&p->next->person.eid!=eid)//指向要删除员工的前一位置
{
p=p->next;
}
if(p->next!=NULL)
{
displayone(p->next);
printf("是否确定删除该员工,一经删除无法恢复(Y/N):");
fflush(stdin);
ch=getchar();
if(ch=='Y'||ch=='y')
{
q=p->next;
p->next=q->next;
free(q);
save(head);
printf("删除成功!\n");
}
}
else
{
printf("对不起,没有该员工查证后请重新操作。\n");
}
break;
case 2:
printf("请输入需要删除的员工的员工姓名:");
scanf("%s",name);
while(p!=NULL&&strcmp(p->next->person.name,name)!=0)//指向要删除员工的前一位置
{
p=p->next;
}
if(p->next!=NULL)
{
displayone(p->next);
printf("是否确定删除该员工,一经删除无法恢复(Y/N):");
fflush(stdin);
ch=getchar();
if(ch=='Y'||ch=='y')
{
q=p->next;
p->next=q->next;
free(q);
save(head);
printf("删除成功!\n");
}
}
else
{
printf("对不起,没有该员工查证后请重新操作。\n");
}
break;
}
}
//统计人数
void count(list *head)
{
list *p;
int O,E,A,P,D,sum;
sum=0;//员工总人数
O=0;//Outstanding等级的员工人数
E=0;//Excelent等级的员工人数
A=0;//Acceptable等级的员工人数
P=0;//Poor等级的员工人数
D=0;//Dreadful等级的员工人数
p=head->next;
while(p!=NULL)
{
if((p->person.score)>=90) O++;
else if((p->person.score)>=80) E++;
else if((p->person.score)>=70) A++;
else if((p->person.score)>=60) P++;
else if(60>(p->person.score)) D++;
p=p->next;
}
sum=O+E+A+P+D;
printf("共有员工%d人\n",sum);
printf("评价等级为Outstanding的人数是%d\n",O);
printf("评价等级为Excelent的人数是%d\n",E);
printf("评价等级为Acceptable的人数是%d\n",A);
printf("评价等级为Poor的人数是%d\n",P);
printf("评价等级为Dreadful的人数是%d\n",D);
}
//冒泡排序算法
void sort(list *head)
{
int choice;
list *p,*q,*temp;
temp=(list *)malloc(sizeof(list));
temp->next=NULL;
int flag=0;
p=head;
q=head->next;
printf("\t\t1.按照员工号进行排序\n\t\t2.按照年龄排序\n\t\t3.按照综合得分进行排序\n\t\t0.退出\n\t\t请选择排序方式(0-3):");
scanf("%d",&choice);
switch(choice)
{
case 1:
while(p!=NULL)
{
while(q!=NULL)
{
if(p->person.eid>q->person.eid)
{
temp->person=p->person;
p->person=q->person;
q->person=temp->person;
}
q=q->next;
}
p=p->next;
q=p;
flag=1;
}
case 2:
while(p!=NULL)
{
while(q!=NULL)
{
if(p->person.age>q->person.age)
{
temp->person=p->person;
p->person=q->person;
q->person=temp->person;
}
q=q->next;
}
p=p->next;
q=p;
flag=1;
}
case 3:
while(p!=NULL)
{
while(q!=NULL)
{
if(p->person.score>q->person.score)
{
temp->person=p->person;
p->person=q->person;
q->person=temp->person;
}
q=q->next;
}
p=p->next;
q=p;
flag=1;
}
}
}
//菜单
int menu()
{
char c;
do{
system("cls");
printf("\t\t************** 员工管理系统 **************\n");
printf("\t\t 1.读取当前文件已有员工信息 \n");
printf("\t\t 2.录入员工信息 \n");
printf("\t\t 3.显示所有员工信息 \n");
printf("\t\t 4.查询员工信息 \n");
printf("\t\t 5.修改员工信息 \n");
printf("\t\t 6.删除员工信息 \n");
printf("\t\t 7.统计员工信息 \n");
printf("\t\t 8.对员工信息进行排序 \n");
printf("\t\t 0.退出系统 \n");
printf("\t\t******************************************\n");
printf("\t\t请输入您的选择(0-8):");
fflush(stdin);
c=getchar();
}
while(c<'0'||c>'8');
return(c-'0');
}
void main()
{
list *head;
head=Init();
while(1)
{
switch(menu())
{
case 0:
printf("\t\t谢谢使用本程序,再见!\n");
printf("\t\t");
system("pause");
exit(0);
case 1:
Load(head);
system("pause");
break;//读取当前文件已有员工信息
case 2:Input(head);
system("pause");
break;//录入员工信息
case 3:
Display(head);
system("pause");
break;//输出员工信息
case 4:
search(head);
system("pause");
break;//查询员工信息
case 5:
modify(head);
system("pause");
break;//修改员工信息
case 6:
Delete(head);
system("pause");
break;//删除员工信息
case 7:
count(head);
system("pause");
break;//统计员工信息
case 8:
sort(head);
system("pause");//排序
break;
}
}
}
我现在想使用二叉排序树插入员工记录,从而可以较快的根据员工号查询并修改某位员工的信息;使用二叉树中序遍历查出得分最高和最低的员工信息,统计每一等级的员工数目。
怎么修改???
求大神写清楚点,让我看明白点
[此贴子已经被作者于2016-5-31 21:44编辑过]







