C语言实现本科生导师制问题Word格式.docx
- 文档编号:20491196
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:15
- 大小:59.10KB
C语言实现本科生导师制问题Word格式.docx
《C语言实现本科生导师制问题Word格式.docx》由会员分享,可在线阅读,更多相关《C语言实现本科生导师制问题Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
/*教师结点表示职称,学生结点表示班级*/
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>
stdlib.h>
string.h>
typedefstructGLNode//定义存储中缀表达式的结点类型
{charname[100];
struct{structGLNode*hp,*tp;
}ptr;
/*hp指向同级的下一结点,tp指向下级的首结点*/
GList*GListCreate()〃建立广义表
{GList*head,*p,*q,*s,*r;
//简要介绍:
head指向头结点;
p指向导师结点;
q指向研究生结点丁
指向本科生节点;
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;
j++,i++)
prof[j]=str[i];
prof[j]='
type=str[i]-48;
ptr.hp=NULL;
ptr.tp=NULL;
switch(s->
type)
{caseO:
if(head)
p->
ptr.hp=s;
II非首结点
else
head=s;
II首结点的处理
p=s;
r=q=s;
IIa在此等于m,主要是处理本科生直属于导师的情况
break;
case1:
if(p->
ptr.tp)
q->
〃非首结点的处理
ptr.tp=s;
q=s;
r=s;
case2:
if(q->
r->
II非首结点的处理
default:
printf("
结点有误"
}
输入1:
继续添加;
输入0:
录入结束"
scanf("
%d"
&
b);
returnhead;
voidInquire(GList*head)II查询信息
{charn[100];
GList*p,*q,*r;
intresult;
result=0;
p=head;
\n请输入所查询人员的姓名:
\n"
n);
while(p!
=NULL&
&
result==0)
{q=p->
ptr.tp;
strcmp(p->
name,n))
\n查询结果:
姓名:
%s职称:
%s类型:
导师\n”,p->
name,p->
prof);
result=1;
{if(q->
type==2)II该导师带本科生
{r=q;
while(r!
=NULL)
{if(!
strcmp(r->
%s班级:
%s类型:
本科生\n”,r->
name,r->
printf("
所属导师:
姓名:
%s职称:
%s\n"
p->
result=1;
r=r->
ptr.hp;
{while(q!
{r=q_>
strcmp(q->
name,n))
%s班级:
%s类型:
研究生\n"
q->
name,q->
%s班级:
本科生\n"
r->
name,r->
所属导师生:
q=q->
p=p->
result)printf("
查无此人!
\n"
printf("
GList*Studentlnsert(GList*head)//插入学生
{charstudent[100],teacher[100],graduate[100];
GList*s,*p,*q,*r;
inti,j;
printf(”请输入待插入学生信息,如:
李刚-二班-1\n"
student);
s)printf(”申请空间失败!
student[i]!
name[j]=student[i];
prof[j]=student[i];
type=student[i]-48;
请输入所属导师姓名:
teacher);
while(p&
name,teacher))
p=p->
p)
此导师不存在,不能插入!
{switch(s->
{case1:
{p->
插入成功!
{if(p_>
ptr.tp_>
type==2)
该导师只能带本科生,因此不能将研究生插入!
{q=p->
while(q->
ptr.hp)
q=q->
{p_>
〃导师带研究生
{switch(p->
ptr.tp->
请输入所属研究生姓名:
graduate);
q=p->
while(q&
name,graduate))q=q_>
q)
该研究生不存在,不能插入!
{q->
{r=q->
while(r->
ptr.hp)r=r->
r->
ptr.tp)//导师带本科生
{r=p->
printf(”结点有误”);
break;
type){case1:
do
type==1){q=p->
t=p;
name,s->
name))
{t=q;
{printf("
此研究生下有本科生,请先将本科生移至别处,再删除此
研究生"
result=2;
{result=1;
if(t->
type==O)t_>
ptr.tp=q_>
elset->
ptr.hp=q->
free(q);
}p=p->
}while(p!
result==0);
{p=p->
continue;
q=p->
//导师带研究生
while(q&
!
result)
r=t->
while(r&
name))
{t=r;
r=r->
if(r)
type==1)t->
ptr.tp=r->
ptr.hp=r->
free(r);
elseq=q->
r=p->
//导师带本科生
while(!
result&
r)
{while(r&
elset->
free(r);
if(result==0)printf("
查无此人"
voidStudentCount(GList*head)〃统计导师的研究生、本科生人数
{GList*p,*q,*r;
intgraduate=O,ungraduate=O;
charteacher[100];
请输入老师姓名:
p=head;
查无此导师”);
{if(p->
type==1)
while(q)
{graduate++;
r=q->
while(r)
{ungraduate++;
q=q_>
该导师带的研究生数为%d"
该导师带的本科生数为%d"
ungraduate);
voidGListPrint(GList*head)〃输出广义表
while(p)
%s_%s_%d"
name,p->
prof,p->
type);
if(p->
ptr.tp)//导师带学生
{switch(p_>
〃导师带研究生
name,q->
prof,q->
if(q->
ptr.tp)〃研究生带本科生
%s-%s-%d”,r->
prof,r->
r=p->
//导师直接带本科生
%s-%s-%d"
}voidmain()
{intb;
GList*Head;
Head=NULL;
1.建立广义表\n"
Head=GListCreate();
do
2.插入学生\n"
3.删除学生\n"
4.查询信息\n"
5.统计导师的研究生、本科生人数
6.输出广义表\n"
0.退出\n"
&
switch(b)
Head=Studentlnsert(Head);
case3:
Head=StudentDelete(Head);
case4:
Inquire(Head);
case5:
StudentCount(Head);
case6:
GListPrint(Head);
case0:
选择有误"
if(b==0)break;
}while
(1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 实现 本科生 导师制 问题