圖的鄰接表表示及其遍歷


圖的鄰接表表示及其遍歷

1.圖的結構定義

#define MAXVEX 100
#define true 1
typedef char VertexType;		//定義圖節點值得類型,可隨意更換
typedef int EdgeType;			
typedef struct EdgeNode  		//定義邊表節點
{
	int adjvex;              	//存儲頂點下標
 	EdgeType weight;            //權重值
	struct EdgeNode* next;      //邊指針
}EdgeNode;
typedef struct VertexNode	/*頂點表節點*/
{
	VertexType data;
	EdgeNode* firstedge;
}VertexNode,AdjList[MAXVEX];
typedef struct
{
	AdjList adjList;
	int numVertexes,numEdges;
}GraphAdjList;

2.圖的建立

void CreatGraph(GraphAdjList *g)
{
	int i,j,k;
	EdgeNode *e;
	scanf("%d%d",&g->numVertexes,&g->numEdges);//獲取頂點數和邊數
	char c;
	//gettchar();
	for(i=0;i<g->numVertexes;i++)
	{
		while((c=getchar())=='\n'||c==' ');//排除空格和換行符
		g->adjList[i].data = c;            //獲取頂點值,
		g->adjList[i].firstedge = NULL;    //將邊表置為空
	}
	for(k=0;k<g->numEdges;k++)
	{
		scanf("%d%d",&i,&j);               //輸入i,j 在圖中有i-->j
		e=(EdgeNode*)malloc(sizeof(EdgeNode));
		e->adjvex = j;
		e->next = g->adjList[i].firstedge;   //頭插法建立邊表
		g->adjList[i].firstedge= e;
		/*如果為無向圖,則加入以下代碼
                e=(EdgeNode*)malloc(sizeof(EdgeNode));
                e->adjvex = i;
                e->next = g->adjList[j].firstedge;
                g->adjList[j].firstedge= e;*/
   	}
}

3.圖的DFS遍歷

void DFS(GraphAdjList *g,int i)
{
        EdgeNode *p;
        visited[i]=true;
        printf("%c ",g->adjList[i].data);
        p = g->adjList[i].firstedge;
        while(p)
        {
                if(visited[p->adjvex]==0)
                        DFS(g,p->adjvex);
                p=p->next;
        }
}

假設有下面這張圖,這個圖包含兩個連通圖。

這里寫圖片描述
輸入如下:

7 6           		 <==輸入頂點數和邊數
a b c d e f g        <==輸入頂點值
0 2 0 3 0 1 4 5 1 6 1 2        <==依次輸入邊
 

根據輸入,可以得到鄰接表如下:
這里寫圖片描述
根據鄰接表可知,該圖的深度優先遍歷如下:

a->b->c->g->d->e->f

程序運行結果:
這里寫圖片描述
證明程序是正確的。
完整程序代碼參見:
https://github.com/zkangHUST/DataStructure


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM