《数据结构》课程设计任务书学期:11-12-2 班级:网络10一、设计目的《数据结构》是一门实践性较强的专业基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。
本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
二、设计要求1、通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2、学生必须仔细研读《数据结构》课程设计(实习)要求,以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题及时主动与指导教师沟通。
3、本次课程设计按照教学要求需要在一周半时间内独立完成,学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时地向指导教师汇报。
4、编程语言任选。
三、设计选题题一:线索二叉树(**)任务:1.建立中序线索二叉树,并且中序遍历;2.求中序线索二叉树上已知结点中序的前驱和后继;需求分析和概要设计:建立中序线索二叉树,并且中序遍历。
首先就是要建立树,再将树中序线索化。
求中序线索二叉树上已知结点中序的前驱和后继时,即是将树在遍历一遍。
也可以在遍历的过程中,将树的结点放在数组中,当然必须讲述先遍历一遍,这是用空间来换时间。
详细设计:树的结构体的声明:typedef char TElemtype;typedef enum PointerTag{Link,Thread}; //设置标志:Link为指针,Thread为线索typedef struct BiThrNode{ //树结点结构体TElemtype data;struct BiThrNode *lchild,*rchild;PointerTag LTag,RTag;}BiThrNode,*BiThrTree;相关函数的声明:void InitBiTree(BiThrTree &T); //初始化树void CreatBiTree(BiThrTree &T); //建立二叉树void InOrderThreading(BiThrTree &Thrt,BiThrTree &T); //中序线索二叉树void InThreading(BiThrTree p); //线索化int InOrderTraverse_Thr(BiThrTree T); //中序遍历void InOrderThread_BeAf(); //求已知结点中序的前驱和后继初始化树:void InitBiTree(BiThrTree &T){T = new BiThrNode;if(!T) exit(1);T = NULL;}建立二叉树:void CreatBiTree(BiThrTree &T){char ch;cin>>ch;if(ch == '@') T = NULL;else{T = new BiThrNode;if(!T) exit(1);T->data = ch;CreatBiTree(T->lchild);CreatBiTree(T->rchild);}}中序线索二叉树:void InOrderThreading(BiThrTree &Thrt,BiThrTree &T){Thrt = new BiThrNode; //设置头结点if(!Thrt) exit(1);Thrt->LTag = Link; //头结点左边标志为指针Thrt->RTag =Thread; //右边的为线索Thrt->rchild = Thrt; //有孩子指向头结点本身if(!T) Thrt->lchild = Thrt; //若树根结点为空,则头结点左孩子指向头结点else{ //若根结点不为空,Thrt->lchild = T; //头结点左孩子指向根结点pre = Thrt; //设置指针pre指向头结点InThreading(T); //线索化树Tpre->rchild = Thrt;pre->RTag = Thread;Thrt->rchild = pre;}}线索化树:void InThreading(BiThrTree p){if(p){InThreading(p->lchild); //线索化左子树if(!p->lchild){p->LTag = Thread;p->lchild = pre;}if(!pre->rchild){pre->RTag = Thread;pre->rchild = p;}pre = p;InThreading(p->rchild);}}中序遍历:int InOrderTraverse_Thr(BiThrTree T){BiThrTree p;int i=1;p = T->lchild;while(p!=T){while(p->LTag!=Thread)p = p->lchild;cout<<p->data<<" ";a[i]=p->data;i++;length++;while(p->RTag==Thread&&p->rchild!=T){p = p->rchild;cout<<p->data<<" ";a[i]=p->data; //将结点存于数组中i++;length++;}p = p->rchild;}return OK;}测试结果和设计心得体会:通过对树的中序线索化使我更加清楚树的有关操作算法。
题二:最小生成树问题(***)【问题描述】若要在n个城市之间建设通信网络,只需要假设n-1条线路即可。
如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。
【系统要求】1.利用克鲁斯卡尔算法求网的最小生成树。
2.利用普里姆算法求网的最小生成树。
3.要求输出各条边及它们的权值。
【测试数据】由学生任意指定,但报告上要求写出多批数据测试结果。
【实现提示】通信线路一旦建成,必然是双向的。
因此,构造最小生成树的网一定是无向网。
设图的顶点数不超过30个,并为简单起见,网中边的权值设成小于100的整数,可利用C语言提供的随机函数产生。
图的存储结构的选取应和所作操作相适应。
为了便于选择权值最小的边,此题的存储结构既不选用邻接矩阵的数组表示法,也不选用邻接表,而是以存储边(带权)的数组表示图。
【选作内容】利用堆排序实现选择权值最小的边。
需求分析和概要设计:用克鲁斯卡尔和普里姆算法生成图的最小生成树。
首先要构造出图,然后将图生成树,故要使用邻接矩阵储存图。
详细设计:有关结构体的声明:typedef char VertexType;typedef int VRType;typedef char InfoType;typedef struct ArcCell{VRType adj; //VRType是顶点的关系类型。
无权图用1或0表示相连否。
对带权图,则为权值类型。
InfoType *info; //表示相关信息的指针}ArcCell,AdjMatrix[MAX_VEXTEX_NUM][MAX_VEXTEX_NUM];typedef struct{VertexType vexs[MAX_VEXTEX_NUM]; //顶点向量AdjMatrix arcs; //邻接矩阵int vexnum,arcnum; //图的当前顶点数和弧度数}MGraph;typedef struct{VertexType adjvex;VRType lowcost;}closedge;typedef struct{VertexType begin;VertexType end;VRType weight;}EdgeType;相关函数的声明:int CreateGraph(MGraph &G); //创造图后要返回其值int LocateVex(MGraph G,VertexType u); //求点u在图中的位置int minmum( closedge closedge[MAX_VEXTEX_NUM]);//求最小值函数void MinSpanTree_PRIM(MGraph G,VertexType u); //PRIM最小生成树void MinSpanTree_KRUSKAL(MGraph G); // KRUSKAL最小生成树创造图:int CreateGraph(MGraph &G){int i,j,k,w;VertexType v1,v2;cout<<"请输入顶点数和边数"<<endl;cin>>G.vexnum>>G.arcnum;high=G.arcnum;cout<<"请输入顶点信息"<<endl;for(i=0;i<G.vexnum;++i)cin>>G.vexs[i];for(i=0;i<G.vexnum;++i) //初始化邻接矩阵{for(j=0;j<G.vexnum;++j){G.arcs[i][j].adj =INFINITY; //最大值∞G.arcs[i][j].info=NULL;}}cout<<"请输入每条边对应的两个顶点(v1,v2)及其权值(w)"<<endl;for(k=0;k<G.arcnum;++k){cin>>v1>>v2>>w;i=LocateVex(G,v1);j=LocateVex(G,v2);edges[k+1].begin=v1;edges[k+1].end=v2;G.arcs[i][j].adj=w;G.arcs[j][i].adj=w;edges[k+1].weight=w;}return OK;}PRIM最小生成树:void MinSpanTree_PRIM(MGraph G,VertexType u){int k,j,i;closedge closedge[MAX_VEXTEX_NUM];cin>>u;k=LocateVex(G,u);for(j=0;j<G.vexnum;++j){closedge[j].adjvex=u;closedge[j].lowcost=G.arcs[k][j].adj;}closedge[k].lowcost=0;for(i=1;i<G.vexnum;++i){k=minmum(closedge);cout<<"边:("<<closedge[k].adjvex<<","<<G.vexs[k]<<")权值:"<<closedge[k].lowcost<<endl;closedge[k].lowcost=0;for(j=1;j<G.vexnum;++j)if(G.arcs[k][j].adj<closedge[j].lowcost){closedge[j].adjvex=G.vexs[k];closedge[j].lowcost=G.arcs[k][j].adj;}}}KRUSKAL最小生成树:void MinSpanTree_KRUSKAL(MGraph G){HeapSort();for(int k=1;k<=G.arcnum;k++)cout<<edges[k].weight<<" ";cout<<endl;int father[MAX_VEXTEX_NUM];int i,j,vf1,vf2;for(i=0;i<G.vexnum;i++)father[i]=-1;i=0;j=0;while(i<G.arcnum&&j<G.vexnum-1){vf1=Find(father,edges[i+1].begin);vf2=Find(father,edges[i+1].end);{if(vf1!=vf2){father[vf2]=vf1;j++;cout<<"边:("<<edges[i+1].begin<<","<<edges[i+1].end<<")权值:"<<edges[i+1].weight<<endl;}}i++;}}测试结果和设计心得体会:通过对图的操作更加明白图与树之间的关系。