1. 程式人生 > >C語言實現鄰接矩陣建立無向圖&圖的深度優先遍歷

C語言實現鄰接矩陣建立無向圖&圖的深度優先遍歷

/* '鄰接矩陣' 實現無向圖的建立、深度優先遍歷*/
#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");
}

程式碼測試: