1、各个数据元素均含有类型相同,可唯一标识数据元素的关键字。数据关系R:数据元素同属一个集合。search(s)初始条件:静态表已存在查询信息addstudent(&增加宿舍信息Deletstudent(&删除宿舍信息changestudent(&修改宿舍信息 ADT StaticSearchTable2.本程序模块:主程序模块void main()定义一个数组; switch(选择) case 1:查询 case 2 :增加学生信息 case 3 :删除学生信息 case 4 :修改学生信息 case 0 : 退出系统 初始化模块建立一个数组查询模块查询增加信息模块增加信息删除信息模块删除信息修
2、改信息模块修改信息各模块之间的调用关系如下:修改信息模块 主程序模块 删除信息模块初始 查询 增加信息模块化模块 模块四_9(3)详细设计1.函数的调用关系反映了演示程序的层次结构 主程序 InitRoom Search addstudent Deletstudent changestudent InserSortnumber InserSortnumber InserSortnumber InserSortnumberInserSortroomnumber InserSortroom InserSortroom InserSortroomInserSortname InserSortname
3、 InserSortname InserSortname2.结构体声明:typedef struct string name; string number; string address;RedType; RedType rMAXSIZE + 1; int length;Sqlist;3各函数功能:InserSortnumber()用冒泡法对学号进行排序,并写入number.txt;InserSortroomnumber()用冒泡法对房号进行排序,并写入room.txt;InserSortname ()用冒泡法对姓名进行排序,并写入name.txt;InitRoom()添加宿舍信息 ,并分别保
4、存到changestudent changestudent ame.txt;Search()查询宿舍信息Addstudent()增加宿舍信息,并分别保存到changestudent changestudent ame.txt;Deletstudent()删除宿舍信息,并分别保存到changestudent changestudent ame.txt;Changestudent()修改宿舍信息 ,并分别保存到changestudent changestudent ame.txt;4.main()int _tmain(int argc, _TCHAR* argv) Sqlist s; int n;
5、 couts.length;*输入学生基本信息 InitRoom(s); do cout*学生宿舍管理系统* coutn; switch(n) case 1: coutdata = ch; CreatBiTree(T-lchild);rchild);中序线索二叉树:void InOrderThreading(BiThrTree &Thrt,BiThrTree & Thrt = new BiThrNode; /设置头结点Thrt) exit(1); Thrt-LTag = Link; /头结点左边标志为指针 RTag =Thread; /右边的为线索rchild = Thrt; /有孩子指向头结
6、点本身T) Thrt-lchild = Thrt; /若树根结点为空,则头结点左孩子指向头结点 /若根结点不为空, Thrt-lchild = T; /头结点左孩子指向根结点 pre = Thrt; /设置指针pre指向头结点 InThreading(T); /线索化树T pre-RTag = Thread;rchild = pre;线索化树:void InThreading(BiThrTree p) if(p) InThreading(p- /线索化左子树p-lchild) p-LTag = Thread;lchild = pre; pre-rchild) pre-rchild = p; p
7、re = p;中序遍历:int InOrderTraverse_Thr(BiThrTree T) BiThrTree p; int i=1; p = T-lchild; while(p!=T) while(p-LTag!=Thread) p = p-datadata; i+; length+;RTag=Thread&rchild!rchild; ai=p- /将结点存于数组中 i+; length+; p = p- return OK;四_7(四)调式分析1.采用先序输入建立二叉树2.申请一头结点,中序线索化二叉树;3.中序遍历线索二叉树,并用数组a记录中序输出的data;4.用辅助数组a访问
8、结点的前驱和后继四_7(五)测试结果:题目10:最小生成树问题(*)四_10()、设计题目要求:1 利用克鲁斯卡尔算法求网的最小生成树。2 利用普里姆算法求网的最小生成树。3 要求输出各条边及它们的权值。四_10(二)、需求分析和概要设计:用克鲁斯卡尔和普里姆算法生成图的最小生成树。首先要构造出图,然后将图生成树,故要使用邻接矩阵储存图。四_10(三)、详细设计:1.结构体声明:typedef struct ArcCell VRType adj; /VRType是顶点的关系类型。无权图用1或0表示相连否。对带权图,则为权值类型。 InfoType *info; /表示相关信息的指针ArcCel
9、l,AdjMatrixMAX_VEXTEX_NUMMAX_VEXTEX_NUM;typedef struct VertexType vexsMAX_VEXTEX_NUM; /顶点向量 AdjMatrix arcs; /邻接矩阵 int vexnum,arcnum; /图的当前顶点数和弧度数MGraph; VertexType adjvex; VRType lowcost;closedge; VertexType begin; VertexType end; VRType weight;EdgeType;2.函数声明:int CreateGraph(MGraph &G); /创造图int Loc
10、ateVex(MGraph G,VertexType u); /定位int minmum( closedge closedgeMAX_VEXTEX_NUM);/当前边中的最小边void MinSpanTree_PRIM(MGraph G,VertexType u);/prim算法最小生成树void MinSpanTree_KRUSKAL(MGraph G);/kruskal算法求最小生成树4.各功能模块:G) /创造图 int i,j,k,w; VertexType v1,v2;请输入顶点数和边数G.vexnumG.arcnum; high=G.arcnum; for(i=0;iG.vexnu
11、m;+i)请输入第i+1个顶点信息G.vexsi;+i) /初始化邻接矩阵 for(j=0;j+j) G.arcsij.adj =INFINITY; G.arcsij.info=NULL; for(k=0;k+k)k+1v2w; i=LocateVex(G,v1); j=LocateVex(G,v2); while(i =-1|j=-1)顶点有误,重新输入: edgesk+1.begin=v1; edgesk+1.end=v2; G.arcsij.adj=w; G.arcsji.adj=w; edgesk+1.weight=w;int LocateVex(MGraph G,VertexType
12、 u) / 查找 int i; bool flage = false;i+) if(u=G.vexsi) flage =true; return i; if(flage = flage) return -1;void MinSpanTree_PRIM(MGraph G,VertexType u) /prim int k,j,i; closedge closedgeMAX_VEXTEX_NUM; k=LocateVex(G,u); for(j=0; if(j != k) closedgej.adjvex=u; closedgej.lowcost=G.arcskj.adj; closedgek.l
13、owcost=0; for(i=1; k=minmum(closedge);边:(closedgek.adjvex,G.vexsk)权值:closedgek.lowcost closedgek.lowcost=0; for(j=1; if(G.arcskj.adjclosedgej.lowcost) closedgej.adjvex=G.vexsk; closedgej.lowcost=G.arcskj.adj; void HeapAdjust(int s,int high) /权值堆排序 edges0.weight=edgess.weight; edges0.begin=edgess.beg
14、in; edges0.end=edgess.end; for(int j=2*s;=high;j*=2) if(jhigh&edgesj.weight=edgesj.weight) edgess.weight=edgesj.weight; edgess.begin=edgesj.begin; edgess.end=edgesj.end; s=j; edgess.weight=edges0.weight; edgess.begin=edges0.begin; edgess.end=edges0.end;void HeapSort() int i ; for(i=high/2;i0;-i) Hea
15、pAdjust(i,high); for(i=high;1; edges0.weight=edges1.weight; edges0.begin=edges1.begin; edges0.end=edges1.end; edges1.weight=edgesi.weight; edges1.begin=edgesi.begin; edges1.end=edgesi.end; edgesi.weight=edges0.weight; edgesi.begin=edges0.begin; edgesi.end=edges0.end; HeapAdjust(1,i-1);void MinSpanTr
16、ee_KRUSKAL(MGraph G) /kruskal HeapSort(); for(int k=1;=G.arcnum;k+)edgesk.weight int fatherMAX_VEXTEX_NUM; int i,j,vf1,vf2; fatheri=-1; i=0;j=0; while(iG.arcnum&G.vexnum-1) vf1=Find(father,edgesi+1.begin); vf2=Find(father,edgesi+1.end); if(vf1!=vf2) fathervf2=vf1; j+; coutedgesi+1.beginedgesi+1.endedgesi+1.weight 四_10(四)、调试分析1.通信线路一旦建成,必然是双向的。因此,构造最小生成树的网一定是无向网。设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,可利用C语言提供的随机函数产生。2.图的存储结构的选取应和所作操作相适应。为了便于选择权值最小的边,此题的存储结构既不选用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组表示图。3.kruskal要避免环路产生,设置标志数组。四_10(五)、测试数
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1