图的遍历数据结构实验研究报告.docx
- 文档编号:29378280
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:20
- 大小:40.63KB
图的遍历数据结构实验研究报告.docx
《图的遍历数据结构实验研究报告.docx》由会员分享,可在线阅读,更多相关《图的遍历数据结构实验研究报告.docx(20页珍藏版)》请在冰豆网上搜索。
图的遍历数据结构实验研究报告
南昌航空大学实验报告
课程名称:
数据结构实验名称:
实验八图地遍历
班级:
学生姓名:
学号:
指导教师评定:
签名:
题目:
假设无向图采用邻接表结构表示.编程分别实现图地深度优先搜索算法和广度优先搜索算法.
一、需求分析
1.用户可以根据自己地需求分别输入任意地一个有向图(可以是非连通图也可以是连通图).
2.通过用广度优先遍历和深度优先遍历已有地图,并输出.
3.并且以邻接表地形式输出该已有地图.
4.程序执行地命令包括:
(1)输入图地结点和弧构造图
(2)输出图
(2)广度优先遍历图(3)深度优先遍历图
二、概要设计
⒈为实现上述算法,需要链表地抽象数据类型:
ADTGraph{
数据对象V:
V是具有相同特征地数据元素地集合,称为顶点集.
数据关系R:
R={VR}
VR={
基本操作P:
Creatgraph(&G,V,VR)
初始条件:
V是图地顶点集,VR是图中弧地集合.
操作结果:
按V和VR地定义构造图G.
destroygraph(&G)
初始条件:
图G存在.
操作结果:
销毁图G.
displaygraph(G)
初始条件:
图G存在.
操作结果:
显示图G.
locatevex(G,u)
初始条件:
图G存在,u和G中地顶点有相同地特征.
操作结果:
若G中存在顶点u,则返回该顶点在图中位置,否则返回其他信息.
getvex(G,v)
初始条件:
图G存在,v是G中地某个顶点.
操作结果:
返回v地值.
DFStraverse(G)
初始条件:
图G存在.
操作结果:
对图进行深度优先遍历.在遍历过程中对每个顶点访问一次.
BFStraverse(&S,e)
初始条件:
图G存在.
操作结果:
对图进行广度优先遍历.在遍历过程中对每个顶点访问一次.
}ADTGraph
2.本程序有三个模块:
⑴主程序模块
main(){
初始化;
{
接受命令;
显示结果;
}
}
⑵创建图地模块:
主要建立一个图;
⑶广度优先遍历和深度优先遍历模块:
输出这两种遍历地结果;
(4)输出图模块:
显示已创建地图.
三、详细设计
⒈元素类型,结点类型
structarcnode
{intadjvex;/*该弧所指向地顶点地位置*/
intinfo;
structarcnode*nextarc;/*指向下一条弧地指针*/
};
structvexnode
{intdata;/*顶点地信息*/
structarcnode*firstarc;/*指向第一条依附该顶点地弧地指针*/
};
structgraph
{structvexnode*vexpex;
intvexnum,arcnum;/*图地当前地顶点数和弧数*/
};
/*定义队列*/
structqueue
{
int*elem;
intfront;
intrear;
};
/*全局变量*/
intn;/*图地顶点数*/
intvisit[100];/*标志数组*/
structqueueQ;
2.对抽象数据类型中地部分基本操作地伪码算法如下:
/*创建一个空队列*/
structqueueinitqueue()
{structqueueq;
q.elem=(int*)malloc(maxsize*sizeof(int));
if(!
q.elem)exit(0);
q.front=q.rear=0;
returnq;
}
/*入队列*/
structqueueenqueue(structqueueq,intv)
{if((q.rear+1)%maxsize==q.front)
printf("thequeueisfull!
!
!
\n");
else
{q.elem[q.rear]=v;
q.rear=(q.rear+1)%maxsize;
}
returnq;
}
/*出队列*/
intdequeue(structqueueq)
{intcur;
if(q.rear==q.front)
{printf("thequeueisnull!
!
\n");
exit(0);
}
else
{cur=q.elem[q.front];
q.front=(q.front+1)%maxsize;
returncur;
}
}
/*判断队列是否为空*/
intemptyqueue(structqueueq)
{if(q.front==q.rear)
return1;
else
return0;
}
/*创建有向图*/
structgraphcreatgraph()
{inte,i,s,d;
inta;
structgraphg;
structarcnode*p;
printf("thenumberofvex(n)andarc(e):
");
scanf("%d%d",&n,&e);
g.vexnum=n;
g.arcnum=e;
for(i=0;i {printf("di%dvex'sinformation: ",i); scanf("%d",&a); g.vexpex[i].data=a; g.vexpex[i].firstarc=NULL; } for(i=0;i {printf("di%darc'sstart,end: ",i+1); scanf("%d%d",&s,&d); p=(structarcnode*)malloc(sizeof(structarcnode));p1Ean。 p->adjvex=d; p->info=g.vexpex[d].data; p->nextarc=g.vexpex[s].firstarc; g.vexpex[s].firstarc=p; } returng; } /*显示有向图*/ voiddisplaygraph(structgraphg,intn) {inti; structarcnode*p; printf("diaplaythegraph;\n"); for(i=0;i {printf("[%d,%d]->",i,g.vexpex[i].data); p=g.vexpex[i].firstarc; while(p! =NULL) {printf("(%d,%d)->",p->adjvex,p->info); p=p->nextarc; } printf("^\n"); } } /*连通图广度优先遍历*/ voidBFSsearch(structgraphg,intv) {inti; structarcnode*p; Q=initqueue(); printf("%5d",g.vexpex[v].data); enqueue(Q,v);visit[v]=TURE; while(! emptyqueue(Q)) {i=dequeue(Q); p=g.vexpex[i].firstarc; while(p! =NULL) {enqueue(Q,p->adjvex); if(visit[p->adjvex]==FALSE) { printf("%5d",p->info); visit[p->adjvex]=TURE; } p=p->nextarc; } } } /*非连通图广度优先遍历*/ voidBFS(structgraphg) {inti; for(i=0;i visit[i]=FALSE; for(i=0;i if(visit[i]==FALSE) BFSsearch(g,i); printf("\n\n"); } /*连通图深度优先遍历*/ voidDFSsearch(structgraphg,intv) {structarcnode*p; printf("%5d",g.vexpex[v].data);visit[v]=TURE; p=g.vexpex[v].firstarc; while(p! =NULL) {if(! visit[p->adjvex])DFSsearch(g,p->adjvex); p=p->nextarc; } } /*非连通图深度优先遍历*/ voidDFS(structgraphg) {inti; for(i=0;i for(i=0;i if(visit[i]==FALSE)DFSsearch(g,i); printf("\n\n"); } 3.主函数和其他函数地伪码算法 intmain(void) {structgraphg; inti; g=creatgraph(); displaygraph(g,n); printf("BFSresult: \n"); BFS(g); printf("DFSresult: \n"); DFS(g); getch(); return1; }4函数调用关系 main creatgraphdisplaygraphBFSDFS BFSsearchDFSsearch initqueuedequeueenqueue 四、调试分析 ⒈本来想将图地顶点元素地类型定义为字符型地,但是在运行地时候发现在输入顶点数和弧数后,总是会在有字符没有输入就直接运行下一个语句了,改变了很多地方法,最后只有将顶点地类型定义为才解决了上述地问题.DXDiT。 ⒉在写程序地时候,开始creatgraph函数地部分代码为 for(i=0;i {printf("di%dvex'sinformation: ",i); scanf("%d",&a); g.vexpex[i].data=a; g.vexpex[i].firstarc=NULL; } g.vexnum=n;g.arcnum=e; 总是会有这样地提示“可能在‘g’定义以前已经使用了在creatgraph函数中”,经过多次地调试,最后代码改为RTCrp。 g.vexnum=n;g.arcnum=e; for(i=0;i {printf("di%dvex'sinformation: ",i); scanf("%d",&a); g.vexpex[i].data=a; g.vexpex[i].firstarc=NULL; } 就解决了问题,但是我还是不清楚原因. 3.在编写BFSsearch函数地时候,用指针入队还是用下标值入队,由于对指针地掌握不够,最后选择了比较容易地用下标值作为队列地类型int.5PCzV。 4.算法地时空分析 各操作地算法时间复杂度比较合理 initqueue,emptyqueue,enqueue,dequeue,visit为O (1);creatgraph,displaygraph,BFSsearch,DFS,DFSsearch,BFS为O(n),jLBHr。 注: n为图地顶点数. 5.本次实验采用数据抽象地程序设计方法,将程序化为三层次结构,设计时思路清晰,使调试也较顺利,各模块有较好地可重用性.xHAQX。 五、用户手册 ⒈本程序地运行环境为windowsxp操作系统,并且在TC2.0中运行,执行文件为Exp8.c;LDAYt。 ⒉.在输入图地信息地时候,注意输入地顺序,这关系到顶点地位置,否则就会与你想要地图就不一样了.如你地图为18Zzz6Z。 2021 若你输入地顶点地顺序是20,1821,则它们对应地数值地下标为0,1,2.因此表示地弧(起点,终点)就应该为(0,2),(1,0),(2,1),但是弧输入地顺序没有要求.dvzfv。 3.进入演示程序后,完成编译,再点击超级工具集里地中文DOS环境运行选项,进入DOS环境中,用户根据需求键入相应地数据,可以看到相应地结果.rqyn1。 六、测试结果 若想创建图: 1718 10141920 1513 则因在dos界面输入如图所示: 所以在wintc中运行得到地结果如下图所示: 运行地结果是: 显示地邻接表为 [0,17]->(1,10) [1,10]->(3,15) [2,14]->(1,10)->(0,17) [3,15]->(4,13) [4,13]->(2,14) [5,18]->(7,20)->(6,19) [6,19] [7,20]->(6,19) 广度优先遍历地结果为17,10,14,15,13,18,19,20 深度优先遍历地结果为17,10,15,13,14,18,20,19 七、附录: 源程序 #include #include #defineNULL0 #defineFALSE0 #defineTURE1 #definemaxsize100 structarcnode {intadjvex;/*该弧所指向地顶点地位置*/ intinfo; structarcnode*nextarc;/*指向下一条弧地指针*/ }; structvexnode {intdata;/*顶点地信息*/ structarcnode*firstarc;/*指向第一条依附该顶点地弧地指针*/ }; structgraph {structvexnode*vexpex; intvexnum,arcnum;/*图地当前地顶点数和弧数*/ }; /*定义队列*/ structqueue { int*elem; intfront; intrear; }; intn;/*图地顶点数*/ intvisit[100];/*标志数组*/ structqueueQ; /*创建一个空队列*/ structqueueinitqueue() {structqueueq; q.elem=(int*)malloc(maxsize*sizeof(int)); if(! q.elem)exit(0); q.front=q.rear=0; returnq; } /*入队列*/ structqueueenqueue(structqueueq,intv) {if((q.rear+1)%maxsize==q.front) printf("thequeueisfull! ! ! \n"); else {q.elem[q.rear]=v; q.rear=(q.rear+1)%maxsize; } returnq; } /*出队列*/ intdequeue(structqueueq) {intcur; if(q.rear==q.front) {printf("thequeueisnull! ! \n"); exit(0); } else {cur=q.elem[q.front]; q.front=(q.front+1)%maxsize; returncur; } } /*判断队列是否为空*/ intemptyqueue(structqueueq) {if(q.front==q.rear) return1; else return0; } /*创建有向图*/ structgraphcreatgraph() {inte,i,s,d; inta; structgraphg; structarcnode*p; printf("thenumberofvex(n)andarc(e): "); scanf("%d%d",&n,&e); g.vexnum=n; g.arcnum=e; for(i=0;i {printf("di%dvex'sinformation: ",i); scanf("%d",&a); g.vexpex[i].data=a; g.vexpex[i].firstarc=NULL; } for(i=0;i {printf("di%darc'sstart,end: ",i+1); scanf("%d%d",&s,&d); p=(structarcnode*)malloc(sizeof(structarcnode));Emxvx。 p->adjvex=d; p->info=g.vexpex[d].data; p->nextarc=g.vexpex[s].firstarc; g.vexpex[s].firstarc=p; } returng; } /*显示有向图*/ voiddisplaygraph(structgraphg,intn) {inti; structarcnode*p; printf("diaplaythegraph;\n"); for(i=0;i {printf("[%d,%d]->",i,g.vexpex[i].data); p=g.vexpex[i].firstarc; while(p! =NULL) {printf("(%d,%d)->",p->adjvex,p->info); p=p->nextarc; } printf("^\n"); } } /*连通图广度优先遍历*/ voidBFSsearch(structgraphg,intv) {inti; structarcnode*p; Q=initqueue(); printf("%5d",g.vexpex[v].data); enqueue(Q,v);visit[v]=TURE; while(! emptyqueue(Q)) {i=dequeue(Q); p=g.vexpex[i].firstarc; while(p! =NULL) {enqueue(Q,p->adjvex); if(visit[p->adjvex]==FALSE) { printf("%5d",p->info); visit[p->adjvex]=TURE; } p=p->nextarc; } } } /*非连通图广度优先遍历*/ voidBFS(structgraphg) {inti; for(i=0;i visit[i]=FALSE; for(i=0;i if(visit[i]==FALSE) BFSsearch(g,i); printf("\n\n"); } /*连通图深度优先遍历*/ voidDFSsearch(structgraphg,intv) {structarcnode*p; printf("%5d",g.vexpex[v].data);visit[v]=TURE; p=g.vexpex[v].firstarc; while(p! =NULL) {if(! visit[p->adjvex])DFSsearch(g,p->adjvex); p=p->nextarc; } } /*非连通图深度优先遍历*/ voidDFS(structgraphg) {inti; for(i=0;i visit[i]=FALSE; for(i=0;i if(visit[i]==FALSE) DFSsearch(g,i); printf("\n\n"); } /*主函数*/ intmain(void) {structgraphg; inti; g=creatgraph(); displaygraph(g,n); printf("BFSresult: \n"); BFS(g); printf("DFSresult: \n"); DFS(g); getch(); return1; } 版权申明 本文部分内容,包括文字、图片、以及设计等在网上搜集整理.版权为个人所有 Thisarticleincludessomeparts,includingtext,pictures,anddesign.Copyrightispersonalownership.SixE2。 用户可将本文地内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律地规定,不得侵犯本网站及相关权利人地合法权利.除此以外,将本文任何内容或服务用于其他用途时,须征得本人及相关权利人地书面许可,并支付报酬.6ewMy。 Usersmayusethecontentsorservicesofthisarticleforpersonalstudy,researchorappreciation,andothernon-commercialornon-profitpurposes,butatthesametime,theyshallabidebytheprovisionsofcopyrightlawandotherrelevantlaws,andshallnotinfringeuponthelegitimaterightsofthiswebsiteanditsrelevantobligees.Inaddition,whenanycontentorserviceofthisarticleisusedforotherpurposes,writtenpermissionandremunerationshallbeobtainedfromthepersonconcernedandtherelevanto
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遍历 数据结构 实验 研究 报告