长江大学数据结构程序设计报告.docx
- 文档编号:5769509
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:53
- 大小:569.21KB
长江大学数据结构程序设计报告.docx
《长江大学数据结构程序设计报告.docx》由会员分享,可在线阅读,更多相关《长江大学数据结构程序设计报告.docx(53页珍藏版)》请在冰豆网上搜索。
长江大学数据结构程序设计报告
算法与数据结构课程设计报告
系(院):
计算机科学学院
专业班级:
计科11101
姓名:
袁斌
学号:
201103258
指导教师:
周云才
设计时间:
2013.6.17-2012.6.29
五、测试
一.设计目的
1.能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2.提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3.初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5.培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
二、设计任务:
设计一个基于DOS菜单的应用程序。
要利用多级菜单实现各种功能。
内容如下:
1.无向图的基本操作及应用
1创建无向图的邻接矩阵
2创建无向图的邻接表
3无向图的深度优先遍历
4无向图的广度优先遍历
2.无向网的基本操作及应用
1创建无向网的邻接矩阵
2创建无向网的邻接表
3求最小生成树
3.有向图的基本操作及应用
1创建有向图的邻接矩阵
2创建有向图的邻接表
3拓扑排序
4.有向网的基本操作及应用
1创建有向网的邻接矩阵
2创建有向网的邻接表
3关键路径
4单源最短路径
5每对顶点之间的最短路径
三、设计方案
DOS界面的主菜单
voidShowMainMenu()
{
cout<<"\n";
cout<<"*****************图的基本操作及应用****************\n";
cout<<"*1无向图的基本操作及应用*\n";
cout<<"*2无向网的基本操作及应用*\n";
cout<<"*3有向图的基本操作及应用*\n";
cout<<"*4有向网的基本操作及应用*\n";
cout<<"*5退出*\n";
cout<<"***************************************************\n";
}
voidUDG1()
{
do
{
cout<<"\n";
cout<<"****************无向图的基本操作及应用*************\n";
cout<<"*1创建无向图的邻接矩阵*\n";
cout<<"*2创建无向图的邻接表*\n";
cout<<"*3无向图的深度优先遍历*\n";
cout<<"*4无向图的广度优先遍历*\n";
cout<<"*5退出*\n";
cout<<"***************************************************\n";
cin>>n;
switch(n)
{
case1:
创建无向图的邻接矩阵
break;
case2:
创建无向图的邻接表
break;
case3:
无向图的深度优先遍历
break;
case4:
无向图的广度优先遍历
break;
default:
if(n!
=5)
cout<<"错误,重新输入\n";
}
}while(n!
=5);
}
voidUDN1()
{
do{
cout<<"\n";
cout<<"***************无向网的基本操作及应用**************\n";
cout<<"*1创建无向网的邻接矩阵*\n";
cout<<"*2创建无向网的邻接表*\n";
cout<<"*3最小生成树*\n";
cout<<"*4退出*\n";
cout<<"***************************************************\n";
cin>>n;
switch(n)
{
case1:
创建无向网的邻接矩阵
break;
case2:
创建无向网的邻接表
break;
case3:
最小生成树
break;
default:
if(n!
=4)
cout<<"错误,重新输入\n";
}
}while(n!
=4);
}
voidDG1()
{
do
{
cout<<"\n";
cout<<"***************有向图的基本操作及应用**************\n";
cout<<"*1创建有向图的邻接表*\n";
cout<<"*2创建有向图的邻接矩阵*\n";
cout<<"*3拓扑排序*\n";
cout<<"*4退出*\n";
cout<<"***************************************************\n";
cin>>n;
switch(n)
{
case1:
创建有向图的邻接表
break;
case2:
创建有向图的邻接矩阵
break;
case3:
拓扑排序
break;
default:
if(n!
=4)
cout<<"错误,重新输入\n";
}
}while(n!
=4);
}
voidDN1()
{
do
{
cout<<"\n";
cout<<"***************有向网的基本操作及应用**************\n";
cout<<"*1创建有向网的邻接矩阵*\n";
cout<<"*2创建有向网的邻接表*\n";
cout<<"*3关键路径*\n";
cout<<"*4单源最短路径*\n";
cout<<"*5每对顶点间的最短路径*\n";
cout<<"*6退出*\n";
cout<<"***************************************************\n";
cin>>n;
switch(n)
{
case1:
创建有向网的邻接矩阵
break;
case2:
创建有向网的邻接表
break;
case3:
关键路径
break;
case4:
单源最短路径
break;
case5:
每对顶点间的最短路径
print1(MK);
break;
default:
if(n!
=6)
cout<<"错误,重新输入\n";
}
}while(n!
=6);
}
voidmain()
{
intn;
do
{
ShowMainMenu();
cin>>n;
switch(n)
{
case1:
UDG1();
break;
case2:
UDN1();
break;
case3:
DG1();
break;
case4:
DN1();
break;
default:
if(n!
=5)
cout<<"错误,重新输入";
}
}while(n!
=5);
}
四、实现代码:
#include
#include
#include
#include
#include
usingnamespacestd;
#defineMAX_VERTEX_NUM100//最大顶点个数
#defineINFINITY10000//最大值
#defineFALSE0
#defineTRUE1
typedefintVRType;//顶点关系(表示是否相邻)
typedefcharVertexType;
typedefintInfoType;//弧相关信息
typedefenum{DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向图,无向网}
typedefstructArcCell
{
VRTypeadj;//权值
InfoType*info;//该弧相关信息的指针
}ArcCell,AdjMartix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct
{
VertexTypevexs[MAX_VERTEX_NUM];//顶点向量
AdjMartixarcs;//邻接矩阵
intvexnum,arcnum;//图当前顶点数,弧数
GraphKindKind;//图的类型
}MGraph;
intLocateVex(MGraphG,VertexTypev)//若图中存在v,返回v在图中的位置
{
for(inti=0;i { if(v==G.vexs[i]) returni; } return-2; } //***********************创建无向网的邻接矩阵********************** intCreatMUDN(MGraph&G)//构造无向网 { inti,j,w; charch; VertexTypev1,v2; cout<<"输入顶点数,弧数: "< cin>>G.vexnum>>G.arcnum;//输入当前顶点数弧数是否有弧信息 cout<<"输入顶点(字符型): "< for(i=0;i { for(j=0;j { G.arcs[i][j].adj=INFINITY; G.arcs[i][j].info=NULL; } } for(i=0;i { cout<<"输入第"< "; cin>>ch; G.vexs[i]=ch; } for(intk=0;k { cout<<"输入第"< "< cin>>v1>>v2; cout<<"输入弧的权值: "< cin>>w; if((i=LocateVex(G,v1))! =-2)// if((j=LocateVex(G,v2))! =-2) { G.arcs[i][j].adj=w;//对弧写入权值 G.arcs[j][i].adj=w;//对称弧赋值 } } return1; } //***********************创建无向图的邻接矩阵********************** voidCreatUDG(MGraph&G) { inti,j,k; charch; VertexTypev1,v2; cout<<"输入顶点数,弧数: "< cin>>G.vexnum>>G.arcnum; cout<<"输入顶点(字符型): "< for(i=0;i { for(j=0;j { G.arcs[i][j].adj=0; G.arcs[i][j].info=NULL; } } for(i=0;i { cout<<"输入第"< "; cin>>ch; G.vexs[i]=ch; } for(k=0;k { cout<<"输入第"< "< cin>>v1>>v2; if((i=LocateVex(G,v1))! =-2)// if((j=LocateVex(G,v2))! =-2) { G.arcs[i][j].adj=1;//对弧写入权值 G.arcs[j][i].adj=1;//对称弧赋值 } } } //***********************显示邻接矩阵的信息********************** voidScanAll(MGraphG) { inti; cout<<"图中顶点信息如下: "< for(i=0;i cout< cout<<"邻接矩阵如下: "< cout< "; for(i=0;i cout< cout< for(i=0;i { cout< for(intj=0;j cout< cout< } } typedefstructArcNode{ intadjvex;//该弧指向顶点的位置 structArcNode*nextarc;//指向下一条弧的指针 InfoType*info;//该弧相关信息的指针 }ArcNode; typedefstructVNode { VertexTypedata;//顶点信息 ArcNode*firstarc;//指向第一条依附该顶点弧的指针 }VNode,AdjList[MAX_VERTEX_NUM]; typedefstruct { AdjListvertices; intvexnum,arcnum; intkind; }ALGraph; //************************创建无向图的邻接表************************** voidCreatALGUDG(ALGraph&G) { inti,s,d; ArcNode*p,*q; cout<<"输入图的顶点数和边数: "; cin>>G.vexnum>>G.arcnum; for(i=1;i<=G.vexnum;i++) { cout<<"\n输入第"< "; cin>>G.vertices[i].data; G.vertices[i].firstarc=NULL; } for(i=1;i<=G.arcnum;i++) { cout<<"\n输入第"< "; cin>>s>>d; p=newArcNode; p->adjvex=d; p->nextarc=G.vertices[s].firstarc; G.vertices[s].firstarc=p;//将新建的以d为信息的表结点p插入s单链表的头结点后 q=newArcNode; q->adjvex=s; q->nextarc=G.vertices[d].firstarc; G.vertices[d].firstarc=q; } G.kind=UDG; } //***********************输出邻接表********************** voidPrintALGUDG(ALGraphG) { ArcNode*p; inti; for(i=1;i<=G.vexnum;i++) { p=G.vertices[i].firstarc; cout< while(p! =NULL) { cout<<"<"< p=p->nextarc; } printf("\n"); } } //****************************无向图的深度遍历****************************** intvisited[MAX_VERTEX_NUM]; voidDFS(ALGraphG,intv) { ArcNode*p; cout< visited[v]=1; p=G.vertices[v].firstarc; while(p! =NULL) { if(visited[p->adjvex]==0) DFS(G,p->adjvex); p=p->nextarc; } } voidDFSTraverse(ALGraphG) { intv; for(v=1;v<=G.vexnum;v++) visited[v]=0; for(v=1;v<=G.vexnum;v++) if(visited[v]==0) DFS(G,v); } //****************************无向图的广度遍历****************************** intFirstAdjvex(ALGraphG,intv) { ArcNode*p; if(p=G.vertices[v].firstarc) returnp->adjvex; return0; } intNextAdjVex(ALGraphG,intv,intw) { ArcNode*p; p=G.vertices[v].firstarc; while(p->adjvex! =w) p=p->nextarc; if(p->nextarc) returnp->nextarc->adjvex; else return0; } typedefstructQnode { intdata; structQnode*next; }Qnode; typedefstruct { Qnode*front; Qnode*rear; }Linkqueue; intInitqueue(Linkqueue*Q) { Q->front=(Qnode*)malloc(sizeof(Qnode)); Q->rear=Q->front; if(! Q->front) return0; Q->front->next=NULL; return1; } intEnqueue(Linkqueue*Q,int*e) { Qnode*p; p=(Qnode*)malloc(sizeof(Qnode)); if(! p) return0; p->data=*e; p->next=NULL; Q->rear->next=p; Q->rear=p; return1; } voidDequeue(Linkqueue*Q,int*e) { Qnode*p; if(Q->front==Q->rear) cout<<"空"< p=Q->front->next; *e=p->data; Q->front->next=p->next; if(Q->rear==p) Q->rear=Q->front; free(p); } voidBFSTraverse(ALGraphG) { intv,w,u; for(v=1;v<=G.vexnum;++v) visited[v]=0; LinkqueueQ; Initqueue(&Q); for(v=1;v<=G.vexnum;v++) if(! visited[v]) { visited[v]=1;cout< Enqueue(&Q,&v); while(Q.front! =Q.rear) { Dequeue(&Q,&u); for(w=FirstAdjvex(G,u);w>=1;w=NextAdjVex(G,u,w)) if(! visited[w]) { visited[w]=1; cout< Enqueue(&Q,&w); } } } } //*********************************最小生成树*************************** voidMiniSpanTree(MGraphG,VertexTypeu) { intk; intj,i; intcount=0,min; struct { VertexTypeadjvex; intlowcost; }closedge[MAX_VERTEX_NUM]; k=LocateVex(G,u); for(j=0;j if(j! =k) { closedge[j].adjvex=u; closedge[j].lowcost=G.arcs[k][j].adj; }; closedge[k].lowcost=0; count=1; cout<<"最小生成树的各个边信息如下: "< while(count! =G.vexnum) { min=1000; for(i=0;i { if(closedge[i].lowcost==INFINITY||c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 长江大学 数据结构 程序设计 报告