www.pudn.com > student.rar > student.c


/*教务信息管理源程序*/ 
/******头文件(.h)******/ 
#include "stdio.h"    /*I/O函数*/ 
#include "bios.h"  /*ROM基本输入输出函数*/ 
#include "dos.h"    /*dos接口函数*/ 
#include "conio.h"   /*屏幕操作函数*/ 
#include "stdlib.h"   /*其它说明*/ 
#include "string.h"  /*字符串函数*/ 
#include "mem.h"  /*内存操作函数*/ 
#include "ctype.h" /*字符操作函数*/ 
#include "alloc.h"  /*动态地址分配函数*/ 
/******变量定义******/ 
struct cx 
{ 
   char xueqi[10]; 
   char chengji[5]; 
};      
struct xx   /*定义学生选修课程的基本信息数据结构*/ 
{ 
   char clsnum[11]; 
   char clsnam[30]; 
   char rebuild[1]; 
   int score; 
   int course; 
   struct cx chongxiu[10]; 
};  
typedef struct stu   /*定义学生基本信息数据结构*/ 
{ 
   char no[11]; 
   char name[15]; 
   char sex[2]; 
   int age; 
   int sum; 
   float average; 
   int order; 
   struct xx xuanxiu[10]; 
   struct stu *next;/*后继指针*/ 
}STUDENT; 
/******函数原型*********/ 
STUDENT *init();    /*初始化*/ 
STUDENT *create();  /*基本数据的录入*/ 
STUDENT *revise(STUDENT *h);  /*修改*/ 
STUDENT *insert(STUDENT *h);  /*插入*/  
STUDENT *delete(STUDENT *h); /*删除*/ 
void search(); /*查找*/ 
void sort(STUDENT *h); /*统计每个学生各门功课的平均成绩*/ 
void total(STUDENT *h); /*统计并输出各班各门功课的平均成绩和总平均成绩*/ 
void tjxf(STUDENT *h); /*统计并输出每个同学已修学分*/ 
void bjg(STUDENT *h);  /*列出不及格学生清单*/ 
void save(STUDENT *h);/*保存文件*/ 
STUDENT *load();/*读取文件*/ 
int menu_select();  /*主菜单*/ 
/*******主函数开始**********/ 
main() 
{ 
   int i; 
   STUDENT *head; 
   head=init(); 
   clrscr(); 
   for(;;) 
   { 
      switch(menu_select())   /*调用菜单函数返回一个整数值*/ 
      { 
	 case 0:head=init();break;    /*初始化*/ 
	 case 1:head=create();break; /*基本数据的录入*/ 
         case 2:head=revise(head);break;  /*修改*/ 
	 case 3:head=insert(head);break;  /*插入*/ 
	 case 4:head=delete(head);break; /*删除*/ 
	 case 5:search(head);break; /*查找*/ 
         case 6:sort(head);break; 
         case 7:total(head);break; 
         case 8:tjxf(head);break; 
         case 9:bjg(head);break; 
         case 10:save(head);break; 
         case 11:head=load();break;	 
	 case 12:exit(0);    /*退出*/ 
      } 
   } 
} 
/*菜单函数,函数返回值为整型,代表所选的菜单项*/ 
menu_select() 
{ 
   char *f[]= {     /*定义菜单字符串数组*/ 
   "*********************MENU********************", /*菜单的标题行*/ 
   " 0. init list", /*初始化双链表*/ 
   " 1. Enter list", /*基本数据的录入,创建双链表*/ 
   " 2. Revise a record", /*修改记录*/ 
   " 3. Insert record to list",/*插入记录*/    
   " 4. Delete a record", /*删除记录*/   
   " 5. Search record", /*查找记录*/ 
   " 6. Count average result of each course for everyone",/*统计每个学生各门功课的平均成绩*/ 
   " 7. Count for each class", 
   " 8. Count have had course for everyone", /*统计并输出每个同学已修学分*/ 
   " 9. List for not pass",/*列出不及格学生清单*/ 
   " 10. Save data to the file",  /*保存文件*/ 
   " 11. Load data from the file",/*读取文件*/ 
   " 12. Quit" };  /*退出*/ 
   char s[80]; 
   int  i; 
   int key=0; /*记录所压键值*/ 
   int c=0; 
   gotoxy(1,25); /*移动光标*/ 
   printf("press any key enter menu......\n");/*压任意键进入主菜单*/ 
   getch(); 
   clrscr();  /*清屏*/ 
   textcolor(YELLOW); /*设置文本颜色为黄色*/ 
   textbackground(BLUE);  /*设置背景颜色为兰色*/ 
   gotoxy(10,2); 
   putch(0xda); /*输出左上角边框┏*/ 
   for(i=1;i<64;i++) 
   putch(0xc4); /*输出上边框水平线*/ 
   putch(0xbf);  /*输出右上角边框  ┓*/ 
   for(i=3;i<22;i++)/*输出左右两边的垂直线*/ 
   { 
      gotoxy(10,i);putch(0xb3); 
      gotoxy(74,i);putch(0xb3); 
   } 
   gotoxy(10,22);putch(0xc0); /*输出左上角边框┗*/ 
   for(i=1;i<64;i++) 
      putch(0xc4);  /*输出下边框水平线*/ 
   putch(0xd9);  /*输出右下角边框┛*/ 
   window(11,3,73,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/ 
   clrscr();   /*清屏*/ 
   for(i=0;i<14;i++) 
   { 
      gotoxy(10,i+1); 
      cprintf("%s",f[i]); /*输出菜单项数组*/ 
   } 
   i=1; 
   gotoxy(10,2);  /*设置默认选项在第一项*/ 
   textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/ 
   cprintf("%s",f[1]);  /*输出菜单项,表示选中*/ 
   gotoxy(10,2);  /*移动光标到菜单的第一项*/ 
   while(key!=13)   /*所压键不是回车键时*/ 
   { 
      while(bioskey(1)==0);  /*查询是否压下了一个键*/ 
      key=bioskey(0);   /*返回下一个在键盘压下的键*/ 
      key=key&0xff?key&0xff:key>>8; /*对所压的键进行判断*/ 
      gotoxy(10,i+1); 
      textbackground(BLUE);/*设置背景颜色为蓝色*/ 
      cprintf("%s",f[i]);  /*输出菜单项*/ 
      if(key==72) i=i==1?13:i-1; /*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/ 
      if(key==80)i=i==13?1:i+1; /*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/ 
      gotoxy(10,i+1); /*光标移动i的下一项*/ 
      textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/ 
      cprintf("%s",f[i]);  /*输出菜单项*/ 
      c=i-1;  /*给代表菜单选项的整数赋值*/ 
   } 
   textbackground(BLACK);  /*设置背景颜色为黑色*/ 
   window(1,1,80,25);  /*恢复原窗口大小*/ 
   clrscr(); 
   gotoxy(1,1); 
   return c;  /*返回代表菜单选项的整数值*/ 
} 
/*初始化函数*/ 
STUDENT *init() 
{   
   return NULL; 
} 
/*输入数据,创建链表*/ 
STUDENT *create() 
{ 
   int i,j,k,l;  
   int s; 
   STUDENT *h=NULL,*info;  /* STUDENT指向结构体的指针*/ 
   printf("-------------------enter @ return--------------------\n"); 
   printf("---if you don't enter xuan xiu ke bian hao,enter @---\n"); 
   printf("-----if you don't enter chong xiu xue qi,enter @-----\n"); 
   for(;;) 
   { 
      info=(STUDENT *)malloc(sizeof(STUDENT));  /*申请空间*/ 
      if(!info)   /*如果指针info为空*/ 
      { 
	 printf("\nout of memory");   /*输出内存溢出*/ 
	 exit(0);          /*返回空指针*/ 
      } 
      inputs("enter no(enter @ return):",info->no,11);   /*输入学号并校验*/ 
      if(info->no[0]=='@') break;    /*如果学号首字符为@则结束输入*/ 
      inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/ 
      inputs("enter sex(0:women;1:men):",info->sex,1); 
      printf("enter age:"); 
      scanf("%d",&info->age); 
      for(k=1;k<10;k++) 
      { 
        info->xuanxiu[k].score=0; 
        info->xuanxiu[k].course=0; 
        for(l=1;l<10;l++) 
        strcpy(info->xuanxiu[l].chongxiu[l].chengji,"0"); 
      } 
      for(i=1;;) 
      { 
       printf("enter di %d men xuan xiu ke bian hao(enter @ return):",i); 
       scanf("%s",info->xuanxiu[i].clsnum); 
       if(info->xuanxiu[i].clsnum[0]=='@') break; 
       inputs("enter xuan xiu ke ming cheng:",info->xuanxiu[i].clsnam,16); 
       printf("enter shi fou chong xiu(n or y):"); 
       scanf("%s",&info->xuanxiu[i].rebuild); 
       printf("enter xuan xiu ke cheng ji:"); 
       scanf("%d",&info->xuanxiu[i].score); 
       printf("enter xuan xiu ke xue fen:"); 
       scanf("%d",&info->xuanxiu[i].course); 
       for(j=1;;) 
       { 
        printf("enter di %d chi chong xiu xue qi(such as:2007/1(2);enter @ return):",j); 
        scanf("%s",info->xuanxiu[i].chongxiu[j].xueqi); 
        if(info->xuanxiu[i].chongxiu[j].xueqi[0]=='@') break; 
        printf("enter chong xiu cheng ji:"); 
        scanf("%s",&info->xuanxiu[i].chongxiu[j].chengji); 
        j++; 
       } 
       i++; 
      } 
      s=0; 
      for(i=1;i<=3;i++) 
      s+=info->xuanxiu[i].score; 
      info->sum=s; 
      info->average=s/3.; 
      info->next=h; 
      h=info; 
   } 
   return(h); 
}   
/*输入字符串,并进行长度验证*/ 
inputs(char *prompt, char *s, int count) 
{ 
   char p[255]; 
   do{ 
      printf(prompt);  /*显示提示信息*/ 
      scanf("%s",p);  /*输入字符串*/ 
      if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/ 
   }while(strlen(p)>count); 
   strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/ 
} 
/*插入记录*/ 
STUDENT  *insert(STUDENT *h) 
{ 
   STUDENT *p,*q,*info; /*p指向插入位置,q是其前驱,info指新插入记录*/ 
   char s[11];  /*保存插入点位置的学号*/ 
   int s1,i,j; 
   printf("please enter location  before the no\n"); 
   scanf("%s",s);   /*输入插入点学号*/ 
   printf("\nplease new record\n");      /*提示输入记录信息*/ 
   info=(STUDENT *)malloc(sizeof(STUDENT));   /*申请空间*/ 
   if(!info) 
   { 
      printf("\nout of memory");   /*如没有申请到,内存溢出*/ 
      return NULL;             /*返回空指针*/ 
   } 
   inputs("enter no(enter @ return):",info->no,11);   /*输入学号并校验*/ 
   inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/ 
   inputs("enter sex:",info->sex,1); 
   printf("enter age:"); 
   scanf("%d",&info->age); 
   for(i=1;;) 
    { 
       printf("enter di %d men xuan xiu ke bian hao(enter @ return):",i); 
       scanf("%s",p->xuanxiu[i].clsnum); 
       if(p->xuanxiu[i].clsnum[0]=='@') break; 
       inputs("enter xuan xiu ke ming cheng:",p->xuanxiu[i].clsnam,16); 
       printf("enter shi fou chong xiu(n or y):"); 
       scanf("%s",&p->xuanxiu[i].rebuild); 
       printf("enter xuan xiu ke cheng ji:"); 
       scanf("%d",&p->xuanxiu[i].score); 
       printf("enter xuan xiu ke xue fen:"); 
       scanf("%d",&p->xuanxiu[i].course); 
       for(j=1;;) 
       { 
        printf("enter di %d chi chong xiu xue qi(such as:2007/1(2);enter @ return):",j); 
        scanf("%s",p->xuanxiu[i].chongxiu[j].xueqi); 
        if(p->xuanxiu[i].chongxiu[j].xueqi[0]=='@') break; 
        printf("enter chong xiu cheng ji:"); 
        scanf("%s",&p->xuanxiu[i].chongxiu[j].chengji); 
        j++; 
       } 
       i++; 
    } 
   info->next=NULL;     /*设后继指针为空*/ 
   p=h;               /*将指针赋值给p*/ 
   q=h;             /*将指针赋值给q*/ 
   while(strcmp(p->no,s)&&p!=NULL)    /*查找插入位置*/ 
   { 
      q=p;                 /*保存指针p,作为下一个p的前驱*/ 
      p=p->next;          /*将指针p后移*/ 
   } 
   if(p==NULL)      /*如果p指针为空,说明没有指定结点*/ 
      if(p==h)      /*同时p等于h,说明链表为空*/ 
	 h=info;   /*新记录则为头结点*/ 
      else 
	 q->next=info;  /*p为空,但p不等于h,将新结点插在表尾*/ 
   else 
      if(p==h)     /*p不为空,则找到了指定结点*/ 
      { 
	 info->next=p; /*如果p等于h,则新结点插入在第一个结点之前*/ 
	 h=info;    /*新结点为新的头结点*/ 
      } 
      else 
      { 
	 info->next=p;   /*不是头结点,则是中间某个位置,新结点的后继为p*/ 
	 q->next=info;  /*新结点作为q的后继结点*/ 
      } 
   printf("\n ----have inserted %s student----\n",info->name);   
   printf("---Don't forget save---\n");     /*提示存盘*/ 
   return(h);         /*返回头指针*/ 
} 
/*删除记录*/ 
STUDENT *delete(STUDENT *h) 
{ 
   STUDENT *p,*q;  /*p为查找到要删除的结点指针,q为其前驱指针*/ 
   char s[11];     /*存放学号*/ 
   clrscr();       /*清屏*/ 
   printf("please deleted no\n");      /*显示提示信息*/ 
   scanf("%s",s);   /*输入要删除记录的学号*/ 
   q=p=h;    /*给q和p赋初值头指针*/ 
   while(strcmp(p->no,s)&&p!=NULL)   /*当记录的学号不是要找的,或指针不为空时*/ 
   { 
      q=p;       /*将p指针值赋给q作为p的前驱指针*/ 
      p=p->next;      /*将p指针指向下一条记录*/ 
   } 
   if(p==NULL)     /*如果p为空,说明链表中没有该结点*/ 
      printf("\nlist no %s student\n",s); 
   else       /*p不为空,显示找到的记录信息*/ 
   { 
      printf("***************have found****************\n"); 
      printf("|    no    |      name      | sex | age |\n"); 
      printf("|----------|----------------|-----|-----|\n"); 
      printf("|%-10s|%-16s|%5s|%5d|\n",p->no,p->name,p->sex,p->age); 
      printf("*******************end*******************\n"); 
      getch();      /*压任一键后,开始删除*/ 
      if(p==h)    /*如果p==h,说明被删结点是头结点*/ 
	 h=p->next;     /*修改头指针指向下一条记录*/ 
      else 
	 q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/ 
      free(p);          /*释放p所指结点空间*/ 
      printf("\nhave deleted No %s student\n",s); 
      printf("Don't forget save\n");/*提示删除后不要忘记保存文件*/ 
   } 
   return(h);      /*返回头指针*/ 
} 
/*查找记录*/ 
void search(STUDENT *h) 
{ 
   STUDENT *p;    /*  移动指针*/ 
   char s[15];    /*存放姓名的字符数组*/ 
   int j,k; 
   clrscr();    /*清屏幕*/ 
   printf("-Please change the type of search!-\n"); 
   printf("----Enter 1 for search by name!----\n"); 
   printf("----Enter 2 for search by age!-----\n"); 
   printf("-----------Enter @ return!---------\n"); 
   scanf("%d",&j); 
   if (j==1)  
   {  
    printf("please enter name for search\n"); 
    scanf("%s",s);    /*输入姓名*/ 
    p=h;    /*将头指针赋给p*/ 
    printf("****************************have found***************************\n"); 
    printf("|    no    |      name      | sex | age |course1|course2|course3|\n"); 
    do 
    { 
     while(strcmp(p->name[0],s[0])&&p!=NULL)  /*当记录的姓名不是要找的,或指针不为空时*/ 
     p=p->next;     /*移动指针,指向下一结点*/ 
     if(p==NULL)         /*如果指针为空*/ 
       printf("\nlist no %s student\n",s);   /*显示没有该学生*/ 
     else           /*显示找到的记录信息*/ 
     { 
      printf("|----------|----------------|-----|-----|-------|-------|-------|\n"); 
      printf("|%-10s|%-16s|%5s|%5d|%7d|%7d|%7d|\n",p->no,p->name,p->sex,p->age,p->xuanxiu[1].score,p->xuanxiu[2].score,p->xuanxiu[3].score); 
      p=p->next;  
     } 
    }while(p!=NULL); 
    printf("******************************end********************************\n"); 
   } 
   if (j==2)  
   {  
    printf("please enter age for search\n"); 
    scanf("%d",&k);     
    p=h;    /*将头指针赋给p*/ 
    printf("***********************have found*************************\n"); 
    printf("|    no    |      name      | sex | age |course1|course2|course3|\n"); 
    do 
    { 
     while((p->age-k)>=0&&p!=NULL)  /*当记录的姓名不是要找的,或指针不为空时*/ 
     p=p->next;     /*移动指针,指向下一结点*/ 
     if(p==NULL)         /*如果指针为空*/ 
       printf("\nlist no %s student\n",s);   /*显示没有该学生*/ 
     else           /*显示找到的记录信息*/ 
     { 
      printf("|----------|----------------|-----|-----|-------|-------|-------|\n"); 
      printf("|%-10s|%-16s|%5s|%5d|%7d|%7d|%7d|\n",p->no,p->name,p->sex,p->age,p->xuanxiu[1].score,p->xuanxiu[2].score,p->xuanxiu[3].score); 
      p=p->next;  
     } 
    }while(p!=NULL); 
    printf("******************************end********************************\n"); 
   } 
   getch(); 
} 
/*统计每个学生各门功课的平均成绩*/ 
void sort(STUDENT *h) 
{ 
   int i=0;                  /*保存名次*/ 
   STUDENT *p,*q,*t,*h1;   /*定义临时指针*/ 
   clrscr(); 
   h1=h->next;           /*将原表的头指针所指的下一个结点作头指针*/ 
   h->next=NULL;        /*第一个结点为新表的头结点*/ 
   while(h1!=NULL)    /*当原表不为空时,进行排序*/ 
   { 
      t=h1;            /*取原表的头结点*/ 
      h1=h1->next;     /*原表头结点指针后移*/ 
      p=h;           /*设定移动指针p,从头指针开始*/ 
      q=h;         /*设定移动指针q做为p的前驱,初值为头指针*/ 
      while(t->averageaverage&&p!=NULL)  /*作总分比较*/ 
      { 
	 q=p;            /*待排序点值小,则新表指针后移*/ 
	 p=p->next; 
      } 
      if(p==q)      /*p==q,说明待排序点值大,应排在首位*/ 
      { 
	 t->next=p;     /*待排序点的后继为p*/ 
	 h=t;         /*新头结点为待排序点*/ 
      } 
      else    /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/ 
      { 
	 t->next=p;   /*t的后继是p*/ 
	 q->next=t;    /*q的后继是t*/ 
      } 
   } 
   p=h;               /*已排好序的头指针赋给p,准备填写名次*/ 
   while(p!=NULL)  /*当p不为空时,进行下列操作*/ 
   { 
      i++;       /*结点序号*/ 
      p->order=i;   /*将名次赋值*/ 
      p=p->next;   /*指针后移*/ 
   } 
   printf("*******************************sort sucess!!!*******************************\n"); 
   printf("|order|    no    |      name      | average |course1|course2|course3|  sum  |\n"); 
   p=h; 
   while(p!=NULL) 
   { 
     printf("|-----|----------|----------------|---------|-------|-------|-------|-------|\n"); 
     printf("|%-5d|%-10s|%-16s|%9.2f|%7d|%7d|%7d|%7d|\n",p->order,p->no,p->name,p->average,p->xuanxiu[1].score,p->xuanxiu[2].score,p->xuanxiu[3].score,p->sum); 
     p=p->next; 
   } 
   printf("*************************************end***********************************\n"); 
} 
/*统计并输出各班各门功课的平均成绩和总平均成绩*/ 
void total(STUDENT *h) 
{ 
   STUDENT *p,*q;   /*定义临时指针变量*/ 
   char sno[9],qno[9],*ptr;    /*保存班级号的*/ 
   float s1,s2,s3,ave;        /*保存总分和均分*/ 
   float i;       /*保存班级人数*/ 
   clrscr();    /*清屏*/ 
   printf("******************Total****************\n"); 
   printf("|  class  |course1|course2|course3|average|\n"); 
   p=h;       /*从头指针开始*/ 
   while(p!=NULL)  /*当p不为空时做下面的处理*/ 
   { 
      memcpy(sno,p->no,7);  /*从学号中取出班级号*/ 
      sno[7]='\0';          /*做字符串结束标记*/ 
      q=p->next;        /*将指针指向待比较的记录*/ 
      s1=p->xuanxiu[1].score;      /*当前班级的总分初值为该班级的第一条记录总分*/ 
      s2=p->xuanxiu[2].score; 
      s3=p->xuanxiu[3].score; 
      ave=p->average;  /*当前班级的均分初值为该班级的第一条记录均分*/ 
      i=1.;          /*统计当前班级人数*/ 
      while(q!=NULL)   /*内循环开始*/ 
      { 
	 memcpy(qno,q->no,7);   /*读取班级号*/ 
	 qno[7]='\0';     /*做字符串结束标记*/ 
	 if(strcmp(qno,sno)==0)  /*比较班级号*/ 
	 { 
	    s1+=q->xuanxiu[1].score;     /*累加总分*/ 
            s2+=q->xuanxiu[2].score; 
            s3+=q->xuanxiu[3].score; 
 	    ave+=q->average; /*累加均分*/ 
	    i++;         /*累加班级人数*/ 
	    q=q->next;   /*指针指向下一条记录*/ 
	 } 
	 else 
	     break;  /*不是一个班级的结束本次内循环*/ 
      } 
      printf("|%9s|%7.2f|%7.2f|%7.2f|%7.2f|\n",sno,s1,s2,s3,ave/i); 
      if(q==NULL) 
	 break;   /*如果当前指针为空,外循环结束,程序结束*/ 
      else 
	 p=q;   /*否则,将当前记录作为新的班级的第一条记录开始新的比较*/ 
   } 
   printf("-------------------------------------------\n"); 
} 
/*统计并输出每个同学已修学分*/ 
void tjxf(STUDENT *h) 
{ 
 STUDENT *p; 
 p=h; 
 printf("***************xue fen tong ji***************\n"); 
 printf("|    no    |      name      | yi xiu xue fen |\n"); 
 while(p!=NULL) 
 { 
   printf("|%-10s|%-16s|%16d|\n",p->no,p->name,p->xuanxiu[1].course+p->xuanxiu[2].course+p->xuanxiu[3].course); 
   printf("|----------|----------------|----------------|\n"); 
   p=p->next; 
 } 
} 
/*列出不及格学生清单*/  
void bjg(STUDENT *h) 
{ 
 STUDENT *p; 
 int i; 
 p=h; 
 clrscr(); 
 printf("Please change the course for not pass to list!\n"); 
 printf("1--course1\n"); 
 printf("2--course2\n"); 
 printf("3--course3\n"); 
 scanf("%d",&i); 
 printf("********course1 not pass list********\n"); 
 if (i==1) 
 { 
  printf("|    no    |      name      |course1|\n"); 
  do 
    { 
     while((p->xuanxiu[1].score-60)>=0&&p!=NULL)   
     p=p->next;      
     if(p==NULL)         
       printf(" no  student\n");   
     else          
     { 
      printf("|----------|----------------|-------|\n"); 
      printf("|%-10s|%-16s|%7d|\n",p->no,p->name,p->xuanxiu[1].score); 
      p=p->next;  
     } 
    }while(p!=NULL); 
 } 
 if (i==2) 
 { 
  printf("|    no    |      name      |course2|\n"); 
  do 
    { 
     while((p->xuanxiu[2].score-60)>=0&&p!=NULL)   
     p=p->next;      
     if(p==NULL)         
       printf("\n no  student\n");   
     else          
     { 
      printf("|----------|----------------|-------|\n"); 
      printf("|%-10s|%-16s|%7d|\n",p->no,p->name,p->xuanxiu[2].score); 
      p=p->next;  
     } 
    }while(p!=NULL); 
 } 
 if (i==3) 
 { 
  printf("|    no    |      name      |course3|\n"); 
  do 
    { 
     while((p->xuanxiu[3].score-60)>=0&&p!=NULL)   
     p=p->next;      
     if(p==NULL)         
       printf("\n no  student\n");   
     else          
     { 
      printf("|----------|----------------|-------|\n"); 
      printf("|%-10s|%-16s|%7d|\n",p->no,p->name,p->xuanxiu[3].score); 
      p=p->next;  
     } 
    }while(p!=NULL); 
 } 
 printf("******************end****************\n"); 
} 
/****保存文件****/ 
void save(STUDENT *h) 
{ 
   FILE *fp;         /*定义指向文件的指针*/ 
   STUDENT *p;    /* 定义移动指针*/ 
   char outfile[10];  /*保存输出文件名*/ 
   printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示文件名格式信息*/ 
   scanf("%s",outfile); 
   if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/ 
   { 
      printf("can not open file\n"); 
      exit(1); 
   } 
   printf("\nSaving file......\n");  /*打开文件,提示正在保存*/ 
   p=h;                    /*移动指针从头指针开始*/ 
   while(p!=NULL)        /*如p不为空*/ 
   { 
      fwrite(p,sizeof(STUDENT),1,fp);/*写入一条记录*/ 
      p=p->next;        /*指针后移*/ 
   } 
   fclose(fp);      /*关闭文件*/ 
   printf("-----save success!!-----\n");  /*显示保存成功*/ 
} 
/* 从文件读数据*/ 
STUDENT *load() 
{ 
   STUDENT *p,*q,*h=NULL;    /*定义记录指针变量*/ 
   FILE *fp;            /* 定义指向文件的指针*/ 
   char infile[10];       /*保存文件名*/ 
   printf("Enter infile name,for example c:\\f1\\te.txt:\n");   scanf("%s",infile);           /*输入文件名*/ 
   if((fp=fopen(infile,"rb"))==NULL)   /*打开一个二进制文件,为读方式*/ 
   { 
      printf("can not open file\n");    /*如不能打开,则结束程序*/ 
      exit(1); 
   } 
   printf("\n -----Loading file!-----\n"); 
   p=(STUDENT *)malloc(sizeof(STUDENT));   /*申请空间*/ 
   if(!p) 
   { 
      printf("out of memory!\n");    /*如没有申请到,则内存溢出*/ 
      return h;       /*返回空头指针*/ 
   } 
   h=p;         /*申请到空间,将其作为头指针*/ 
   while(!feof(fp))  /*循环读数据直到文件尾结束*/ 
   { 
      if(1!=fread(p,sizeof(STUDENT),1,fp)) 
	 break;  /*如果没读到数据,跳出循环*/ 
      p->next=(STUDENT *)malloc(sizeof(STUDENT));  /*为下一个结点申请空间*/ 
      if(!p->next) 
      { 
	 printf("out of memory!\n");  /*如没有申请到,则内存溢出*/ 
	 return h; 
      } 
      q=p;   /*保存当前结点的指针,作为下一结点的前驱*/ 
      p=p->next;   /*指针后移,新读入数据链到当前表尾*/ 
   } 
   q->next=NULL;   /*最后一个结点的后继指针为空*/ 
   fclose(fp);       /*关闭文件*/ 
   printf("---You have success read data from file!!!---\n"); 
   return h;   /*返回头指针*/ 
} 
/*修改*/ 
STUDENT *revise(STUDENT *h) 
{ 
 int i,j,k,l;  
 int s; 
 char xh[11]; 
 STUDENT *p; 
 p=h; 
 printf("enter xue hao for xiu gai!\n"); 
 scanf("%s",xh); 
 while(strcmp(p->no,xh)&&p!=NULL)   /*当记录的学号不是要找的,或指针不为空时*/ 
       p=p->next;      /*将p指针指向下一条记录*/ 
 if(p==NULL)     /*如果p为空,说明链表中没有该结点*/ 
   printf("\nlist no %s student\n",xh); 
 else       /*p不为空,显示找到的记录信息*/ 
   { 
      printf("***************have found****************\n"); 
      printf("|    no    |      name      | sex | age |\n"); 
      printf("|----------|----------------|-----|-----|\n"); 
      printf("|%-10s|%-16s|%5s|%5d|\n",p->no,p->name,p->sex,p->age); 
      printf("*******************end*******************\n"); 
      getch(); 
      printf("Please enter new infomation!\n"); 
    for(;;) 
    { 
      inputs("enter no(enter @ return):",p->no,11);   /*输入学号并校验*/ 
      inputs("enter name:",p->name,15); /*输入姓名,并进行校验*/ 
      inputs("enter sex:",p->sex,1); 
      printf("enter age:"); 
      scanf("%d",&p->age); 
      for(k=1;k<10;k++) 
      { 
        p->xuanxiu[k].score=0; 
        p->xuanxiu[k].course=0; 
        for(l=1;l<10;l++) 
        strcpy(p->xuanxiu[l].chongxiu[l].chengji,"0"); 
      } 
      for(i=1;;) 
      { 
       printf("enter di %d men xuan xiu ke bian hao(enter @ return):",i); 
       scanf("%s",p->xuanxiu[i].clsnum); 
       if(p->xuanxiu[i].clsnum[0]=='@') break; 
       inputs("enter xuan xiu ke ming cheng:",p->xuanxiu[i].clsnam,16); 
       printf("enter shi fou chong xiu(n or y):"); 
       scanf("%s",&p->xuanxiu[i].rebuild); 
       printf("enter xuan xiu ke cheng ji:"); 
       scanf("%d",&p->xuanxiu[i].score); 
       printf("enter xuan xiu ke xue fen:"); 
       scanf("%d",&p->xuanxiu[i].course); 
       for(j=1;;) 
       { 
        printf("enter di %d chi chong xiu xue qi(such as:2007/1(2);enter @ return):",j); 
        scanf("%s",p->xuanxiu[i].chongxiu[j].xueqi); 
        if(p->xuanxiu[i].chongxiu[j].xueqi[0]=='@') break; 
        printf("enter chong xiu cheng ji:"); 
        scanf("%s",&p->xuanxiu[i].chongxiu[j].chengji); 
        j++; 
       } 
       i++; 
      } 
      printf("if want to end enter @\n"); 
      if(getch()=='@') break; 
    } 
   } 
 return h; 
}