设为首页 加入收藏

TOP

C语言实现邻接矩阵创建无向图&图的深度优先遍历
2019-01-25 00:08:42 】 浏览:21
Tags:语言 实现 邻接 矩阵 创建 向图 深度 优先
/* '邻接矩阵' 实现无向图的创建、深度优先遍历*/
#include <stdio.h>
#include <stdlib.h> 

#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;i<G->vexnum;i++)              //初始化
	{
		for(j=0;j<G->vexnum;j++)
		{
			G->arcs[i][j]=INFINITY;
		}
	} 
	printf("图的初始化成功\n"); 
}

int LocateVertex(Graph *G,VertexType v)  //查找并返回顶点的位置 
{
	int j=0,k;
	for(k=0;k<G->vexnum;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;i<G->vexnum;i++)
	{
		printf("请输入图的第 %d 顶点:",i+1);
		getchar();
		scanf("%c",&(G->vertex[i]));     //输入图的顶点集 
	} 
	for(k=0;k<G->arcnum;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<G.vexnum; j++)
    {
        if (G.arcs[i][j]!=INFINITY  &&  !visited[j])
            DepthFirstSearch(G,j);
    }
}

void TraverseGraph(Graph G)
{
    int i;
    for (i=0; i<G.vexnum; i++)   //初始化访问标志数组
        visited[i] = FALSE;

    for (i=0; i<G.vexnum; i++)//循环调用深度优先遍历连通子图的操作,若图G是连通图,则此调用只执行一次 
    {
        if (!visited[i])
            DepthFirstSearch(G, i);
    }
	printf("\n");
}

代码测试:


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Telnet模拟系统(Linux c) 下一篇让你的代码更加优雅的编程技巧-跳..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }