return(w1); /*返回控制值*/ }
/****************输入模块****************/ enter() /*输入模块*/ {int i,n;
printf(\输入学生总数(0-%d)?:\
scanf(\ /*要输入的记录个数*/ printf(\现在输入数据\\n\\n\ for(i=0;i {printf(\ input(i); /*调用输入函数*/ } if(i!=0) save(n); /*调用保存函数*/ printf_back(); return 0;/*一个任务结束时让用户选择是浏览还是返回*/ } /****************追加模块****************/ add() /*追加模块*/ {int i,n,m,k; FILE *fp; n=load(); printf(\增加的学生总数(0-%d)?:\ scanf(\ /*输入要追加的记录个数*/ k=m+n; for(i=n;i {printf(\ input(i); /*调用输入函数*/ } if((fp=fopen(\ /*以ab方式打开文件,追加保存*/ {printf(\不能打开文件\\n\ return 0; } for(i=n;i return 0;/*一个任务结束时的选择浏览还是返回*/ } 11 /****************修改模块****************/ modify() /*修改模块*/ {struct student s; int i,n,k,w0=1,w1,w2=0; n=load(); do {system(\ k=-1; /*给用户看全部记录以便确认要修改的记录*/ puts___(); /*显示-----*/ printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i {if((i!=0)&&(i==0)) /*目的是分屏显示*/ {printf(\ . . .\ getch(); puts(\ } printf_one(i); /*调用显示一个记录的函数*/ } puts___(); do {printf(\输入修改学号! NO.:\ scanf(\ /*输入要修改的数据的学号*/ for(i=0;i {k=i; /*找到要修改的记录*/ s=stu[i]; /*把stu[i](即当次修改的学生记录)备份给s,以便用户反悔时恢复名誉*/ } if(k==-1) printf(\不存在! 重新输入\ } while(k==-1); /*当K=-1表示没有找到*/ printf_face(); /*调用显示数据结构项目函数*/ printf_one(k); /*调用显示一个记录的函数*/ w1=modify_data(k,n); /*修改学生记录并且返回保存控制值w1,w1=1则表示用户已确认修改*/ if(w1==1) /*W1等于1时则表示用户确定这次修改*/ {printf(\★成功★ ^-^.\\n\\n是否修改其他?\\n\\n\\t1).是 2).保存返回\\t[ ]\\b\\b\ scanf(\ 12 w2=1; /*来控制保存,使w2=1是标记已有过修改*/ } else {w0=0; if(w2==1) stu[k]=s; } //走到这里是由于用户没有确认这次修改(在调用修改函数w1=modify_data(k,n);时没有确认). 使W0=0,为了让终止循环, //stu[k]=s//,则把备份的s恢复给stu[k](即当次修改的),这样的好处是确保在此之前修改过的成功保存,而本次(用户没有确认的)不修改*/ if(w0!=1&&w2==1) /*W0不等于1则表示正常返回,w2=1表示在此之前有过修改,这时就保存用户已确认修改的并返回*/ save(n); /*w2不等于1表示在此次之前没有修改过(即:第一次),而又反悔这次修改,则不保存返回*/ } while(w0==1); teacher(); return 0; } /****************删除模块****************/ del() /*删除模块*/ {struct student s; int i,n,k,c,w0=1; n=load(); do {system(\ k=-1; /*给用户看全部记录以便确认要删除的记录*/ puts___(); printf_face(); /*调用显示数据结构项目函数*/ for(i=0;i {if((i!=0)&&(i==0)) /*目的是分屏显示,每10个一屏*/ {printf(\ . . .\ getch(); puts(\ } printf_one(i); /*调用显示一个记录的函数*/ } 13 puts___(); do {printf(\输入删除学号! NO.:\ scanf(\ /*输入要修改的数据的学号*/ for(i=0;i {k=i; /*找到要修改的记录的下标赋给K*/ s=stu[i]; } if(k==-1) printf(\不存在! 重新输入\表示没有找到相同之的*/ } while(k==-1); puts(\ printf_face(); /*调用显示数据结构项目函数*/ printf_one(k); /*调用显示一个记录的函数*/ printf(\是否确定?\\n\\t1).是 2).否且删除其他 3).保存全部返回 [ ]\\b\\b\ scanf(\ if(c==1) {stu[k].ave=0; /*stu[k].ave=0用来标识这个记录是要删除的.保存时则不保存stu[k].ave=0的数据*/ printf(\^-^ ★成功★ ^-^.\\n\\n是否重输?\\n\\t1).是 2).返回菜单\\t[ ]\\b\\b\ /*问是否继续*/ scanf(\ } if(c==3) w0=0; /*w0=0不删除直接返回*/ if(w0!=1&&c!=3) /*只有当确认删除后返回才保存,不删除直接返回则不保存,且不保存在此之前删除过的记录*/ save(n); } while(w0==1); teacher(); return 0;/*返回教师介面*/ } /****************查找模块****************/ int h(char k) {return(k%5);} int linkinsert(HNode *t[],char k) {/*向用拉链法处理冲突的散列表t中插入关键字为k的记录*/ 14 int i; HNode *p; i=h(k); if(t[i]==NULL) {p=(HNode*)malloc(sizeof(HNode)); p->key=k;p->link=NULL; t[i]=p;printf(\return(1);} else {p=t[i]; while(p!=NULL) if(p->key==k) {printf(\else if(p->link!=NULL) p=p->link; else{p->link=(HNode*)malloc(sizeof(HNode)); p=p->link;p->key=k;p->link=NULL; printf(\getch(); } } return 0; } HNode *linksearch(HNode *t[],char k) {/*在用拉链法处理冲突的散列表t中查找关键字为给定值k的记录*/ HNode *p; int i; i=h(k); if(t[i]==NULL)return(NULL); p=t[i]; while(p!=NULL) if(p->key==k) {printf(\return(p);} else p=p->link; return(NULL); } search() /*查找模块*/ {int i,n,k,w1=1,w2,w3,w4; 15