#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N sizeof(struct stud)
/*先用结构体定义学生信息*/
 struct stud
{
    int   num;
    char  name[10];
    char  sex[8];
    int   age;
    char  major[18];
    int   grade;
    int   classes;
    int   building;
    int   floor;
    int   dormitary;
    struct stud *next; /*next是指向本结构体的类型的指针类型*/
};
struct stud *h,*p;     /*定义指向结构体的指针变量*/
FILE *fp;              /*定义文件指针*/

/*建立和输出链表*/
struct stud *creat(void)
{   struct stud *p1,*p2,*head;
    int i,k;
    printf("Please input the total number of students:\n");
    scanf("%d",&k);
    head=NULL;
    printf("Please input the message of the student:\n\n");
    if(k>0)
    { head=p2=p1=(struct stud*)malloc(N);     /*为head,p2,p1申请存储空间,并都指向首结点*/
      for(i=1;i<=k;i++)
      { p1=(struct stud*)malloc(N);
        printf("Please input the number of the student:\n");
        scanf("%d",&p1->num);
        printf("Input the name:\n");
        scanf("%s",p1->name);
        printf("Input the sex(man or female):\n");
        scanf("%s",p1->sex);
        printf("Input the age:\n");
        scanf("%d",&p1->age);
        printf("Input the major:\n");
        scanf("%s",p1->major);
        printf("Please input the grade and class:\n");
        scanf("%d%d",&p1->grade,&p1->classes);
        printf("Please input the building floor and dormitary:\n");
        scanf("%d%d%d",&p1->building,&p1->floor,&p1->dormitary);
        p2->next=p1;                            /*将新结点连到表尾*/
        p2=p1;                                  /*p2指向新的表尾*/
       }
       p2->next=NULL;
       head=head->next;
      }
      save message(head);                    /*将输入的数据存入文件*/
      return head;
}

/*输入模块*/
input message()
{
   clrscr();
   h=creat();
   printf("\n\n\n\n\                   press any key to the main meue!!!!\n");
   bioskey(0);
}

/*读取信息*/
read message()
{  struct stud *p1,*p2;
   h=p1=(struct stud*)malloc(N);            /*为了p1申请存储空间,并指向首结点*/
   if((fp=fopen("gx1.txt","rb"))==NULL)
   {  printf("\n\n\n    There is no data for the monent!\n");
      return;
   }
   if(fread(p1,N,1,fp)!=1) return;          /*先向p1读入一个数据,若不能读,返回*/
   while(1)
   {  p2=(struct stud*)malloc(N);           /*为了p2申请存储空间*/
      if(fread(p2,N,1,fp)!=1) break;
      p1->next=p2;
      p1=p2;
    }
   fclose(fp);
   bioskey(0);
}

/*输出模块*/
output message(struct stud *p)
{  p=h;
   clrscr();
   if(p==NULL)
     printf("\n\n\n\n\n           There is no datas right now!\n");
   printf("number   name    sex   age   major   grade   class  building  floor  dormitary\n\n");
   while(p!=NULL)
   {
      printf("%6d%7s%7s%6d%8s%8d%8d%10d%7d%11d\n",p->num,p->name,p->sex,p->age,p->major,p->grade,p->classes,p->building,p->floor,p->dormitary);
      p=p->next;
   }
   printf("\n\n\n\n\        press any key to the main meue!!!!\n");
   bioskey(0);
}




/*更新模块*/
renew message()
{
   int choice;
   do
   {  clrscr();
      printf("\n\n\n      ~~~~~~~~'Renew message~~~~~~~~\n\n");
      printf("                1.Delete message\n\n");
      printf("                2.Revise message\n\n");
      printf("                3.Insert message\n\n");
      printf("                0.Return the main menu\n\n");
      printf("                    Please choice(0-3):");
      scanf("%d",&choice);
      switch(choice)
      {  case 1:del_message(h);output_message(h);break;
         case 2:revise_message();output_message(h);break;
         case 3:insert_message(h);output_message(h);break;
         case 0:break;
      }
   }while(choice!=0);
}


/*按学号查询*/
inquire num()
{  int num2;
   struct stud *p0;
   clrscr();
   printf("\n\n\n           Please input the number who you what to find:\n\n");
   scanf("\n%d",&num2);
   p0=h;
   while(p0!=NULL)
   {  if(p0->num==num2)
     { printf("\n\n****************************Inquire by number**************************\n\n");
       printf("number   name    sex   age   major   grade   class  building  floor  dormitary\n\n");
       printf("%6d%7s%7s%6d%8s%8d%8d%10d%7d%11d\n",p0->num,p0->name,p0->sex,p0->age,p0->major,p0->grade,p0->classes,p0->building,p0->floor,p0->dormitary);
      }
      p0=p0->next;
    }
    printf("\n\n\n\n\        press any key to the main meue!!!!\n");
    bioskey(0);
}



/*查询模块*/
inquire message()
{
   int choice;
   do
   {  clrscr();
      printf("\n\n\n      ~~~~~~~~Inquire Message~~~~~~~~\n\n");
      printf("                1.Inquire by name\n\n");
      printf("                2.Inquire by number\n\n");
      printf("                3.Inquire by dorminary\n\n");
      printf("                4.Inquire by floor\n\n");
      printf("                5.Inquire by building\n\n");
      printf("                0.Return the main menu\n\n");
      printf("                    Please choice(0-5):");
      scanf("%d",&choice);
      switch(choice)
      {  case 1:inquire_name();break;
         case 2:inquire_num();break;
         case 3:inquire_dormitary();break;
         case 4:inquire_floor();break;
         case 5:inquire_building();break;
         case 0:break;
      }
   }while(choice!=0);
}




/*用于输出排序的模块*/
output(struct stud *p)
{  p=h;
   printf("number   name    sex   age   major   grade   class  building  floor  dormitary\n\n");
   while(p!=NULL)
   {
      printf("%6d%7s%7s%6d%8s%8d%8d%10d%7d%11d\n",p->num,p->name,p->sex,p->age,p->major,p->grade,p->classes,p->building,p->floor,p->dormitary);
      p=p->next;
   }
   printf("\n\n\n\n\        press any key to the main meue!!!!\n");
   bioskey(0);
}

/*排序模块*/
sort message()
{
   int choice;
   do
   {  clrscr();
      printf("\n\n\n      ~~~~~~~~~~~~~~~Sort message~~~~~~~~~~~~~~~\n\n");
      printf("                1.Sort by number\n\n");
      printf("                2.Sort by dormitary\n\n");
      printf("                3.Sort by floor\n\n");
      printf("                4.Sort by building\n\n");
      printf("                0.Return the main menu\n\n");
      printf("                    Please choice(0-4):");
      scanf("%d",&choice);
      switch(choice)
      {  case 1:sort_num();output(h);break;               /*调用output_message()使排好的数据输出*/
         case 2:sort_dormitary();output(h);break;
         case 3:sort_floor();output(h);break;
         case 4:sort_building();output(h);break;
         case 0:break;
      }
   }while(choice!=0);
}

/*按宿舍号统计*/
count dormitary()
{  struct stud *p;
   int dor;
   int i=0;
   clrscr();
   printf("\n\nPlease input the dormitary what you want to count:\n");
   scanf("%d",&dor);
   clrscr();
   printf("\n\n*************************Count by dormitary***********************************\n");
   printf("\n\nnumber   name    sex   age   major   grade   class  building  floor  dormitary\n\n");
   p=h;
   while(p!=NULL)
   { if(p->dormitary==dor)
     {  printf("%6d%7s%7s%6d%8s%8d%8d%10d%7d%11d\n",p->num,p->name,p->sex,p->age,p->major,p->grade,p->classes,p->building,p->floor,p->dormitary);
        i++;
     }
     p=p->next;
   }
   printf("\nThe total:%d",i);
   printf("\n\n\n\n\        press any key to the main meue!!!!\n");
   bioskey(0);
}



/*统计模块*/
count message()
{
   int choice;
   do
   {  clrscr();
      printf("\n\n\n      ~~~~~~~~'Count message~~~~~~~~\n\n");
      printf("                1.Count by dormitary\n\n");
      printf("                2.Count by floor\n\n");
      printf("                3.Count by building\n\n");
      printf("                0.Return the main menu\n\n");
      printf("                    Please choice(0-3):");
      scanf("%d",&choice);
      switch(choice)
      {  case 1:count_dormitary();break;
         case 2:count_floor();break;
         case 3:count_building();break;
         case 0:break;
      }
   }while(choice!=0);
}



/*主函数*/
void main()
{
    int choice;
    int key;
    printf("Please input the right key:\n");
    scanf("%d",&key);
    if(key==0)
    { read_message();
      do
     {
       clrscr();
       printf("\n\n\n           ~~~~~~~XUE SHENG GONG YU GUAN LI XI TONG ~~~~~~~\n\n");
       printf("                     1.Input student information\n\n");
       printf("                     2.Output student information\n\n");
       printf("                     3.Renew student information\n\n");
       printf("                     4.Inquire student information\n\n");
       printf("                     5.Sort student information\n\n");
       printf("                     6.Count student information\n\n");
       printf("                     0.exit the system\n\n");
       printf("           **************************************************\n\n");
       printf("                 Please choice(0-6):");
       scanf("%d",&choice);
       switch(choice)
       {
         case 1:input message();break;
         case 2:output message(h);break;
         case 3:renew message();break;
         case 4:inquire message();break;
         case 5:sort message();break;
         case 6:count message();break;
         case 0:break;
       }
     }while(choice!=0);
     save message(h);                         /*退出程序时对数据进行保存*/
    }
}