C语言实现本科生导师制问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(2)本科生导师制问题

①问题描述

在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带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 导师制用广义表实现示例

源代码:

#include

#include

#include

typedef struct GLNode //定义存储中缀表达式的结点类型

{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指向研究生结点;r 指向本科生节点; s指向新建立的节点

int i,j,b;

char str[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)

{case 0:if(head)

p->ptr.hp=s; // 非首结点

else

head=s; // 首结点的处理

p=s;

r=q=s; // a在此等于m,主要是处理本科生直属于导师的情况

break;

case 1: if(p->ptr.tp)

q->ptr.hp=s; //非首结点的处理

else

q->ptr.tp=s; // 首结点的处理

q=s;

r=s;

break;

case 2: 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);

}

return head;

}

void Inquire(GList *head) //查询信息

{char n[100];

GList *p,*q,*r;

int result;

result=0;

p = head;

printf("\n请输入所查询人员的姓名:\n");

scanf("%s",n);

while(p != NULL&&result==0)

{q = p->ptr.tp;

if(!strcmp(p->name,n))

相关文档
最新文档