本科生导师制问题:数据结构和程序设计实验归档材料.doc
文本预览下载声明
计算机科学与技术学院实验课程归档材料规范
实验报告一
实验课名称:数据结构与程序设计实验
实验名称:本科生导师制问题
实验类型:设计型实验
班级:
学号:
姓名:
时间:
问题描述
在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带n个学生,如果该老师还带研究生,那么研究生也可直接带本科生。本科生导师制问题中的数据元素具有如下形式:
导师带研究生(老师,((研究生1,(本科生1,…,本科生m1)),(研究生2,(本科生1,…,本科生m2))…))
导师不带研究生(老师,(本科生1,…,本科生m))
导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级;本科生的自然情况只包括姓名、班级。
数据结构设计
本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。
定义教师、学生结点结构体如下:
typedef struct GLNode
{
char name[100]; /*教师或学生的姓名*/
char prof[100]; /*教师结点表示职称,学生结点表示班级*/
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 导师制用广义表实现示例
三、算法设计
建立:建立导师广义表。
GList InitGList(){
GList L = NULL, *l;
GList e;
e = InitGLNode(teacherli, fujiaoshou, 0);
InsertFirst_GL(L, e);
e = InitGLNode(teachergao, jiaoshou, 0);
InsertFirst_GL(L, e);
l = ((L-ptr).tp);
e = InitGLNode(wangping, erban, 2);
InsertFirst_GL(l, e);
e = InitGLNode(liming, yiban, 2);
InsertFirst_GL(l, e);
l = ((((L-ptr).hp)-ptr).tp);
e = InitGLNode(baimei, erban, 1);
InsertFirst_GL(l, e);
l = (((*l)-ptr).tp);
e = InitGLNode(ligang, yiban, 2);
InsertFirst_GL(l, e);
return L;
}
插入:将某位本科生或研究生插入到广义表的相应位置。
int InsertFirst_GL(GList *L, GLNode *e){
(e-ptr).hp = *L;
*L = e;
return 1;
}
删除:将某本科生或研究生从广义表中删除。
GList DeleteGLNode(GList *L, char *name){
GList *l = L, *p, temp;
if(l){
if(!strcmp((*l)-name, name)){
temp = *l;
*l = ((*l)-ptr).hp;
return temp;
}
if(((*l)-ptr).tp){
p = (((*l)-ptr).tp);
temp = DeleteGLNode(p, name);
if(temp) return temp;
}
if(((*l)-ptr).hp){
p = (((*l)-ptr).hp);
temp = DeleteGLNode(p, name);
if(temp) return temp;
}
}else{
显示全部