xx大学数据结构课程设计报告Word文件下载.docx
《xx大学数据结构课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《xx大学数据结构课程设计报告Word文件下载.docx(6页珍藏版)》请在冰豆网上搜索。
根据所输入数据构造图,形成直观的图形;
运用BFS算法将所输入数据构成的图进行标识,演示标识过程,并将不同构件的顶点标识成不同的颜色;
输入错误弹出对话框提示;
使用多组测试数据证明结果正确。
三、系统定义
系统边界:
显示组成各个不同的构件的顶点只输入一个开始遍历的顶点图形显示无向图显示构件的个数,即图中子连通图的个数输入不同的顶点数且不超过11个按照输入的顶点数,输入正确个数的边子连通图的颜色不同系统描述:
本系统是一个实现实际应用性很强的功能的系统。
实际生活中,有很多方面需要对
一个大的系统按照其相互关联的关系进行小的分类,这需要建立一个模型,本系统抽象其为无向图的模型,实现对子连通图的标识。
其中通过输入图中顶点数和边数以及开始遍历的顶点进行图的构造,图形显示无向图,并显示图的构件的个数及各不同构件的元素组成。
四、需求分析
数据结构需求:
输入为图中各顶点和各边,还需要输入开始进行遍历的顶点;
输出为输入数据所构成的无向图和构件的个数以及各构件的元素组成。
操作需求:
首先输入顶点数,边数和各个顶点各个边以及开始遍历的顶点,输入完
成后点击BFS按钮将所输入的数据生成构件图在下边的图形界面显示,可以点击上一步或下一步按钮浏览生成过程。
系统需求说明:
可供11个顶点以及最多55条边存储的空间;
以秒为单位的响应速度;
能对数据输入的各种不同序列做出相应的响应。
五、数据结构设计
逻辑结构:
非线性结构,无向图顶点和边构成,分为连通图和非连通图,非连通图又几个小的子连通图构成,进行构件时,分别对图中的子连通图进行标识。
存储结构:
采用邻接多重链表结构存储数据,如下图所示:
六、算法设计
抽象数据类型
ADTAMLGraph(无向图){
数据对象:
具有相同特征的无向图中的顶点集和边;
typedefstructEBox{
VisitIf mark;
(访问标记)
int ivex,jvex;
(该边依附的两个顶点的位置)
structEBox*ilink,*jlink;
(分别指向依附这两个顶点的下一条边)}EBox;
typedefstruct{VertexTypedata;
EBox *firstedge;
(指向第一条依附该顶点的边)}VexBox;
typedefstruct{
VexBoxadjmulist[MAX_VERTEX_NUM];
(存储顶点及其指针的数组)
int vexnum,edgenum;
(无向图的当前顶点数和边数)}AMLGraph;
基本操作:
CreatGragh(CStringX,CStringY)操作结果:
构造无向图;
intLocateVex(AMLGraphG,VertexTypeu)
操作结果:
寻找顶点在图中的位置;
VertexType&
GetVex(AMLGraphG,intv)操作结果:
返回v的顶点值
intFirstAdjVex(AMLGraphG,VertexTypev)操作结果:
寻找v的第一个邻接顶点;
intNextAdjVex(AMLGraphG,VertexTypev,VertexTypew)操作结果:
返回v的(相对于w的)下一个邻接顶点;
intMarkUnvisited(AMLGraph&
G)操作结果:
标记边为unvisited;
intDeleteVex(AMLGraph&
G,VertexTypev)操作结果:
删除G中顶点v及其相关的边;
voidDestroyGraph(AMLGraph&
销毁一个图;
}ADT抽象数据类型名称
算法思想流程图
运用邻接多重链表的存储方式,存储图的顶点和边,根据所输入的数据构成所需要的无向图,然后根据BFS算法,从输入的遍历顶点开始,应用队列和数组实现图的构造;
并且在图中的xx框中显示构件的个数和各构件的组成元素。
输入错误输入图中的边顶点和边根据错误类型弹出相应的提示对话框开始界面
输入正确输入正确
从开始顶点起按照输入顺序进入队列将输入的边存入链表结构中,边的顶点指向此顶点的第一条边,此边作为此顶点的第一条边将输入的顶点存入数组中将图中各顶点初始化标记为0,m初始化为0
否进入队列,标记该顶点,并改变坐标位置画图,与此次循环源坐标连线不进入队列,得到此顶点的坐标位置,与源坐标连线该顶点是否标记?
是删除队列的第一个数据,设为u;
shuju+=u;
得到与该顶点相连的下一条边的顶点否标记该顶点,m加一,如果m>
1,CString类型的shuju+=“;
”,改变原来画笔颜色,确定此次循环源坐标位置,将位置存入数组中,画出矩形并将该数据写入框中该顶点标记否?
是
七、功能模块功能模块
图形化显示输入的图,不同的构件用不同的颜色展示,并显示构件的个数和各构件的组成元素否队列是否为空?
是结束演示1.输入数据,包括图的各顶点,各边以及生成图的开始顶点;
2图形显示输入的的数据所构成的图,并用不同的颜色标识子连通图,即图的不同构件;
3.显示图的构件的个数和组成各个构件的顶点。
界面设计
八、测试和运行
1.输入顶点数据abcdeae,弹出窗口如下:
2.输入边为abba,弹出窗口如下:
3.不输入数据,弹出提示对话框如下:
3.输入俩个遍历顶点是,弹出窗口如下:
4.输入顶点:
abcde边为:
aa;
开始遍历顶点:
a如下:
开始遍历顶点为b时如下:
5.输入正确的数据,顶点为abcd,边为abacad,遍历顶点为c窗口如下:
开始遍历顶点为a,如下:
6.输入顶点为abcdef,边为abacbcdedf开始遍历的顶点为a如下图形界面:
九、总结
经过不到俩周的紧张的数据结构的课程设计,我学到了许多东西也深深体会到了做程序员的不易。
从刚开始对课程的迷茫,不知道要怎么做,感觉无从下手到后来慢慢懂得了如何下手,这个过程是艰难的,但结果却是喜悦的,但是事情总是没有我们想的那样简单,问题接踵而来,对于我做的课程设计来说,那便是在界面上显示图形,查了好多资料都没有实例可供参考,最终不得不自己硬着头皮使劲想,才把代码写出来,可问题又来了,运行时出现了错误,在经过了n多遍的检查后才发现错误,改正错误。
可是尽管过程如此艰难,但是当图形显示出来的那一刻,心里的喜悦却是无法言喻的,功夫不负有心人的感觉。
同时我也明白了做好一个系统首先要做好的就是需求分析,包括数据需求和系统需求,这关系着你后来的设计功能是否满足要求以及设计的系统的强大性,这些东西我以前是不怎么会提前考虑的,总是直接下手代码,但是实践证明这个分析必不可少,它可以防止你写程序时,误入错误的方向。
总之,有付出就有回报,你不逼自己一把,永远不知道自己有多优秀!
话说回来,系统还有许多不足之处,这就需要以后学习更多的知识来弥补这个缺憾,争取做到最好!
附:
charc=B[++jj];
if(a==b&
&
c==k||a==k&
c==b){:
:
MessageBox(NULL,_T(\请输入不同的边
\提示\
}
if(js==dds)
{:
MessageBox(NULL,_T(\输入的边不正确,请输入图中顶点的边
for(intii=0;
ii=1){Goujian=Goujian+\
if(!
Visited[(v+z)%]) /*v尚未访问*/{ mm++;
Visited[(v+z)%]=1;
/*设置访问标志为TRUE(已访问)*/
Goujian=Goujian+[(v+z)%].data;
EnQueue(Q,(v+z)%);
while(!
QueueEmpty(Q))/*队列不空*/{
DeQueue(Q,u);
for(w=FirstAdjVex(G,[u].data);
w>
=0;
w=NextAdjVex(G,[u].data,[w].data))
{
Visited[w])
Visited[w]=1;
Goujian=Goujian+[w].data;
EnQueue(Q,w);
}}
itoa(mm,&
s,10);
Geshu=s;
}
voidBFShuatu(AMLGraphG,VertexTypestart){/*从start顶点起,广度优先遍历图G*/intv,u,w,z;
intm=-1;
inta=-1;
intb=-1;
LinkQueueQ;
intn=;
int*X=newint[n];
int*Y=newint[n];
int*DX=newint[n];
//存放的坐标与每个顶点的位置相对应int*DY=newint[n];
for(v=0;
vdata
QueueEmpty(Q))/*队列不空*/{
x0=X[++b];
y0=Y;
intq=0;
q++;
Visited[w])
Visited[w]=1;
EnQueue(Q,w);
if(xdata
if(Visited[w]){
intxz=DX[w];
intyz=DY[w];
MoveToEx(hdc,xz,yz,NULL);
LineTo(hdc,x0,y0);
}
DestroyQueue(Q);
/*销毁队列,释放其占用空间*/}