C语言实现本科生导师制问题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
导师不带研究生
(老师,(本科生1,…,本科生m))
导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级; 本科生的自然情况只包括姓名、班级。
2基本要求
要求完成以下功能:
建立:建立导师广义表。
插入:将某位本科生或研究生插入到广义表的相应位置。
删除:将某本科生或研究生从广义表中删除。 查询:查询导师、本科生(研究生)的情况。 统计:某导师带了多少个研究生和本科生。 输出:将某导师所带学生情况输出。
(2)本科生导师制问题
1问题描述
在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被 分给几个老师,每个老师带n个学生,如果该老师还带研究生,那么研究生也可 直接带本科生。本科生导师制问题中的数据元素具有如下形式:
导师带研究生
(老师,((研究生1,(本科生1,…,本科生ml)),(研究生2,(本科 生1,…,本科生m2))…))
指向本科生节点;s指向新建立的节点
int i,j,b;
char str[100];
b=1;
head=p=q=r=s=NULL;
while(b)
{printf("请输入人员信息");
sca nf("%s",str);
s =(GList *)malloc(sizeof(GList));
if(!s) printf("申请空间失败!");
break;
case1:if(p->ptr.tp)
q->ptr.hp=s;〃非首结点的处理
else
q->ptr.tp=s;II首结点的处理
q=s;
r=s;
break;
case 2: if(q->ptr.tp)
r->ptr.hp=s; II非首结点的处理
else
r->ptr.tp=s; II首结点的处理
{char name[100];
char prof[100];
int type;
struct {struct GLNode *hp,*tp;}ptr; /*hp指向同级的下一结点,tp指向下级的首结点*/
}GList;
GList *GListCreate()〃建立广义表
{GList *head,*p,*q,*s,*r;//简要介绍:head指向头结点;p指向导师结点;q指向研究生结点丁
广义表((高老师-教授-0,(李明-一班-2,王平-二班-2)),(李老师-副教授-0,(白梅-二班-1,(李刚-一班-2)))可以用图3表示。
图
源代码:
#in clude<stdio.h>
#in clude<stdlib.h>
#include<stri ng.h>
typedef struct GLNode//定义存储中缀表达式的结点类型
}
else
{if(q->type == 2)II该导师带本科生
{r = q;
while(r!= NULL)
{if(!strcmp(r- >n ame, n))
{printf("\n查询结果:姓名:%s班级:%s类型:本科生\n”,r->name,r->prof); printf("所属导师:姓名:%s职称:%s\n",p->name,p->prof);
r=s;
break;
default:printf("结点有误");
break;
}
printf("输入1:继续添加;输入0:录入结束");
scan f("%d", &b);
}
retur n head;
}
void In quire(GList *head)II查询信息
{char n[100];
GList *p,*q,*r;
i=i+1;
s->type = str[i]-48;
s->ptr.hp=NULL;
s->ptr.tp=NULL;
switch(s->type)
{case O:if(head)
p->ptr.hp=s;II非首结点
else
head=s; II首结点的处理
p=s;
r=q=s;II a在此等于m,主要是处理本科生直属于导师的情况
退出:程序结束。
3设计提示
本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。 定义教师、学生结点结构体如下:
typedef struct GLNode
{
char name[100];/*教师或学生的姓名*/
char prof[100];/*教师结点表示职称,学生结点表示班级*/
int type;/*结点类型:0-教师,1-研究生,2-本科生*/
int result;
result=0;
p = head;
prLeabharlann Baiduntf("\n请输入所查询人员的姓名:\n");
scan f("%s", n);
while(p != NULL&&result==0)
{q = p->ptr.tp;
if(!strcmp(p->n ame, n))
{printf("\n查询结果:姓名:%s职称:%s类型:导师\n”,p->name,p->prof); result=1;
for(j=0,i=0;str[i] != '-';j++,i++)〃将字符串中的学生信息转化成学生结点
s->n ame[j]=str[i];
s_>n ame[j] = '\0';
i=i+1;
for(j=0;str[i] != '-';j++,i++)
s->prof[j] = str[i];
s->prof[j] = '\0';
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职称:%s\n",p->name,p->prof);
struct {struct GLNode *hp, *tp;} ptr;
/*hp指向同级的下一结点,tp指向下级的首结点*/
}GList;
人员信息的表示形式为:高老师-教授-0、李刚-二班-1、李明-二班-2.
人员信息中的姓名、职称、班级、人员类型用“-”隔开,如高老师-教授-0,“咼老师”表示姓名,“教师”表示职称,“0”表示人员的类型是教师;李刚-二班-1, “李刚”表示姓名,“二班”表示班级,“1”表示人员的类型是研究生; 李明-二班-2,“李明”表示姓名,“二班”表示班级,“2”表示人员的类型是本 科生。
(老师,(本科生1,…,本科生m))
导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级; 本科生的自然情况只包括姓名、班级。
2基本要求
要求完成以下功能:
建立:建立导师广义表。
插入:将某位本科生或研究生插入到广义表的相应位置。
删除:将某本科生或研究生从广义表中删除。 查询:查询导师、本科生(研究生)的情况。 统计:某导师带了多少个研究生和本科生。 输出:将某导师所带学生情况输出。
(2)本科生导师制问题
1问题描述
在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被 分给几个老师,每个老师带n个学生,如果该老师还带研究生,那么研究生也可 直接带本科生。本科生导师制问题中的数据元素具有如下形式:
导师带研究生
(老师,((研究生1,(本科生1,…,本科生ml)),(研究生2,(本科 生1,…,本科生m2))…))
指向本科生节点;s指向新建立的节点
int i,j,b;
char str[100];
b=1;
head=p=q=r=s=NULL;
while(b)
{printf("请输入人员信息");
sca nf("%s",str);
s =(GList *)malloc(sizeof(GList));
if(!s) printf("申请空间失败!");
break;
case1:if(p->ptr.tp)
q->ptr.hp=s;〃非首结点的处理
else
q->ptr.tp=s;II首结点的处理
q=s;
r=s;
break;
case 2: if(q->ptr.tp)
r->ptr.hp=s; II非首结点的处理
else
r->ptr.tp=s; II首结点的处理
{char name[100];
char prof[100];
int type;
struct {struct GLNode *hp,*tp;}ptr; /*hp指向同级的下一结点,tp指向下级的首结点*/
}GList;
GList *GListCreate()〃建立广义表
{GList *head,*p,*q,*s,*r;//简要介绍:head指向头结点;p指向导师结点;q指向研究生结点丁
广义表((高老师-教授-0,(李明-一班-2,王平-二班-2)),(李老师-副教授-0,(白梅-二班-1,(李刚-一班-2)))可以用图3表示。
图
源代码:
#in clude<stdio.h>
#in clude<stdlib.h>
#include<stri ng.h>
typedef struct GLNode//定义存储中缀表达式的结点类型
}
else
{if(q->type == 2)II该导师带本科生
{r = q;
while(r!= NULL)
{if(!strcmp(r- >n ame, n))
{printf("\n查询结果:姓名:%s班级:%s类型:本科生\n”,r->name,r->prof); printf("所属导师:姓名:%s职称:%s\n",p->name,p->prof);
r=s;
break;
default:printf("结点有误");
break;
}
printf("输入1:继续添加;输入0:录入结束");
scan f("%d", &b);
}
retur n head;
}
void In quire(GList *head)II查询信息
{char n[100];
GList *p,*q,*r;
i=i+1;
s->type = str[i]-48;
s->ptr.hp=NULL;
s->ptr.tp=NULL;
switch(s->type)
{case O:if(head)
p->ptr.hp=s;II非首结点
else
head=s; II首结点的处理
p=s;
r=q=s;II a在此等于m,主要是处理本科生直属于导师的情况
退出:程序结束。
3设计提示
本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。 定义教师、学生结点结构体如下:
typedef struct GLNode
{
char name[100];/*教师或学生的姓名*/
char prof[100];/*教师结点表示职称,学生结点表示班级*/
int type;/*结点类型:0-教师,1-研究生,2-本科生*/
int result;
result=0;
p = head;
prLeabharlann Baiduntf("\n请输入所查询人员的姓名:\n");
scan f("%s", n);
while(p != NULL&&result==0)
{q = p->ptr.tp;
if(!strcmp(p->n ame, n))
{printf("\n查询结果:姓名:%s职称:%s类型:导师\n”,p->name,p->prof); result=1;
for(j=0,i=0;str[i] != '-';j++,i++)〃将字符串中的学生信息转化成学生结点
s->n ame[j]=str[i];
s_>n ame[j] = '\0';
i=i+1;
for(j=0;str[i] != '-';j++,i++)
s->prof[j] = str[i];
s->prof[j] = '\0';
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职称:%s\n",p->name,p->prof);
struct {struct GLNode *hp, *tp;} ptr;
/*hp指向同级的下一结点,tp指向下级的首结点*/
}GList;
人员信息的表示形式为:高老师-教授-0、李刚-二班-1、李明-二班-2.
人员信息中的姓名、职称、班级、人员类型用“-”隔开,如高老师-教授-0,“咼老师”表示姓名,“教师”表示职称,“0”表示人员的类型是教师;李刚-二班-1, “李刚”表示姓名,“二班”表示班级,“1”表示人员的类型是研究生; 李明-二班-2,“李明”表示姓名,“二班”表示班级,“2”表示人员的类型是本 科生。