大学程序实验.数据结构.图型结构的应用一.邻接矩阵一
- 2 下一章
0 目录
5 图型结构的应用
5.1 邻接矩阵一
5.1.1 题目
1、图的建立
从键盘输入数据建立图,并打印
实验要求:在程序中定义下述函数,并实现要求的函数功能:
CreateGraph(): 按从键盘输入数据建立图
PrintGrah():打印图
实验提示:
图的存储可采用邻接矩阵或邻接表;
打印出每一个顶点信息和邻接矩阵或邻接表
注意问题:
有向图,无向图,有向网,无向网任选一种。
2、深度优先遍历以及广度优先遍历
问题描述:从键盘输入数据建立图并打印深度优先遍历序列和广度优先遍历序列。
实验提示:
图的存储可采用邻接矩阵或邻接表;
有向图,无向图,有向网,无向网任选一种。
5、求一条从顶点 v 到顶点 s 的简单路径
实验提示:图的存储可采用邻接矩阵或邻接表;
5.1.2 源码
// MGraph.cpp : Defines the entry point for the console application.
//
typedef int Status;
typedef char VertexType[10];
typedef int EdgeType;
typedef int Boolean;
typedef int QElemType;
typedef struct
{
VertexType vexs[MAXVEX];
EdgeType arc[MAXVEX][MAXVEX];
int numVertexs,numEdges;
}MGraph;
//广度遍历用队列结构体
typedef struct
{
QElemType data[MAXSIZE];
int front;
int rear;
}Queue;
void CreateMGraph(MGraph *G)
{
int i,j,k,w;
printf("请输入顶点数和边数:\n");
scanf("%d%d",&G->numVertexs,&G->numEdges);
printf("\n");
for(i=0;i<G->numVertexs;i++)
{
printf("顶点%d:",i+1);
scanf("%s",G->vexs[i]);
}
for(i=0;i<G->numVertexs;i++)
{
for(j=0;j<G->numVertexs;j++)
{
G->arc[i][j]=0;//邻接矩阵初始化
}
}
printf("\n");
for(k=0;k<G->numEdges;k++)
{
printf("请输入第%d条边(vi,vj)上的下标i,下标j和权w:\n",k+1);
scanf("%d%d%d",&i,&j,&w);
G->arc[i-1][j-1]=w;
G->arc[j-1][i-1]=G->arc[i-1][j-1];//无向网
}
}
void PrintMGraph(MGraph G)
{
int i,j;
printf("图的顶点为:\n");
for(i=0;i<G.numVertexs;i++)
{
printf("顶点%d:%s\n",i+1,G.vexs[i]);
}
printf("\n");
printf("邻接矩阵为:\n");
for(i=0;i<G.numVertexs;i++)
{
for(j=0;j<G.numVertexs;j++)
{
printf(" %d",G.arc[i][j]);//打印图
}
printf("\n");
}
}
Boolean visited[MAXSIZE];
void DFS(MGraph G,int i)//深度优先
{
int j;
visited[i]=TRUE;
printf(" %s",G.vexs[i]);
for(i=0;i<G.numVertexs;i++)
{
if(G.arc[i][j]==1&&!visited[j])
{
DFS(G,j);
}
}
}
void DFSTraverse(MGraph G)
{
int i;
for(i=0;i<G.numVertexs;i++)
{
visited[i]=FALSE;
}
for(i=0;i<G.numVertexs;i++)
{
if(!visited[i])
{
DFS(G,i);
}
}
}
//队列
Status InitQueue(Queue *Q)
{
Q->front=0;
Q->rear=0;
return OK;
}
Status EnQueue(Queue *Q,QElemType e)
{
if((Q->rear+1)%MAXSIZE==Q->front)
{
return ERROR;
}
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(Queue *Q,QElemType *e)
{
if(Q->front==Q->rear)
{
return ERROR;
}
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}
Status QueueEmpty(Queue *Q)
{
if(Q->front==Q->rear)
{
return TRUE;
}
else
{
return FALSE;
}
}
void BFSTraverse(MGraph G)
{
int i,j;
Queue Q;
for(i=0;i<G.numVertexs;i++)
{
visited[i]=FALSE;
}
//初始化队列
InitQueue(&Q);
for(i=0;i<G.numVertexs;i++)
{
if(!visited[i])
{
visited[i]=TRUE;
printf(" %s",G.vexs[i]);
EnQueue(&Q,i);
while(!QueueEmpty(&Q))
{
DeQueue(&Q,&i);
for(j=0;j<G.numVertexs;j++)
{
if(G.arc[i][j]==1&&!visited[j])
{
visited[j]=TRUE;
printf(" %s",G.vexs[j]);
EnQueue(&Q,j);
}
}
}
}
}
}
Status DFS_FindSimPath(MGraph G,VertexType *Path,int v,int s,int value)
{
int i;
visited[v]=TRUE;
strcpy(Path[value],G.vexs[v]);//将顶点值存放数组中
value++;
if(v==s)
{
for(i=0;i<value;i++)
{
if(strcmp(Path[i],"\0")!=0)//比较字符串
{
printf("%s ",Path[i]);
}
}
printf("\n");
}
else
{
for(i=0;i<G.numVertexs;i++)
{
if(G.arc[v][i]!=0&&G.arc[v][i]!=INFINITY&&!visited[i])
{
DFS_FindSimPath(G,Path,i,s,value);
}
}
}
visited[v]=FALSE;
value--;
return OK;
}
Status MGraphMenu()
{
int value;
printf("\n");
printf(" ________图的操作________ \n");
printf("| |\n");
printf("| 1.打印顶点与邻接矩阵 |\n");
printf("| 2.深度优先遍历打印 |\n");
printf("| 3.广度优先遍历打印 |\n");
printf("| 4.求v-s的简单路径 |\n");
printf("| 5.退出 |\n");
printf("|________________________|\n");
printf("请输入你要进行的操作:");
scanf("%d",&value);
return value;
}
Status main()
{
MGraph G;int RET;
CreateMGraph(&G);
printf("\n");
label:
RET=MGraphMenu();
if(RET==1)
{
PrintMGraph(G);
printf("\n");
goto label;
}
else if(RET==2)
{
printf("\n");
printf("深度优先遍历:\n");
DFSTraverse(G);
printf("\n");
goto label;
}
else if(RET==3)
{
printf("\n");
printf("广度优先遍历:\n");
BFSTraverse(G);
printf("\n");
goto label;
}
else if(RET==4)
{
int i,v,s,value;
VertexType a,b;
VertexType Path[G.numVertexs];
printf("请输入出发顶点:\n");
scanf("%s",a);
printf("请输入到达顶点:\n");
scanf("%s",b);
value=0;
for(i=0;i<G.numVertexs;i++)
{
if(strcmp(G.vexs[i],a)==0)
{
v=i;
}
if(strcmp(G.vexs[i],b)==0)
{
s=i;
}
}
for(i=0;i<G.numVertexs;i++)
{
visited[i]=FALSE;
}
for(i=0;i<G.numVertexs;i++)
{
strcpy(Path[i],"\0");
}
DFS_FindSimPath(G,Path,v,s,value);
goto label;
}
else
{
printf("退出!\n");
}
return OK;
}
1.1.3 下载
链接地址: 5.1_MGRAPH.CPP