数据结构课程设计报告.docx
- 文档编号:28216262
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:51
- 大小:282.22KB
数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(51页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
数据结构课程设计
设计题目:
_图的遍历和生成树求解实现___
学生姓名:
__董军
专业班级:
____11软件技术一班_
指导教师:
__汪红霞
完成时间:
2012年12月_
信息工程学院信管系
课题名称
图的遍历和生成树求解实现
院系
信息工程学院
年级专业
11软件一班
学号
姓名
成绩
1132104102
董军
1132104107
孔德阳
1132104109
刘凯旋
1132104123
王孝飞
1132104125
魏扬城
课题设计
目的与
设计意义
1、课题设计目的:
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
2、课题设计意义:
对图的基本操作实现了全面的了解,在图的掌握上更具有完整性了;
课程设计给我总结了以前课本上的所学,实现了由理论到实践的转变;
通过此次合作,我们有了团队的意识,一个项目的成败是一个集体的体现。
指导教师:
汪红霞
2012年12月
安徽新华学院课程设计成绩评定表(专科)
第一章概述
1.1数据结构的概念
在计算机科学中,数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象(数据元素)以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。
“数据结构”作为一门独立的课程在国外是从1968年才开始设立的。
1968年美国唐·欧·克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
“数据结构”在计算机科学中是一门综合性的专业基础课。
数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。
数据结构这一门课的内容不仅是一般程序设计(特别是非数值性程序设计)的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。
计算机是一门研究用计算机进行信息表示和处理的科学。
这里面涉及到两个问题:
信息的表示,信息的处理。
而信息的表示和组织又直接关系到处理信息的程序的效率。
随着计算机的普及,信息量的增加,信息范围的拓宽,使许多系统程序和应用程序的规模很大,结构又相当复杂。
因此,为了编写出一个“好”的程序,必须分析待处理的对象的特征及各对象之间存在的关系,这就是数据结构这门课所要研究的问题。
众所周知,计算机的程序是对信息进行加工处理。
在大多数情况下,这些信息并不是没有组织,信息(数据)之间往往具有重要的结构关系,这就是数据结构的内容。
数据的结构,直接影响算法的选择和效率。
计算机解决一个具体问题时,大致需要经过下列几个步骤:
首先要从具体问题中抽象出一个适当的数学模型,然后设计一个解此数学模型的算法(Algorithm),最后编出程序、进行测试、调整直至得到最终解答。
寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学的语言加以描述。
计算机算法与数据的结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率。
运算是由计算机来完成,这就要设计相应的插入、删除和修改的算法。
也就是说,数据结构还需要给出每种结构类型所定义的各种运算的算法。
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并由计算机程序处理的符号的总称。
数据元素是数据的基本单位,在计算机程序中通常作为一个整体考虑。
一个数据元素由若干个数据项组成。
数据项是数据的不可分割的最小单位。
有两类数据元素:
一类是不可分割的原子型数据元素,如:
整数"5",字符"N"等;另一类是由多个款项构成的数据元素,其中每个款项被称为一个数据项。
例如描述一个学生的信息的数据元素可由下列6个数据项组成。
其中的出生日期又可以由三个数据项:
"年"、"月"和"日"组成,则称"出生日期"为组合项,而其它不可分割的数据项为原子项。
关键字指的是能识别一个或多个数据元素的数据项。
若能起唯一识别作用,则称之为"主"关键字,否则称之为"次"关键字。
数据对象是性质相同的数据元素的集合,是数据的一个子集。
数据对象可以是有限的,也可以是无限的。
数据处理是指对数据进行查找、插入、删除、合并、排序、统计以及简单计算等的操作过程。
在早期,计算机主要用于科学和工程计算,进入八十年代以后,计算机主要用于数据处理。
据有关统计资料表明,现在计算机用于数据处理的时间比例达到80%以上,随着时间的推移和计算机应用的进一步普及,计算机用于数据处理的时间比例必将进一步增大。
1.2为什么要进行数据结构课程设计
在计算机发展的初期,人们使用计算机的目的主要是处理数值计算问题。
当我们使用计算机来解决一个具体问题时,一般需要经过下列几个步骤:
首先要从该具体问题抽象出一个适当的数学模型,然后设计或选择一个解此数学模型的算法,最后编出程序进行调试、测试,直至得到最终的解答。
例如,求解梁架结构中应力的数学模型的线性方程组,可以使用迭代算法来求解。
由于当时所涉及的运算对象是简单的整型、实型或布尔类型数据,所以程序设计者的主要精力是集中于程序设计的技巧上,而无须重视数据结构。
随着计算机应用领域的扩大和软、硬件的发展,非数值计算问题越来越显得重要。
据统计,当今处理非数值计算性问题占用了85%以上的机器时间。
这类问题涉及到的数据结构更为复杂,数据元素之间的相互关系一般无法用数学方程式加以描述。
因此,解决这类问题的关键不再是数学分析和计算方法,而是要设计出合适的数据结构,才能有效地解决问题。
1.3课程设计的任务与要求
软件设计课程设计是学习完《数据结构》课程后进行的一次全面的综合性实践过程,其目的在于为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生分析解决实际问题的能力。
提高学生实践编程的能力。
这次的课程设计,我主要是设计图的遍历以及生成树的求解,包含存储、遍历、最小生成树的求解。
而图的遍历和生成树的求解这个程序是一个简单的图的基本操作实现系统。
这个程序不仅要包含创建图中包含的顶点数、边数,还应具有图的两种遍历、最小生成树的求解等功能。
第二章系统功能描述
2.1基本概括
一个图必有顶点和边,在此基础上实现图的存储,进而实现图的遍历和最小生成树的求解。
2.2基本功能操作
具有以下几种功能:
1、先任意创建一个图;
2、图的DFS,BFS的递归和非递归算法的实现
3、最小生成树(两个算法)的实现,求连通分量的实现
4、要求用邻接矩阵、邻接表等多种结构存储实现
2.3基本功能流程图
开始
输入一个数
Kruskal算法
Prim算法
广度优先遍历
深度优先遍历
邻接表
邻接矩阵
创建图
结束
第三章系统设计
3.1系统总体设计
3.1.1模块划分
程序设计一般由两部分组成:
算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。
图是一种较线性表和树更为复杂的数据结构。
在线性表中,数据元素之间仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素(及其孩子结点)相关但只能和上一层中一个元素(即双亲结点)相关;而在图形结构中,节点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。
生成树求解主要利用普利姆和克雷斯特算法求解最小生成树,只有强连通图才有生成树。
3.1.2功能分析
a.图的邻接矩阵存储:
根据所建无向图的结点数n,建立n*n的矩阵,其中元素全是无穷大(int_max),再将边的信息存到数组中。
其中无权图的边用1表示,无边用0表示;有全图的边为权值表示,无边用∞表示。
b.图的邻接表存储:
将信息通过邻接矩阵转换到邻接表中,即将邻接矩阵的每一行都转成链表的形式将有边的结点进行存储。
c.图的广度优先遍历:
假设从图中的某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后再访问此邻接点的未被访问的邻接点,并使“先被访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到。
若此时图中还有未被访问的,则另选未被访问的重复以上步骤,是一个非递归过程。
d.图的深度优先遍历:
假设从图中某顶点v出发,依依次访问v的邻接顶点,然后再继续访问这个邻接点的系一个邻接点,如此重复,直至所有的点都被访问,这是个递归的过程。
e.图的连通分量:
这是对一个非强连通图的遍历,从多个结点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其连通分量的顶点集。
本程序利用的图的深度优先遍历算法
3.2系统详细设计
3.2.1定义库函数
#include
#include
usingnamespacestd;
#defineint_max10000//最大值
staticintn=0;//全局变量,判断有权图和无权图
staticinto=0;//全局变量,清除错误
staticintl=0;//全局变量,清除错误
#defineinf9999//最小值的最大值
#definemax20//最大顶点个数
typedefintVRType,QElemType,Status;
typedefcharInfoType,VertexType;
3.2.2定义功能函数
ADTQueue{
数据对象:
D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}
数据关系:
R1={
基本操作:
InitQueue(&Q)
操作结果:
构造一个空队列Q。
QueueEmpty(Q)
初始条件:
Q为非空队列。
操作结果:
若Q为空队列,则返回真,否则为假。
EnQueue(&Q,e)
初始条件:
Q为非空队列。
操作结果:
插入元素e为Q的新的队尾元素。
DeQueue(&Q,e)
初始条件:
Q为非空队列。
操作结果:
删除Q的队头元素,并用e返回其值。
}ADTQueue
ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={
谓词P(v,w)定义了弧
基本操作P:
CreatGraph(&G,V,VR);
初始条件:
V是图的顶点集,VR是图中弧的集合。
操作结果:
按V和VR的定义构造图G。
BFSTraverse(G,visit());
初始条件:
图G存在,Visit是定点的应用函数。
操作结果:
对图进行广度优先遍历。
在遍历过程中对每个顶点
调用函数Visit一次且仅一次。
一旦visit()失
败,则操作失败。
DFSTraverse(G,visit());
初始条件:
图G存在,Visit是定点的应用函数。
操作结果:
对图进行广度优先遍历。
在遍历过程中对每个顶点
调用函数Visit一次且仅一次。
一旦visit()失
败,则操作失败。
DFStra_fen(G)
初始条件:
图G存在,存在图的深度优先遍历算法。
操作结果:
从多个顶点对图进行深度优先遍历,得到连通分量。
}ADTGraph;
3.2.3函数编制
邻接矩阵定义:
typedefstructArcCell
{
VRTypeadj;//VRType是顶点关系类型。
对无权图,用1或0表示相邻否;对带权图,则为权值类型
InfoType*info;//该弧相关信息的指针
}ArcCell,AdjMatrix[max][max];
typedefstruct
{
VertexTypevexs[max];//顶点向量
AdjMatrixarcs;//邻接矩阵
intvexnum,arcnum;//图的当前顶点数和弧数
}MGraph_L;
邻接表的定义:
typedefstructArcNode//弧结点
{
intadjvex;//该弧指向的顶点的位置
structArcNode*nextarc;//指向下一条弧的指针
InfoType*info;//该弧相关信息的指针
}ArcNode;
typedefstructVNode//邻接链表顶点头接点
{
VertexTypedata;//顶点信息
ArcNode*firstarc;//指向第一条依附该顶点的弧的指针
}VNode,AdjList;
typedefstruct//图的定义
{
AdjListvertices[max];
intvexnum,arcnum;//图的当前顶点数和弧数
}ALGraph;
队列定义:
typedefstructQNode
{
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
{
QueuePtrfront;//队头指针
QueuePtrrear;//队尾指针
}LinkQueue;
邻接矩阵存储:
intcreatMGraph_L(MGraph_L&G)//创建图用邻接矩阵表示
{
charv1,v2;
inti,j,w;
cout<<"请输入顶点和弧的个数"< cin>>G.vexnum>>G.arcnum; cout<<"输入各个顶点"< for(i=0;i { cin>>G.vexs[i]; } for(i=0;i for(j=0;j { G.arcs[i][j].adj=int_max; G.arcs[i][j].info=NULL; } for(intk=0;k { cout<<"输入一条边依附的顶点和权"< cin>>v1>>v2>>w;//输入一条边依附的两点及权值 i=localvex(G,v1);//确定顶点V1和V2在图中的位置 j=localvex(G,v2); G.arcs[i][j].adj=w; G.arcs[j][i].adj=w; } for(i=0;i! =G.vexnum;++i) for(j=0;j! =G.vexnum;++j) { if(G.arcs[i][j].adj! =1&&G.arcs[i][j].adj } if(n>=1)cout<<"这是一个有权图"< elsecout<<"这是一个无权图"< cout<<"图G邻接矩阵创建成功! "< returnG.vexnum; } 邻接矩阵的输出: voidljjzprint(MGraph_LG)//邻接矩阵的输出 { inti,j; if(n==0) { for(i=0;i! =G.vexnum;++i) { for(j=0;j! =G.vexnum;++j) { if(G.arcs[i][j].adj==int_max){cout<<"0"<<"";} else{cout< } cout< } } else { for(i=0;i! =G.vexnum;++i) { for(j=0;j! =G.vexnum;++j) { if(G.arcs[i][j].adj==int_max){cout<<"∞"<<"";} else{cout< } cout< } } } 用邻接表存储图: intcreatadj(ALGraph&gra,MGraph_LG)//用邻接表存储图 { inti=0,j=0; ArcNode*arc;//,*tem,*p; for(i=0;i! =G.vexnum;++i) { gra.vertices[i].data=G.vexs[i]; gra.vertices[i].firstarc=NULL; } for(i=0;i! =G.vexnum;++i) for(j=0;j! =G.vexnum;++j) { if(G.arcs[i][j].adj! =int_max) { arc=(ArcNode*)malloc(sizeof(ArcNode)); arc->adjvex=j; arc->nextarc=gra.vertices[i].firstarc; gra.vertices[i].firstarc=arc; } } gra.vexnum=G.vexnum; gra.arcnum=G.arcnum; cout<<"图G邻接表创建成功! "< return1; } 邻接表输出: voidadjprint(ALGraphgra,MGraph_LG)//邻接表输出 { inti; for(i=0;i! =gra.vexnum;++i) { ArcNode*p; cout<<"["< p=gra.vertices[i].firstarc; while(p! =NULL) { cout<<"->"<<"["< p=p->nextarc; } cout<<"->"<<"End"; cout< } } 初始化队列: StatusInitQueue(LinkQueue&Q)//初始化队列 { Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); if(! Q.front)return0;//存储分配失败 Q.front->next=NULL; return1; } 入队: StatusEnQueue(LinkQueue&Q,QElemTypee)//入队,插入元素e为Q的新的队尾元素 { QueuePtrp; p=(QueuePtr)malloc(sizeof(QNode)); if(! p)return0;//存储分配失败 p->data=e;p->next=NULL; Q.rear->next=p;Q.rear=p; return1; } 出队: StatusDeQueue(LinkQueue&Q,QElemType&e)//出队,若队列不空,则删除Q的队头元素,用e返回,并返回真,否则假 { QueuePtrp; if(Q.front==Q.rear)return0; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p)Q.rear=Q.front; free(p); return1; } 判断队为空: StatusQueueEmpty(LinkQueueQ)//判断队为空 { if(Q.front==Q.rear)return1; return0; } 广度优先遍历: voidBFSTraverse(ALGraphgra) { inti,e; LinkQueueq; for(i=0;i! =gra.vexnum;++i)visited[i]=0; InitQueue(q); for(i=0;i! =gra.vexnum;++i) if(! visited[i]) { visited[i]=1; cout< EnQueue(q,i); while(! QueueEmpty(q)) { DeQueue(q,e); for(we=firstadjvex(gra,gra.vertices[e]);we>=0;we=nextadjvex(gra,gra.vertices[e],we)) { if(! visited[we]) { visited[we]=1; cout< EnQueue(q,we); } } } } } 深度优先遍历: intDFS(ALGraphgra,inti) { visited[i]=1; intwe1; cout< for(we=firstadjvex(gra,gra.vertices[i]);we>=0;we=nextadjvex(gra,gra.vertices[i],we)) { we1=we; if(visited[we]==0) DFS(gra,we); we=we1; } return1; } intDFStra(ALGraphgra) { inti,j; for(i=0;i! =gra.vexnum;++i) { visited[i]=0; } for(j=0;j! =gra.vexnum;++j) { if(visited[j]==0)DFS(gra,j); } return0; } 连通分量: intDFSTraverse_fen(ALGraphgra) { inti,j; for(i=0;i! =gra.vexnum;++i) visited[i]=0; for(j=0;j! =gra.vexnum;++j) { if(visited[j]==0) { DFS(gra,j); cout< l++; } } return0; } 主函数: intmain() { ints; c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告