预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

(2)本科生导师制问题 =1\*GB3①问题描述 在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带n个学生,如果该老师还带研究生,那么研究生也可直接带本科生。本科生导师制问题中的数据元素具有如下形式: 导师带研究生 (老师,((研究生1,(本科生1,…,本科生m1)),(研究生2,(本科生1,…,本科生m2))…)) 导师不带研究生 (老师,(本科生1,…,本科生m)) 导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级;本科生的自然情况只包括姓名、班级。 =2\*GB3②基本要求 要求完成以下功能: 建立:建立导师广义表。 插入:将某位本科生或研究生插入到广义表的相应位置。 删除:将某本科生或研究生从广义表中删除。 查询:查询导师、本科生(研究生)的情况。 统计:某导师带了多少个研究生和本科生。 输出:将某导师所带学生情况输出。 退出:程序结束。 =3\*GB3③设计提示 本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。 定义教师、学生结点结构体如下: typedefstructGLNode { charname[100];/*教师或学生的姓名*/ charprof[100];/*教师结点表示职称,学生结点表示班级*/ inttype;/*结点类型:0-教师,1-研究生,2-本科生*/ struct{structGLNode*hp,*tp;}ptr; /*hp指向同级的下一结点,tp指向下级的首结点*/ }GList; 人员信息的表示形式为:高老师-教授-0、李刚-二班-1、李明-二班-2. 人员信息中的姓名、职称、班级、人员类型用“-”隔开,如高老师-教授-0,“高老师”表示姓名,“教师”表示职称,“0”表示人员的类型是教师;李刚-二班-1,“李刚”表示姓名,“二班”表示班级,“1”表示人员的类型是研究生;李明-二班-2,“李明”表示姓名,“二班”表示班级,“2”表示人员的类型是本科生。 广义表((高老师-教授-0,(李明-一班-2,王平-二班-2)),(李老师-副教授-0,(白梅-二班-1,(李刚-一班-2)))可以用图3表示。 图3导师制用广义表实现示例 源代码: #include<stdio.h> #include<stdlib.h> #include<string.h> typedefstructGLNode//定义存储中缀表达式的结点类型 {charname[100]; charprof[100]; inttype; struct{structGLNode*hp,*tp;}ptr;/*hp指向同级的下一结点,tp指向下级的首结点*/ }GList; GList*GListCreate()//建立广义表 {GList*head,*p,*q,*s,*r;//简要介绍:head指向头结点;p指向导师结点;q指向研究生结点;r指向本科生节点;s指向新建立的节点 inti,j,b; charstr[100]; 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;str[i]!='-';j++,i++)//将字符串中的学生信息转化成学生结点 s->name[j]=str[i]; s->name[j]='\0'; i=i+1; for(j=0;str[i]!='-';j++,i++) s->prof[j]=str[i]; s->prof[j]='\0'; i=i+1; s->type=str[i]-48; s->ptr.hp=NULL; s->ptr.tp=NULL; switch(s->type) {case0:if(head) p->ptr.hp=s;//非首结点 else head=s;//首结点的处理 p=s; r=q=s;//a在此等于m,主要是处理本科生直属于导师的情况 break; case1:if(p->ptr.tp) q->ptr.hp=s;//非首结点的处理 else q->ptr.tp=s;//首结点的处理 q=s; r=s; break; case2: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); } returnhead; } vo