java无向图深度遍历_C语言实现邻接矩阵创建无向图&图的深度优先遍历

/* '邻接矩阵' 实现无向图的创建、深度优先遍历*/

#include

#include

#define MaxVex 100 //最多顶点个数

#define INFINITY 32768 //表示极大值,即 ∞

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

typedef char VertexType; //假设顶点数据类型为字符类型

typedef int EdgeType; //对于无权图,用1或0表示是否相邻,对带权图,则为权值类型

typedef struct

{

VertexType vertex[MaxVex]; //顶点数组

EdgeType arcs[MaxVex][MaxVex]; //邻接矩阵

int vexnum,arcnum; //图中的顶点数和边数

}Graph;

int visited[MaxVex]; //访问标志数组

/**********************各个子函数的定义*********************/

void init(Graph *G); //初始化邻接矩阵

int LocateVertex(Graph *G,VertexType v);//求顶点位置函数

int createUDG(Graph *G);//创建一个无向图

void DepthFirstSearch(Graph G, int i); //图的深度优先遍历

void TraverseGraph(Graph G);

/**************************主函数*************************/

int main()

{

Graph G;

int choice;

while(true)

{

printf("*****************Please enter your choice*****************\n\n");

printf(" choice 1:Initialization\n");

printf(" choice 2:Create Graph\n");

printf(" choice 3:Depth First Search\n");

printf(" choice 0:exit\n\n");

scanf("%d",&choice);

switch(choice)

{

case 1:

init(&G);

break;

case 2:

(createUDG(&G)==1)?printf("Create Graph success.\n"):printf("Create Graph ERROR\n");

break;

case 3:

printf("图的深度优先遍历为: ");

TraverseGraph(G);

break;

case 0:

exit(0);

break;

default:

printf("ERROR!!\n");

exit(0);

break;

}

}

return 0;

}

/**********************各个子函数功能的实现*********************/

void init(Graph *G) //初始化邻接矩阵

{

int i,j;

printf("请输入图的顶点个数和边数:");

scanf("%d %d",&(G->vexnum),&(G->arcnum));//输入图的顶点个数和边数

for(i=0;ivexnum;i++) //初始化

{

for(j=0;jvexnum;j++)

{

G->arcs[i][j]=INFINITY;

}

}

printf("图的初始化成功\n");

}

int LocateVertex(Graph *G,VertexType v) //查找并返回顶点的位置

{

int j=0,k;

for(k=0;kvexnum;k++)

{

if(G->vertex[k]==v)

{

j=k;

break;

}

}

return j;

}

int createUDG(Graph *G) //创建一个无向图

{

int i,j,k,weight;

VertexType v1,v2;

for(i=0;ivexnum;i++)

{

printf("请输入图的第 %d 顶点:",i+1);

getchar();

scanf("%c",&(G->vertex[i])); //输入图的顶点集

}

for(k=0;karcnum;k++)

{

printf("请分别输入图的第 %d 条边的两个顶点和权值",k+1);

getchar();

scanf("%c %c %d",&v1,&v2,&weight);//输入一条边的两个顶点、权值

i=LocateVertex(G,v1);

j=LocateVertex(G,v2);

G->arcs[i][j]=weight; //建立顶点之间的关系

G->arcs[j][i]=weight;

}

return OK;

}

void DepthFirstSearch(Graph G, int i) //图的深度优先遍历

{

int j;

visited[i] = TRUE;

printf("%c ",G.vertex[i]);

for (j=0; j

{

if (G.arcs[i][j]!=INFINITY && !visited[j])

DepthFirstSearch(G,j);

}

}

void TraverseGraph(Graph G)

{

int i;

for (i=0; i

visited[i] = FALSE;

for (i=0; i

{

if (!visited[i])

DepthFirstSearch(G, i);

}

printf("\n");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值