C语言实现本科生导师制问题.doc_第1页
C语言实现本科生导师制问题.doc_第2页
C语言实现本科生导师制问题.doc_第3页
C语言实现本科生导师制问题.doc_第4页
C语言实现本科生导师制问题.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

(2)本科生导师制问题问题描述在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带n个学生,如果该老师还带研究生,那么研究生也可直接带本科生。本科生导师制问题中的数据元素具有如下形式:l 导师带研究生(老师,(研究生1,(本科生1,本科生m1),(研究生2,(本科生1,本科生m2)l 导师不带研究生(老师,(本科生1,本科生m)导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级;本科生的自然情况只包括姓名、班级。基本要求要求完成以下功能:l 建立:建立导师广义表。l 插入:将某位本科生或研究生插入到广义表的相应位置。l 删除:将某本科生或研究生从广义表中删除。l 查询:查询导师、本科生(研究生)的情况。l 统计:某导师带了多少个研究生和本科生。l 输出:将某导师所带学生情况输出。l 退出:程序结束。设计提示本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。定义教师、学生结点结构体如下:typedef struct GLNodechar name100; /*教师或学生的姓名*/char prof100; /*教师结点表示职称,学生结点表示班级*/int type; /*结点类型:0-教师,1-研究生,2-本科生*/struct struct GLNode *hp, *tp; ptr; /*hp指向同级的下一结点,tp指向下级的首结点*/GList;人员信息的表示形式为:高老师-教授-0、李刚-二班-1、李明-二班-2.人员信息中的姓名、职称、班级、人员类型用“-”隔开,如高老师-教授-0,“高老师”表示姓名,“教师”表示职称,“0”表示人员的类型是教师;李刚-二班-1,“李刚”表示姓名,“二班”表示班级,“1”表示人员的类型是研究生;李明-二班-2,“李明”表示姓名,“二班”表示班级,“2”表示人员的类型是本科生。广义表(高老师-教授-0,(李明-一班-2,王平-二班-2),(李老师-副教授-0,(白梅-二班-1,(李刚-一班-2)可以用图3表示。图3 导师制用广义表实现示例源代码:#include #include#includetypedef struct GLNode /定义存储中缀表达式的结点类型char name100; char prof100; int type; struct struct GLNode *hp,*tp;ptr; /*hp指向同级的下一结点,tp指向下级的首结点*/GList; GList *GListCreate() /建立广义表GList *head,*p,*q,*s,*r; /简要介绍:head指向头结点;p指向导师结点;q指向研究生结点;r指向本科生节点; s指向新建立的节点 int i,j,b; char str100; b=1; head=p=q=r=s=NULL; while(b) printf(请输入人员信息); scanf(%s,str); s =(GList *)malloc(sizeof(GList); if(!s) printf(申请空间失败!); for(j=0,i=0;stri != -;j+,i+) /将字符串中的学生信息转化成学生结点 s-namej = stri; s-namej = 0; i=i+1; for(j=0;stri != -;j+,i+) s-profj = stri; s-profj = 0; i=i+1; s-type = stri - 48; s-ptr.hp=NULL; s-ptr.tp=NULL; switch(s-type) case 0:if(head) p-ptr.hp=s; / 非首结点 else head=s; / 首结点的处理 p=s; r=q=s; / a在此等于m,主要是处理本科生直属于导师的情况 break; case 1: if(p-ptr.tp) q-ptr.hp=s; /非首结点的处理 else q-ptr.tp=s; / 首结点的处理 q=s; r=s; break; case 2: if(q-ptr.tp) r-ptr.hp=s; /非首结点的处理 else r-ptr.tp=s; /首结点的处理 r=s; break; default:printf(结点有误); break; printf(输入1:继续添加;输入0:录入结束); scanf(%d,&b); return head;void Inquire(GList *head) /查询信息char n100; GList *p,*q,*r; int result; result=0; p = head; printf(n请输入所查询人员的姓名:n); scanf(%s,n); while(p != NULL&result=0) q = p-ptr.tp; if(!strcmp(p-name,n) printf(n查询结果:姓名:%s 职称:%s 类型:导师n,p-name,p-prof); result=1; else if(q-type = 2) / 该导师带本科生 r = q; while(r!= NULL) if(!strcmp(r-name,n) printf(n查询结果:姓名:%s 班级:%s 类型:本科生n,r-name,r-prof); printf(所属导师:姓名:%s 职称:%sn,p-name,p-prof); result=1; r=r-ptr.hp; else while(q!= NULL) r = q-ptr.tp; if(!strcmp(q-name,n) printf(n查询结果:姓名:%s 班级:%s 类型:研究生n,q-name,q-prof); printf(所属导师:姓名:%s 职称:%sn,p-name,p-prof); result=1; while(r!= NULL) if(!strcmp(r-name,n) printf(n查询结果:姓名:%s 班级:%s 类型:本科生n,r-name,r-prof); printf(所属导师:姓名:%s 职称:%sn,p-name,p-prof); printf(所属导师生:姓名:%s 班级:%sn,q-name,q-prof); result=1; r=r-ptr.hp; q = q-ptr.hp; p=p-ptr.hp; if(!result) printf(查无此人!n); printf(n);GList *StudentInsert(GList *head) /插入学生 char student100,teacher100,graduate100; GList *s,*p,*q,*r; int i,j; p = head; printf(请输入待插入学生信息,如:李刚-二班-1n); scanf(%s,student); s =(GList *)malloc(sizeof(GList); if(!s) printf(申请空间失败!); for(j=0,i=0;studenti != -;j+,i+) /将字符串中的学生信息转化成学生结点 s-namej = studenti; s-namej = 0; i=i+1; for(j=0;studenti != -;j+,i+) s-profj = studenti; s-profj = 0; i=i+1; s-type = studenti - 48; s-ptr.hp=NULL; s-ptr.tp=NULL; printf(请输入所属导师姓名:n); scanf(%s,teacher); while(p&strcmp(p-name,teacher) p = p-ptr.hp; if(!p) printf(此导师不存在,不能插入!n); else switch(s-type) case 1:if(!p-ptr.tp) p-ptr.tp=s; printf(插入成功!n); else if(p-ptr.tp-type=2) printf(该导师只能带本科生,因此不能将研究生插入!n); else q=p-ptr.tp; while(q-ptr.hp) q=q-ptr.hp; q-ptr.hp=s; printf(插入成功!n); break; case 2:if(!p-ptr.tp) p-ptr.tp=s; printf(插入成功!n); else switch(p-ptr.tp-type) case 1:printf(请输入所属研究生姓名:n); /导师带研究生 scanf(%s,graduate); q=p-ptr.tp; while(q&strcmp(q-name,graduate) q=q-ptr.hp; if(!q) printf(该研究生不存在,不能插入!n); else if(!q-ptr.tp) q-ptr.tp=s; printf(插入成功!n); else r=q-ptr.tp; while(r-ptr.hp) r=r-ptr.hp; r-ptr.hp=s; printf(插入成功!n); break; case 2:if(!p-ptr.tp) /导师带本科生 p-ptr.tp=s; printf(插入成功!n); else r=p-ptr.tp; while(r-ptr.hp) r=r-ptr.hp; r-ptr.hp=s; printf(插入成功!n); break; default:printf(结点有误); break; break; default:printf(结点有误); break; return head;GList *StudentDelete(GList *head) / 删除学生 char student100; GList *s,*p,*q,*r,*t; int i,j,result; result=0; p=q=r=head; printf(请输入待删除学生信息,如:李刚-二班-1n); scanf(%s,student); s =(GList *)malloc(sizeof(GList); if(!s) printf(申请空间失败!); for(j=0,i=0;studenti != -;j+,i+) /将字符串中的学生信息转化成学生结点 s-namej = studenti; s-namej = 0; i=i+1; for(j=0;studenti != -;j+,i+) s-profj = studenti; s-profj = 0; i=i+1; s-type = studenti - 48; s-ptr.hp=NULL; s-ptr.tp=NULL; switch(s-type) case 1: do if(p-ptr.tp-type=1) q=p-ptr.tp; t=p; while(q&strcmp(q-name,s-name) t=q; q=q-ptr.hp; if(!strcmp(q-name,s-name) if(q-ptr.tp) printf(此研究生下有本科生,请先将本科生移至别处,再删除此研究生); result=2; break; else result=1; if(t-type=0) t-ptr.tp=q-ptr.hp; else t-ptr.hp=q-ptr.hp; free(q); p=p-ptr.hp; while(p != NULL&result=0); break; case 2: do if(!p-ptr.tp) p=p-ptr.hp; continue; else switch(p-ptr.tp-type) case 1: q=p-ptr.tp; /导师带研究生 while(q&!result) t=q; r=t-ptr.tp; while(r&strcmp(r-name,s-name) t=r; r=r-ptr.hp; if(r) result=1; if(t-type=1) t-ptr.tp=r-ptr.hp; else t-ptr.hp=r-ptr.hp; free (r); else q=q-ptr.hp; break; case 2:r=p-ptr.tp; /导师带本科生 t=p; while(!result&r) while(r&strcmp(r-name,s-name) t=r; r=r-ptr.hp; if(r) result=1; if(t-type=0) t-ptr.tp=r-ptr.hp; else t-ptr.hp=r-ptr.hp; free(r); break; default:break; p=p-ptr.hp; while(p != NULL&result=0); break; default:printf(结点有误); break; if(result=0) printf(查无此人); return head;void StudentCount(GList *head)/统计导师的研究生、本科生人数GList *p,*q,*r; int graduate=0,ungraduate=0; char teacher100; printf(请输入老师姓名:n); scanf(%s,teacher); p=head; while(p&strcmp(p-name,teacher) p=p-ptr.hp; if(!p) printf(查无此导师); else if(p-ptr.tp) if(p-ptr.tp-type=1) q=p-ptr.tp; while(q) graduate+; r=q-ptr.tp; while(r) ungraduate+; r=r-ptr.hp; q=q-ptr.hp; else r=p-ptr.tp; while(r) ungraduate+; r=r-ptr.hp; printf(该导师带的研究生数为%d,graduate); printf(该导师带的本科生数为%d,ungraduate); void GListPrint(GList *head)/输出广义表GList *p,*q,*r; p = head; while(p) printf(%s-%s-%d ,p-name,p-prof,p-type); if(p-ptr.tp) /导师带学生 switch(p-ptr.tp-type) case 1:q=p-ptr.tp; /导师带研究生 while(q) printf(%s-%s-%d ,q-name,q-prof,q-type); if(q-ptr.tp) /研究生带本科生 r=q-ptr.tp; while(r) print

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论