| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1272 人关注过本帖
标题:二叉排序树问题
只看楼主 加入收藏
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:2 
二叉排序树问题
程序代码:
#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编辑过]

搜索更多相关主题的帖子: color 
2016-05-31 21:43
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
没有人吗
2016-06-02 10:15
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:14 
这类算法的东西,自己做个模型练习一下就可以。
2016-06-02 10:35
快速回复:二叉排序树问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064428 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved