#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"string.h"
#define N 1000
struct student            /*ѧϢ*/
{
    char num[20];     /*ѧ*/
    char name[20];    /**/
    char sex;         /* Ա'1'->, '0'->Ů*/
    short age;        /**/
    short score[3];   /*ſγ̵ĳɼ*/
    short sum;        /*ܳɼ*/
    short deptid;     /*ϵϵ*/
    struct student *next1;
    struct student *next2;
}*head;
struct student std[N];

struct department           /*ϵϢܹ3ϵ*/
{
    short id;           /*ϵ*/
    char name[20];      /*ϵ*/
    char dean[20];      /*ϵ*/
    char location[30];  /*ϵİ칫ص*/
}depa[3]={{1,"ϵ","","¥505"},{2,"ϵ","","¥404"},{3,"ϵ","","ʵ¥401"}};
void menu()
{
    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("10. ѧϢļ\n");
    printf("11. ļѧϢ\n");
    printf("12. ɼӸߵʾѧϢ[ѡĿ]\n");
    printf("0. ˳ϵͳ\n");
}
//¼ѧϢ
void create()
{
    int i,j;
    char tmp[30];
    struct student *p;
    head=NULL;
    for(i=1;;i++)
    {
        if(i!=1)
        {
            printf("Ƿ¼(y/n):");
            gets(tmp);
            if(strcmp(tmp,"n")==0)
                break;
        }
        p=(struct student *)malloc(sizeof(struct student));
        printf("\n====%dѧϢ====\n",i);
        printf("ѧţ");
        gets(p->num);
        printf("");
        gets(p->name);
        printf("Ա('1'->, '0'->Ů)");
        p->sex=getchar();
  getchar();
        printf("䣺");
        gets(tmp);
        p->age=atoi(tmp);
        printf("ſγ̵ĳɼ\n");
        p->sum=0;
        for(j=0;j<3;j++)
        {
            printf("%dɼ",j+1);
            gets(tmp);
            p->score[j]=atoi(tmp);
            p->sum+=p->score[j];
        }
        printf("ܳɼ%d\n",p->sum);
        printf("ϵϵ[1->ϵ;2->ϵ;3->ϵ]");
        gets(tmp);
        p->deptid=atoi(tmp);
        p->next1=head;
        head=p;
    }
    printf("Ϣ¼ϣ");
 getch();
}
//ʾѧϢ
void displayAll()
{
    struct student *p;
    printf("ѧ\t\tԱ\t\tſγ̵ĳɼ\t\tܳɼ\tϵϵ\n");
    p=head;
    while(p!=NULL)
    {
        printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"":"Ů",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid);
        p=p->next1;
    }
    printf("Ϣʾϣ");
 getch();
}
//ѧŲѯѧϢ
void searchOnNum()
{
    int flag;
    char tmp[30];
    struct student *p;
    p=head;
    printf("ѧţ");
    gets(tmp);
    flag=0;
    printf("ѧ\t\tԱ\t\tſγ̵ĳɼ\t\tܳɼ\tϵϵ\n");
    while(p!=NULL)
    {
        if(strcmp(tmp,p->num)==0)
        {
            flag=1;
            printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"":"Ů",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid);
        }p=p->next1;
    }
    if(flag==0)
        printf("\nδҵѧ%sѧ",tmp);
    else
        printf("\nʾϣ");
    getch();
}
//ѯѧϢ
void searchOnName()
{
    int flag;
    char tmp[30];
    struct student *p;
    p=head;
    printf("");
    gets(tmp);
    flag=0;
    printf("ѧ\t\tԱ\t\tſγ̵ĳɼ\t\tܳɼ\tϵϵ\n");
    while(p!=NULL)
    {
        if(strstr(p->name,tmp))
        {
            flag=1;
            printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"":"Ů",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid);
        }p=p->next1;
    }
    if(flag==0)
        printf("\nδҵ%s",tmp);
    else
        printf("\nʾϣ");
    getch();
}
//ѯѧϢ
void searchOnAge()
{
    int flag;
    char tmp[30];
    struct student *p;
    p=head;
    printf("䣺");
    gets(tmp);
    flag=0;
    printf("ѧ\t\tԱ\t\tſγ̵ĳɼ\t\tܳɼ\tϵϵ\n");
    while(p!=NULL)
    {
        if(atoi(tmp)==p->age)
        {
            flag=1;
            printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"":"Ů",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid);
        }p=p->next1;
    }
    if(flag==0)
        printf("\nδҵ%sѧ",tmp);
    else
        printf("\nʾϣ");
    getch();
}
//ѯָѧϵϢ
void searchDepa()
{
    int i,flag;
    char tmp[30];
    struct student *p;
    p=head;
    printf("");
    gets(tmp);
    flag=0;
    while(p!=NULL)
    {
        if(strcmp(tmp,p->name)==0)
        {
            for(i=0;i<3;i++)
            {
                if(p->deptid==depa[i].id)
                {
                    flag=1;
                    printf("ϵ\t\tϵ\t\tϵİ칫ص\n");
                    printf("%s\t\t%s\t\t%s\n",depa[i].name,depa[i].dean,depa[i].location);
                }
            }
        }p=p->next1;
    }
    if(flag==0)
        printf("\nδҵ%s%sϵʱ󣬰",tmp);
    else
        printf("\nʾϣ");
    getch();
}
//޸ѧϢ
void update()
{
    int flag,j;
    char tmp[30];
    char a;
    struct student *p;
    p=head;
    printf("");
    gets(tmp);
    flag=0;
    while(p!=NULL)
    {
        if(strcmp(tmp,p->name)==0)
        {
            flag=1;
            printf("ѧ\t\tԱ\t\tſγ̵ĳɼ\t\tܳɼ\tϵϵ\n");
            printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"":"Ů",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid);
            printf("\n====Ϣ====\n");
            printf("ѧţ");
            gets(tmp);
            if(strcmp(tmp,"")!=0)
                strcpy(p->num,tmp);
            printf("");
            gets(tmp);
            if(strcmp(tmp,"")!=0)
                strcpy(p->name,tmp);
            printf("Ա'1'->, '0'->Ů");
            a=getchar();
            if(a!='\n')
  p->sex=a;
            printf("䣺");
            gets(tmp);
            if(strcmp(tmp,"")!=0)
                p->age=atoi(tmp);
            printf("ſγ̵ĳɼ\n");
            p->sum=0;
            for(j=0;j<3;j++)
            {
                printf("%dɼ",j+1);
                gets(tmp);
                if(strcmp(tmp,"")!=0)
                    p->score[j]=atoi(tmp);
                p->sum+=p->score[j];
            }
            printf("ܳɼ%d\n",p->sum);
            
            printf("ϵϵ[1->ϵ;2->ϵ;3->ϵ]");
            gets(tmp);
            if(strcmp(tmp,"")!=0)
                p->deptid=atoi(tmp);
        }p=p->next1;
    }
    if(flag==0)
  printf("\nδҵ%s!",tmp);
    else
  printf("\n޸ϣ");
    getch();
}
//ɾѧϢ
void delate()
{
    int flag;
    char tmp[30];
    struct student *p,*q;
    printf("");
    gets(tmp);
    p=head;
    flag=0;
    while(p!=NULL)
    {
        if(strcmp(tmp,p->name)==0)
        {
            flag=1;
            if(p==head)
                head=p->next1;
            else
                q->next1=p->next1;
            free(p);break;
        }
        q=p;
        p=p->next1;
    }
    if(flag==0)
        printf("\nδҵ%s",tmp);
    else
        printf("ɾϣ");
    getch();
}
//׷ѧϢ
void add()
{
    int i,j;
    char tmp[30];
    struct student *p;
    for(i=1;;i++)
    {
        if(i!=1)
        {
            printf("Ƿ׷(y/n):");
            gets(tmp);
            if(strcmp(tmp,"n")==0)
                break;
        }
        p=(struct student *)malloc(sizeof(struct student));
        printf("\n====%d׷Ϣ====\n",i);
        printf("ѧţ");
        gets(p->num);
        printf("");
        gets(p->name);
        printf("Ա'1'->, '0'->Ů");
        p->sex=getchar();
  getchar();
        printf("䣺");
        gets(tmp);
        p->age=atoi(tmp);
        p->sum=0;
        for(j=0;j<3;j++)
        {
            printf("%dɼ",j+1);
            gets(tmp);
            if(strcmp(tmp,"")!=0)
                p->score[j]=atoi(tmp);
            p->sum+=p->score[j];
        }
        printf("ܳɼ%d\n",p->sum);
        printf("ϵϵ[1->ϵ;2->ϵ;3->ϵ]");
        gets(tmp);
        p->deptid=atoi(tmp);
        p->next1=head;
        head=p;
    }
    printf("׷ӳɹ");
 getch();
}
//ѧϢļ
void save()
{
    FILE *fp;
    char filename[20]={"d://qq.dat"};
    printf("ļ%s",filename);
    gets(filename);
    while(strcmp(filename,"")==0)
    {
        printf("ļΪգ룺");
        gets(filename);
    }
    if((fp=fopen(filename,"wb"))==NULL)
    {
        printf("write file open error!\n");getch();
        return;
        
    }
    struct student *p;
    p=head;
    printf("ڱϢĵȴ\n");
    while(p!=NULL)
    {
        fwrite(p,sizeof(struct student),1,fp);
        p=p->next1;
    }
    fclose(fp);
    printf("Ϣɹ");getch();
}
//ļѧϢ
void load()
{
    char filename[20];
    FILE *fp;
    printf("ļ");
    gets(filename);
    while(strcmp(filename,"")==0)
    {
        printf("ļΪգ룺");
        gets(filename);
    }
    if((fp=fopen(filename,"rb"))==NULL)
    {
        printf("read file open error!\n");getch();
        return;
    }
    struct student *p,*q;
    p=(struct student *)malloc(sizeof(struct student));
    head=p;
    printf("ڴӴϢĵȴ\n");
    while(!feof(fp))
    {
        if(1!=fread(p,sizeof(struct student),1,fp))
            break;
        p->next1=(struct student *)malloc(sizeof(struct student));
        q=p;
        p=p->next1;
    }
    q->next1=NULL;
    fclose(fp);
    printf("ɹ");getch();
}
//ɼӸߵʾѧϢ[ѡĿ]
void displayInOrder()
{
    struct student *head1,*p,*q,*r;
    p=(struct student *)malloc(sizeof(struct student));
    p=head;
    while(p!=NULL)
    {
        if(p==head)
        {
            head1=p;
            p->next2=NULL;
        }
        else
        {
            q=head1;
            while(1)
            {
                if(p->sum>q->sum)
                {
                    if(q==head1)
                    {
                        p->next2=head1;
                        head1=p;break;
                    }
                    else
                    {
                        r->next2=p;
                        p->next2=q;break;
                    }
                }
                else if(q->next2==NULL)
                {
                    q->next2=p;
                    p->next2=NULL;break;
                }
                r=q;
                q=q->next2;
            }
        }
        p=p->next1;
    }
    printf("ѧ\t\tԱ\t\tſγ̵ĳɼ\t\tܳɼ\tϵϵ\n");
    p=head1;
    while(p!=NULL)
    {
        printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"":"Ů",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid);
        p=p->next2;
    }
    printf("Ϣʾϣ");getch();
}
//˳ϵͳжǷ˳
void exitSystem()
{
 char x;
 printf("Ҫ˳ϵͳ?(Y/N)");
 while(1)
 {
  x=getche();
  if(x=='y' || x=='Y' || x=='n' || x=='N' )
   break;
  printf("\b");
 }
 if(x=='y' || x=='Y')
 {
  printf("\n");
  exit(0);
 }
 return;
}

void main()
{
    int c;
    char choice[3];
    while(1)
    {
        system("cls");
        menu();
        do
        {
            printf("빦ܼ");
            gets(choice);
            c=atoi(choice);
        }while(c>12||c<0);
        switch(c)
        {
            case 1: create();break;
            case 2: displayAll();break;
            case 3: searchOnNum();break;
            case 4: searchOnName();break;
            case 5: searchOnAge();break;
            case 6: searchDepa();break;
            case 7: update();break;
            case 8: delate();break;    
            case 9: add();break;
            case 10: save();break;
            case 11: load();break;
            case 12: displayInOrder();break;
            case 0: exitSystem();
        }
    }
}



