1、计算机科学与技术学院实验课程归档材料规范实验报告一实验课名称:数据结构与程序设计实验实验名称:本科生导师制问题 实验类型:设计型实验班级: 学号: 姓名: 时间:1、 问题描述在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带 n 个学生,如果该老师还带研究生,那么研究生也可直接带本科生。本科生导师制问题中的数据元素具有如下形式: 导师带研究生(老师, (研究生 1, (本科生 1,本科生 m1) ) , (研究生 2, (本科生 1,本科生 m2) ) ) 导师不带研究生(老师, (本科生 1,本科生 m) )导师的自然情况只包括姓名、职称;研究生的自
2、然情况只包括姓名、班级;本科生的自然情况只包括姓名、班级。2、数据结构设计本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。定义教师、学生结点结构体如下:typedef struct GLNodechar name100; /*教师或学生的姓名*/char prof100; /*教师结点表示职称,学生结点表示班级*/int type; /*结点类型:0-教师,1- 研究生,2-本科生*/struct struct GLNode *hp, *tp; ptr;/*hp 指向同级的下一结点,tp 指向下级的首结点*/GList;人员信息的表示形式为:高老师-教授-0、李刚- 二班-1
3、、李明-二班-2.人员信息中的姓名、职称、班级、人员类型用“-”隔开,如高老师- 教授-0, “高老师”表示姓名, “教师”表示职称, “0”表示人员的类型是教师;李刚-二班-1 , “李刚”表示姓名, “二班”表示班级, “1”表示人员的类型是研究生;李明- 二班-2, “李明”表示姓名, “二班”表示班级, “2”表示人员的类型是本科生。广义表(高老师-教授-0 , (李明- 一班-2,王平-二班-2) ) , (李老师- 副教授-0 , (白梅-二班-1, (李刚 -一班-2) ) )可以用图 3 表示。高老师教授0李明一班2 王平二班2 李老师副教授0 白梅二班1 李刚一班2 图 3
4、导师制用广义表实现示例三、算法设计建立:建立导师广义表。GList InitGList()GList L = NULL, *l;GList e;e = InitGLNode(“teacherli“, “fujiaoshou“, 0);InsertFirst_GL(e = InitGLNode(“teachergao“, “jiaoshou“, 0);InsertFirst_GL(l = e = InitGLNode(“wangping“, “erban“, 2);InsertFirst_GL(l, e);e = InitGLNode(“liming“, “yiban“, 2);InsertFi
5、rst_GL(l, e);l = e = InitGLNode(“baimei“, “erban“, 1);InsertFirst_GL(l, e);l = 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 *nam
6、e)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 = temp = DeleteGLNode(p, name);if(temp) return temp;if(*l)-ptr).hp)p = temp = DeleteGLNode(p, name);if(temp) return temp;elsereturn NULL;查询:查询导师、本科生(研究生)的情况。GList TravGList(GList L, char
7、*name)GList l;while(L!=NULL)if(!strcmp(L-name,name) return L;l = TravGList(L-ptr).tp, name);if(l) return l;L = (L-ptr).hp;return NULL;统计:某导师带了多少个研究生和本科生。int countStud(GList L, int *i, int *j)if(L)if(L-type = 1)(*i)+;else if(L-type = 2)(*j)+;else;countStud(L-ptr).tp, i, j);countStud(L-ptr).hp, i, j);
8、return 1;输出:将某导师所带学生情况输出。void PrintGLNode(GLNode *e)if(e=NULL) return;printf(“%s-%s-%d“, e-name, e-prof, e-type);打印:将广义表整个输出。void PrintGList(GList L)if(L=NULL) return;printf(“(“);while(L!=NULL)PrintGLNode(L);PrintGList(L-ptr).tp);printf(“ “);L = (L-ptr).hp;printf(“)“);退出:程序结束四、界面设计5、 运行测试与分析六、实验收获与思考1 掌握本科生导师制问题的思想与算法2 使用数据结构广义表实现本科生导师制问题3 结合理论,深入掌握知识教师评分:教师签字: