二叉排序树问题
程序代码:
#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编辑过]