数据结构实验报告第五章实验名称:本科生导师制问题实验类型:综合性实验班级:学号:姓名:实验日期:2014年6月7日1.问题描述在高校的教学改革中,有很多学校实行了本科生导师制。一个班级的学生被分给几个老师,每个老师带n个学生,如果该老师还带研究生,那么研究生也可直接带本科生。本科生导师制问题中的数据元素具有如下形式:导师带研究生(老师,((研究生1,(本科生1,…,本科生m1)),(研究生2,(本科生1,…,本科生m2))…))导师不带研究生(老师,(本科生1,…,本科生m))导师的自然情况只包括姓名、职称;研究生的自然情况只包括姓名、班级;本科生的自然情况只包括姓名、班级。要求完成以下功能:建立:建立导师广义表。插入:将某位本科生或研究生插入到广义表的相应位置。删除:将某本科生或研究生从广义表中删除。查询:查询导师、本科生(研究生)的情况。统计:某导师带了多少个研究生和本科生。输出:将某导师所带学生情况输出。退出:程序结束。2.数据结构设计本实验使用的数据结构是广义表,广义表采用头尾链表存储结构来实现。定义教师、学生结点结构体如下:typedefstructGLNode{charname[100];/*教师或学生的姓名*/charprof[100];/*教师结点表示职称,学生结点表示班级*/inttype;/*结点类型:0-教师,1-研究生,2-本科生*/struct{structGLNode*hp,*tp;}ptr;/*hp指向同级的下一结点,tp指向下级的首结点*/}GList;3.算法设计这个程序主要包括:建表、插入结点、删除结点、查找结点、统计导师结点下所有结点信息、输出某个节点或某个节点下所有信息。(1)建表Glist*createGlist()//创建一个教师表,返回指针赋给主函数的G头指针;{Glist*s=NULL,*g=NULL;intk=1;//用于控制是否继续输入while(k){g=createnode();//建立一个结点if(g==NULL){cout创建失败!;return0;}else//用尾插法插入{g-ptr.tp=NULL;g-ptr.hp=s;s=g;}cout是否继续?否:0是:1endl;cink;}returns;}(2)插入结点intInsertGlist(Glist*s)//向表中插入学生{charnam[10];Glist*suit,*g;cout请输入被插入的老师或研究生名字:;cinnam;suit=Findnode(s,nam);if(suit!=NULL){g=createnode();//生成结点并插入g-ptr.hp=suit-ptr.tp;g-ptr.tp=NULL;suit-ptr.tp=g;cout插入成功!;return1;}else{cout不存在这样的位置!;return0;}}(3)删除结点intDeleteGlist(Glist*s)//删除结点{charnam[10];cout请输入被删除人的名字:;cinnam;Glist*suit,*pre;suit=Findnode(s,nam);//找到结点位置if(suit==NULL){cout不存在此人!;return0;}else{//删除此节点pre=suit-1;pre-ptr.hp=suit-ptr.hp;cout删除成功!;return1;}}(4)查找结点Glist*Findnode(Glist*s,charnam[])//按姓名寻找位置{Glist*p=s;while(1){if(p==NULL)returnNULL;if(!strcmp(p-name,nam))returnp;//与当前结点对比,相等返回,不//等继续移动结点elseif(p-ptr.tp==NULL)p=(p-ptr.hp);//如果下级没有结点,望同级下一个//结点移动else{Glist*q=p-ptr.tp;q=Findnode(q,nam);//if(q==NULL)returnNULL;elsereturnq;//找到结点并返回其地址}}}intInsertGlist(Glist*s)//向表中插入学生{charnam[10];Glist*suit,*g;cout请输入被插入的老师或研究生名字:;cinnam;suit=Findnode(s,nam);if(suit!=NULL){g=createnode();//生成结点并插入g-ptr.hp=suit-ptr.tp;g-ptr.tp=NULL;suit-ptr.tp=g;cout插入成功!;return1;}else{cout不存在这样的位置!;return0;}}(5)统计intcount(Glist*s)//统计信息{intben=0;intyan=0;Glist*suit,*p=NULL;charnam[10];cout请输入要查询的教师名:;cinnam;suit=Findnode(s,nam);if(suit==NULL){cout该老师不存在;return0;}p=suit-ptr.tp;if(p-type==1)yan++;elseben++;while(1){if(p-ptr.hp==NULL){cout该老师带了:endl;cout本科生人数:ben''研究生人数:yanendl;return1;}else{if(p-type==1)yan++;elseben++;}p++;}}(6)输出voidpri(Glist*s)//输出s结点的信息{couts-names-profs-type;}intprint(Glist*s)//输出老师所带学生信息{Glist*suit,*p=NULL,*q=NULL;charnam[10];cout请输入要查询的教师名:;cinnam;suit=Findnode(s,nam);if(suit==NULL){cout该老师不存在;return0;}else{cout教师信息:endl;pri(suit);cout所带学生信息:endl;p=suit-ptr.tp;while(1){pri(p);//输出所带学生信息if(p-ptr.hp==NULL)return1;//如果同级下一个为空,返回if(p-type==1)//如果类型是1,研究生{q=p-ptr.tp;//研究生后面的学生while(1){pri(q);//输出研究生后面的所有学生if(q-ptr.hp==NULL)break;elseq=(q-ptr.hp);}}elsep=(p-ptr.hp);//移动到同级下一个}}}4.运行、测试与分析建立广义表,输入信息进行测试5.实验收获及思考遇到的问题:1.无法编译。2.输出结果不正确。解决办法:1.通过错误提示发现是变量拼写错误,改正后程序正常运行。2.重新查看先关代码,再分析算法是否无误,经过一步一步的执行找到问题所在。实验的收获:通过实验掌握了广义表的相关操作,并使用它做成了一个很小的应用,同时也对内存里数据的操作有了更深刻的理解,最重要的是通过不断地调试,提高了调试程序、分析问题的能力。附录:#includeiostream#includemalloc.h#includestring.husingnamespacestd;typedefstructGlnode{inttype;//结点类型:0-教师,1-研究生,2-本科生charname[10];//姓名charprof[20];//班级/职称struct{structGlnode*hp,*tp;//hp指向同级的下一结点,tp指向下级的首结点}ptr;}Glist;Glist*createnode()//生成任意类型的结点,具有通用性{Glist*s=(Glnode*)malloc(sizeof(Glnode));cout请输入信息:姓名班级/职称类别;cins-name;cins-prof;cins-type;s-ptr.hp=NULL;s-ptr.tp=NULL;returns;}Glist*createGlist()//创建一个教师表,返回指针赋给主函数的G头指针;{Glist*s=NULL,*g=NULL;intk=1;//用于控制是否继续输入while(k){g=createnode();//建立一个结点if(g==NULL){cout创建失败!;return0;}else//用尾插法插入{g-ptr.tp=NULL;g-ptr.hp=s;s=g;}cout是否继续?否:0是:1endl;cink;}returns;}Glist*Findnode(Glist*s,charnam[])//按姓名寻找位置{Glist*p=s;while(1){if(p==NULL)returnNULL;if(!strcmp(p-name,nam))returnp;//与当前结点对比,相等返回,不等继续移动结点elseif(p-ptr.tp==NULL)p=(p-ptr.hp);//如果下级没有结点,望同级下一个结点移动else{Glist*q=p-ptr.tp;q=Findnode(q,nam);//if(q==NULL)returnNULL;elsereturnq;//找到结点并返回其地址}}}intInsertGlist(Glist*s)//向表中插入学生{charnam[10];Glist*suit,*g;cout请输入被插入的老师或研究生名字:;cinnam;suit=Findnode(s,nam);if(suit!=NULL){g=createnode();//生成结点并插入g-ptr.hp=suit-ptr.tp;g-ptr.tp=NULL;suit-ptr.tp=g;cout插入成功!;return1;}else{cout不存在这样的位置!;return0;}}intDeleteGlist(Glist*s)//删除结点{charnam[10];cout请输入被删除人的名字:;cinnam;Glist*suit,*pre;suit=Findnode(s,nam);//找到结点位置if(suit==NULL){cout不存在此人!;return0;}else{//删除此节点pre=suit-1;pre-ptr.hp=suit-ptr.hp;cout删除成功!;return1;}}intinfo(Glist*s)//查询信息{charnam[10];Glist*suit;cout请输入要查询人的姓名:;cinnam;suit=Findnode(s,nam);cout(suit-name)-(suit-prof)-(suit-type)endl;}intcount(Glist*s)//统计信息{intben=0;intyan=0;Glist*suit,*p=NULL;charnam[10];cout请输入要查询的教师名:;cinnam;suit=Findnode(s,nam);if(suit==NULL){cout该老师不存在;return0;}p=suit-ptr.tp;if(p-type==1)yan++;elseben++;while(1){if(p-ptr.hp==NULL){cout该老师带了:endl;cout本科生人数:ben''研究生人数:yanendl;return1;}else{if(p-type==1)yan++;elseben++;}p++;}}intprint(