数据结构课程设计报告撰写要求Word格式.docx
- 文档编号:19499677
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:23
- 大小:297.52KB
数据结构课程设计报告撰写要求Word格式.docx
《数据结构课程设计报告撰写要求Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告撰写要求Word格式.docx(23页珍藏版)》请在冰豆网上搜索。
学号:
200704011030
姓名:
指导教师:
郑志勇
目录
沈阳航空工业学院-2-
1需求分析1
1.1题目内容及要求1
1.2题目分析1
2系统设计3
2.1数据结构设计3
2.2函数设计4
2.2.1系统流程5
图2.2.1系统流程5
2.2.2PRIM函数流程5
2.2.3Huitu函数流程6
2.2.4GraphicVer函数输出邻接矩阵6
3调试分析7
3.1调试初期7
3.2调试中期7
3.3调试后期9
4测试及运行结果10
4.1欢迎界面10
4.2获取输入,绘制无向图10
4.3输出邻接矩阵13
4..4.演示PRIM算法生成最小生成树13
4.5用户退出14
参考文献15
附录(关键部分程序清单)16
1需求分析
1.1题目内容及要求
以合适方便的方式输入一个带权值的无向图,采用合适的存储结构存储该无向图。
然后根据PRIM算法求该无向图的最小生成树并输出。
要求:
1.输入无向图的方法尽量简单方便
2.要能够形象方便地观察无向图的图形结构
3.要能够形象地演示PRIM算法求最小生成树的过程
1.2题目分析
刚拿到题目,乍看一下题目很简短,貌似很简单,但是细看之后就发现了很多隐藏在简短语句后的更深一层次的要求。
首先是“以合适方便的方式输入”,短短十个字就向你提出了两方面要求:
首先是“输入”,即代表你最好可以得到一种通用的算法让你对一定范围内的数据进行运算后从而得到正确的结果;
“合适方便”即提示你要从输入方便且有利于运算的输入数据的方法;
采用合适的存储结构必然是本次课设当之无愧的重点,亦是此题目的第三方面要求;
最后就是用PRIM算法求无向图的最小生成树。
PRIM算法在理解与实现方面不是很困难,但要求能够形象的演示该算法就不是那么简单了。
无论从算法角度,还是从输入方便、存储安全角度,数组都是此次课设的不二选择,即采用邻接矩阵的存储方式来存储无向带权图。
虽然邻接表的动态存储可以令该算法使用更大规模的数据并在一定范围内比数组更加节省空间并有更高的效率,但此次课设另一个重点就是演示算法而非真正的应用于实际问题,所以只需要较少的数据量来完成PRIM算法的演示即可。
故数组的便于操作及更加稳定、方便的优势便凸显出来。
在画图这个问题上,我曾一度找错了方向。
刚拿到题目时,我只是望文生义的认为我需要演示的是最小生成树一步一步的演示过程,这让我一度选择VC6.0中的MFC来演示过程。
但后来,当我因为MFC当量调用WINDOWS的程序并有较多的头文件而焦头烂额的时候,重读课设要求的时候我才发现,过于注重细枝末节的我竟没有抓住此题目真正要求!
“模拟PRIM算法最小生成树的过程”即是让你显示PRIM算法在更接近计算机可以理解的方式上显示其具体过程。
TurboC的超强的图像处理让我明白,它就是我这次课设的系统环境了。
2系统设计
2.1数据结构设计
对于无向图的任何操作,无疑都必须依赖于数据的存储结构。
这里的存储结构不仅仅指的是数据在计算机中的物理内存,更多的是抽象程度更高的抽象数据结构。
图的存储结构主要有两种:
邻接矩阵和邻接表。
邻接表以一个一维数组作表头节点存储图的顶点,然后利用表头引出所有以该点为箭尾的邻接边的信息;
而邻接矩阵则是单独建立一个一维数组来存储顶点的信息,并以顶点的个数来建立一个相应的N阶对称矩阵,以二维数组存储单元来存储相应边的权值。
由于PRIM算法需要多次修改closeedge[]中的adjvex和lowcost值,且此次数据规模较小,只需达到演示部分数据即可,所以统一采用数组的存储结构,即亦采用邻接矩阵的存储结构来存储无向带权图更利于实现及操作。
邻接矩阵的抽象数据结构定义:
#defineINFINITYINT_MAX//最大值
#defineMAX_ERTEX_NUM20//最大顶点数
typedefenum{DG,DN,UDG,UDN}GraphKind;
//{有向图,有向网,无向网,无向图}
typedefstructArcCell{
VRTypeadj;
//VRType是顶点关系的类型。
对无权图,用1和0表示相邻否;
对//带权图则为权值类型
InfoType*info;
//该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
Typedefstruct{
VertexTypevexs[MAX_VERTEX_NUM];
//顶点向量
AdjMatrixarcs;
//邻接矩阵
intvexnum,arcnum;
//图的当前顶点数和弧数
GraphKindkind;
//图的种类标志
}Mgraph;
2.2函数设计
本系统所使用的函数见表2.2.1
表2.2.1本系统所使用的函数
函数名称
函数原型
功能描述
main()
intmain(void)
系统调用主函数
Huiru()
VoidHuitu()
绘制无向图
GraphicVer()
voidGraphicVer(Graph*G)
输出邻接矩阵
prim()
voidprim(Graph*G)
PRIM算法演示
本系统所调用函数调用的关系见图2.2.2
图2.2.2本系统的函数调用关系
2.2关键流程
流程图能直观和系统地把主函数的各个执行步骤和调用的子函数以及调用先后表示出来,子函数中也有调用其他子函数的情况,画出子函数的流程图能清楚地看出子函数中各步语句的执行,下面是关于主函数流程和关键的子函数流程图的直观表示。
2.2.1系统流程
图2.2.1系统流程
2.2.2PRIM函数流程
表2.2.2PRIM函数流程
2.2.3Huitu函数流程
表2.2.3Huitu函数流程
2.2.4GraphicVer函数输出邻接矩阵
图2.2.4GraphicVer函数输出邻接矩阵
3调试分析
3.1调试初期
由于编写的程序具有模块化的特性,且VC6.0的调试显然由于TC及个人对VC的熟练程度远优于TC等方面,我选择先在VC6.0环境下完成除图形化演示算法过程函数的其他过程。
由于数据结构选择的较合理,且对PRIM算法理解的较为深刻,所以在此环境下的调试并没有太多困难,只是简单的笔误。
添加了画图函数后,我就不得不使用TC编程环境。
本人使用的是vista系统,刚运行TC就发现提示:
该操作系统不支持16bitMS-DOS系统。
上网查看帮助,安装了DOSBOX软件虚拟出DOS系统运行,才开始之后的调试。
3.2调试中期
由于TurboC2.0不支持鼠标,更没有剪切、粘贴等常用快捷的操作,且本人对计算机图形学、TC的图形函数了解甚少,本人电脑更是不兼容TC全屏模式,所以这段时期成为最让本人备受煎熬的时期。
首先,由于TC操作复杂,更因为本人变成习惯不好,导致经常一运行就死机还没保存过的代码就又“恢复出厂化”,让所见之人无不扼腕惋惜,本人亦是痛心疾首,苦不堪言。
编译过程出现过的错误有把自定义函数的名字与TC图形化函数其中一个的关键字相同,TC显示“该函数定义了多重特性”或“该函数数值过多”等类似提示的错误
图3.2.1初始化错误
将自定义的initgraph函数重新命名为voidhuitu(),即可排除此错误。
再次编译,又发现指针错误:
图3.2.2指针错误
Outtextxy(intx,inty,*p),即要求最后一项为指向一字符串的指针。
数组就是指针,如果这里出错,那只应该是我定义的lowcose[]存储的数不是字符串。
所以我曾试图用strcpy()将数组内数据一一进行传拷贝到一指针,然后再调用outtextxy()。
但是结果依然错误!
后来,在同学的帮助下,我终于弄明白是因为我数组内存储的是整数型数据,必然无法通过strcpy()转换成指针。
后来,我改用vsprintf(tmp,"
%d"
&
lowcost[vex-i]),即现将整型转化为字符串,此错误即可排除。
3.3调试后期
图3.3连接错误
这是经过多次修改后,最后一个编译错误。
该名定义是你所使用的视频显示模式,影响的是图形化后的屏幕像素及可支持的最大色彩。
经试验,此程序在另一台XP电脑上可编译成功,故本人认为是由于VISTA的兼容性导致TC无法调用该定义,即使使用虚拟机也无法排除。
考虑到此语句对输出结果影响不大,故将此语句删除,即使得TC自动获取其他可用的视频模式。
编译成功!
4测试及运行结果
4.1欢迎界面
运行程序,首先进入用户的欢迎界面。
模拟界面向导IRIS采用互动式的方法提示用户进入PRIM算法演示界面。
首先IRIS会先询问用户是否愿意看PRIM算法演示,若此时用户选择“y”,用户即可顺利进入模拟PRIM的程序(见图4.1.1);
图4.1.1用户欢迎界面及正常进入算法演示界面
否则,向导友情提示可以直接退出程序,其效果图见图4.1.2。
图4.1.2用户选择退出算法演示的界面
4.2获取输入,绘制无向图
创建无向图,动态显示在屏幕上,并输出其存储结构,即无向网的邻接矩阵。
首先按照提示,收入先要创建顶点的坐标及其名。
其效果图见图4.2.1
图4.2.2动态建立无向图
输入时需要注意的是,由于该程序时默认添加一点则连接相应的直线,所以在一点多线的时候,像例子中的A点,就要重新返回A后再连接其他点。
具体操作见图4.2.3。
图4.2.3建立一点多线时的具体操作方法
图4.2.4创建无线图的最终效果图
4.3输出邻接矩阵
向导可以自动进入输出邻接矩阵的界面
图4.3.1邻接矩阵的开始界面
由于“∞”无法被TC识别,故该位置改用可以识别的其他特殊符号“@-@”。
图4.3.2输入边信息
图4.3.3邻接矩阵的输出
4..4.演示PRIM算法生成最小生成树
向导先输出对该算法的介绍,然后提示用户开始算法的演示。
图4.4.1PRIM算法的介绍
用户确认后开始算法的每个步骤。
其生成过程见图
图4.4.2第一次查找后lowcost和closest数组值的变化
图4.4.3第二次查找后lowcost和closest数组值的变化
图4.4.3第三次查找后lowcost和closest数组值的变化
图4.4.4相关算法
4.5用户退出
演示完成后,向导可提示自动退出。
图4.5退出界面
参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:
清华大学出版社,2006
[2]吕国英.算法设计与分析[M].北京:
[3]李兰友.TurboC实用图形程序设计[M].北京.科技翻译出版公司,1994
[4]侯风巍.数据结构要点精析—C语言版[M].北京:
北京航空航天大学出版社,2007
[5]亦欧.TURBOC++运行库函数源程序与参考大全[M].北京.学院出版社,1993
[6]谢明与.BorlandC++/TurboC++编程实例剖析[M].北京.科学出版社.1993
[7]卫宁.TurboC++forDOS入门.[M].北京.学院出版社,1994
附录(关键部分程序清单)
#include<
graphics.h>
#include<
stdio.h>
string.h>
stdlib.h>
conio.h>
#defineMaxVertexNum50
#defineINF32767
typedefstructGraphic
{
charvexs[MaxVertexNum];
intedges[MaxVertexNum][MaxVertexNum];
intv,e;
}Graph;
chartmp[10];
voidHuitu()/*无向图的图形生成*/
charbuffer[100];
intgraphdriver=DETECT,graphmode;
inti,xbefore,ybefore;
intx1,y1;
charc;
/*registerbgidriver(EGAVGA_driver);
*//*使用EGA\VGA显卡模式,分辨率为640*480*/
initgraph(&
graphdriver,&
graphmode,"
"
);
/*图形初始化*/
cleardevice();
/*清屏*/
printf("
inputpot(300<
x<
610,y<
400):
\ninput0tohalt!
\n"
setfillstyle(1,WHITE);
setcolor(WHITE);
scanf("
%d,%d,%s"
xbefore,&
ybefore,buffer);
circle(xbefore,ybefore,15);
floodfill(xbefore,ybefore,WHITE);
setcolor(BLUE);
outtextxy(xbefore,ybefore,buffer);
moveto(xbefore,ybefore);
while
(1)
{
scanf("
x1,&
y1,buffer);
if(x1==0)break;
circle(x1,y1,15);
floodfill(x1,y1,WHITE);
setcolor(BLUE);
outtextxy(x1,y1,buffer);
setcolor(WHITE);
line(xbefore,ybefore,x1,y1);
xbefore=x1;
ybefore=y1;
}
system("
pause"
}
voidGraphicVer(Graph*G)/*buildandoutputtheadjMatrix*/
inti,j,k,weight;
intv1,v2;
inputvertex'
sandedges'
snumber:
%d,%d"
G->
v,&
e);
for(i=1;
i<
=G->
v;
i++)
for(j=1;
j<
j++)
if(i==j)
G->
edges[i][j]=0;
else
{G->
edges[i][j]=INF;
}/*初始化矩阵,全部元素设为无穷大*/
for(k=1;
k<
e;
k++)
{printf("
input%dthedge:
k);
%d,%d,%d"
v1,&
v2,&
weight);
edges[v1][v2]=G->
edges[v2][v1]=weight;
printf((G->
edges[i][j]==INF)?
∞\t"
:
%d\t"
G->
edges[i][j]);
/*************************************prim算法生成最小生成树**********************************************************/
intlowcost[MaxVertexNum],closest[MaxVertexNum];
inti,j,k,min;
for(i=2;
i++)/*n个顶点,n-1条边*/
lowcost[i]=G->
edges[1][i];
/*初始化*/
closest[i]=1;
/*顶点未加入到最小生成树中*/
lowcost[1]=0;
/*标志顶点1加入U集合*/
i++)/*形成n-1条边的生成树*/
min=INF;
k=0;
for(j=2;
j++)/*寻找满足边的一个顶点在U,另一个顶点在V的最小边*/
if((lowcost[j]<
min)&
&
(lowcost[j]!
=0))
{
min=lowcost[j];
k=j;
}
(%d,%d)%2d\t"
closest[k],k,min);
/*输出最小生成树的边及对应的权值*/
lowcost[k]=0;
/*顶点k加入U*/
j++)/*修改由顶点k到其他顶点边的权值*/
if(G->
edges[k][j]<
lowcost[j])
lowcost[j]=G->
edges[k][j];
closest[j]=k;
voiddrawwapicture(intlowcost[],intclosest[],intvex)
{inti=0,x=0,datax=0;
setviewport(150,140,630,310,1);
setcolor(GREEN);
rectangle(10,10,470,160);
line(10,60,470,60);
line(10,110,470,110);
for(i=0;
vex;
x=470-40*i;
datax=470-20*i;
line(x,10,x,160);
if((vex-i)!
=0)
{outtextxy(datax,35,"
(vex-i)\0"
vsprintf(tmp,"
lowcost[vex-i]);
outtextxy(datax,85,tmp);
closest[vex-i]);
outtextxy(datax,135,tmp);
i\0"
outtextxy(datax,85,"
lowcost\0"
outtextxy(datax,135,"
closest\0"
getche();
closegraph();
voidprimyanshi(Graph*G)
{voiddrawwapicture(int*p,int*q,intk);
drawwapicture(lowcost,closest,G->
v);
cprintf("
intmain()
Graph*G=NULL;
intflag=1;
/*******************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 撰写 要求