数据结构课程设计图的实现文档格式.docx
《数据结构课程设计图的实现文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计图的实现文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
do
***************无向图的基本操作及应用***************\n"
1创建无向图的邻接矩阵
2创建无向图的邻接表
3无向图的深度优先遍历
4无向图的广度优先遍历
*************************************************\n"
cin>
>
n;
switch(n){
case1:
CreatUDG_M(MG);
break;
case2:
CreatUDG_ALG(ALG);
dispgraph(ALG);
case3:
dfstraverse(ALG);
case4:
BFSTraver(MG);
default:
if(n!
=5)
错误,重新输入\n"
}while(n!
=5);
voidUDN()
MGraphMG;
do{
***************无向网的基本操作及应用***************\n"
1创建无向网的邻接矩阵
2创建无向网的邻接表
3prim算法求最小生成树
4kraskal算法求最小生成树
****************************************************\n"
CreateUDN_M(MG);
CreateUDN(ALG);
dispUDN(&
ALG);
prim(MG);
Kruskal(MG);
voidDG()
***************有向图的基本操作及应用***************\n"
cout<
1创建有向图的邻接矩阵
2创建有向图的邻接表
3拓扑排序
4退出
CreatDG_M(MG);
CreatDG_ALG(ALG);
CreatDG_ALG(ALG);
TopologicalSort(ALG);
=4)
=4);
voidDN()
PathMatrixp1;
ShortPathTabled1;
dist2d;
path2p;
***************有向网的基本操作及应用***************\n"
1创建有向网的邻接矩阵
2创建有向网的邻接表
3关键路径
4单源顶点最短路径问题
5每对顶点最短路径问题
6退出
CreateDNG_M(MG);
CreateDN(ALG);
dispDN(&
CreateDN(ALG);
CriticalPath(ALG);
ShortestPath(MG,1,p1,d1);
case5:
Floyd(MG,p,d);
=6)
=6);
voidmain()
ShowMainMenu();
UDG();
UDN();
DG();
DN();
//Graph.h(图的定义)
#defineMAXVEX30
#defineMAXCOST1000
typedefintInfoType;
typedefstruct{
VertexTypevexs[MAXVEX];
intarcs[MAXVEX][MAXVEX];
intvexnum,arcnum;
}MGraph;
typedefstructarcnode{
intadjvex;
//邻接点序号
intw;
//边或狐上的权
InfoType*info;
structarcnode*next;
}ArcNode;
typedefstructvnode{
VertexTypedata;
//顶点信息
intindegree;
ArcNode*firstarc;
//指向下一个边结点
}Vnode,AdjList[MAXVEX];
AdjListvertices;
intvexnum,arcnum;
}ALGraph;
//UDGraph.h(无向图的基本操作及应用)
voidCreatUDG_M(MGraph&
G)
inti,j,c;
请输入顶点数,边数:
G.vexnum;
G.arcnum;
请输入结点信息,如“123..."
endl;
for(i=1;
i<
=G.vexnum;
i++)
{
G.vexs[i];
for(j=1;
j<
j++)
G.arcs[i][j]=0;
for(c=1;
c<
=G.arcnum;
c++)
{printf("
第%d条边=>
起点序号,终点序号:
c);
i>
j;
G.arcs[i][j]=1;
G.arcs[j][i]=1;
创建的邻接矩阵为:
for(inti=1;
{for(intj=1;
G.arcs[i][j]<
"
邻接矩阵创建完毕"
/////////////////////////////////////////////////////////////////////////
voidCreatUDG_ALG(ALGraph&
inti,s,d;
ArcNode*p,*q;
请输入顶点数,边数:
for(i=1;
cin>
G.vertices[i].data;
G.vertices[i].firstarc=NULL;
{
printf("
i);
s>
d;
p=(ArcNode*)malloc(sizeof(ArcNode));
q=(ArcNode*)malloc(sizeof(ArcNode));
p->
adjvex=d;
q->
adjvex=s;
p->
next=G.vertices[s].firstarc;
//p插入顶点s的邻接表中
G.vertices[s].firstarc=p;
q->
next=G.vertices[d].firstarc;
//q插入顶点d的邻接表中
G.vertices[d].firstarc=q;
}
voiddispgraph(ALGraphG)
inti;
ArcNode*p;
图的邻接表表示如下:
);
printf("
[%d,%c]=>
i,G.vertices[i].data);
p=G.vertices[i].firstarc;
while(p!
=NULL)
[%d→]"
p->
adjvex);
p=p->
next;
∧\n"
////////////////////////////////////////////////////////////////////////
intvisit[20];
voiddfs(ALGraphG,intv)//从顶点v出发深度优先搜索
{visit[v]=1;
G.vertices[v].data;
ArcNode*p;
p=G.vertices[v].firstarc;
while(p){
if(visit[p->
adjvex]!
=1)
dfs(G,p->
}//while
voiddfstraverse(ALGraphG)//对一个图进行深度优先搜索
{
intv;
for(v=1;
v<
v++)
if(!
visit[v])
dfs(G,1);
///////////////////////////////////////////////////////////////////////
CirQueue.h"
intFirstAdjVex(MGraphG,intvex)
intw,i;
if(G.arcs[vex][i]==1&
&
visit[i]==0)
{w=i;
elsew=0;
returnw;
//获取下一个未被访问的邻接节点
intNextAdjVex(MGraphG,intvex,intw)
for(i=w;
i++)//从w开始
voidBFSTraver(MGraphG)
Queueq;
InitQueue(&
q);
inti,w,u;
visit[i]=0;
i++)//确保所有的节点被访问到的一个循环
if(visit[i]==0)
visit[i]=1;
EnQueue(&
q,i);
while(!
QueueEmpty(&
q))//当队列非空时一直做
DeQueue(&
q,u);
//取出队列头元素并置为u
w=FirstAdjVex(G,u);
while(w>
0)
if(visit[w]==0)
visit[w]=1;
q,w);
w=NextAdjVex(G,u,w);
//UNGraph.h(无向网的基本操作及应用)
voidCreateUDN_M(MGraph&
{inti,j,k,n;
请输入顶点数和边数"
输入顶点"
G.arcs[i][j]=999;
输入边的起点到终点的序号及权值"
for(k=1;
k<
k++)
j>
G.arcs[i][j]=n;
G.arcs[j][i]=G.arcs[i][j];
//建立无向网的邻接矩阵存储结构
///////////////////////////////////////////////////////
voidCreateUDN(ALGraph&
G)
//邻接表建立无向网
int
i,s,d,w1;
ArcNode*p,*q;
输入节点数和边数"
G.vexnum>
输入顶点,如“123...”"
i++)
//输入顶点
//首先初始化为NULL
}
d>
w1;
//输入一条边依附的起点序号和终点序号
p=(ArcNode*)malloc(sizeof(ArcNode));
q=(ArcNode*)malloc(sizeof(ArcNode));
info=(InfoType*)malloc(sizeof(InfoType));
adjvex=d;
//保存该弧所指向的顶点位置
adjvex=s;
*(p->
info)=w1;
//保存权值到一个结点里
*(q->
//保存权值到一个结点里
voiddispUDN(ALGraph*G)
/*打印无向网每个结点的单链表*/
inti,j;
[起点权值终点]"
for(i=1;
i<
=G->
vexnum;
i++)
while(G->
vertices[i].firstarc->
next)
["
G->
vertices[i].data<
j=G->
adjvex;
*(G->
info)<
vertices[j].data<
]"
G->
vertices[i].firstarc=G->
}
vertic