1. 程式人生 > >使用鄰接表儲存無向圖

使用鄰接表儲存無向圖

問題描述

        使用鄰接表儲存下圖所示無向圖

    

解題思路

        建立一個鄰接表接受無向圖資訊

程式實現

#include <stdlib.h>
#include <stdio.h>

#define MAXVEX 10
/* Status是函式的型別,其值是函式結果狀態程式碼,如OK等 */
typedef int Status;
/* 頂點型別應由使用者定義  */
typedef char VertexType;
/* 邊上的權值型別應由使用者定義 */
typedef int EdgeType;

typedef struct EdgeNode {
	// 鄰接點域,儲存該頂點對應的下標
	int adjvex;
	// 鏈域,指向下一個鄰接點
	struct EdgeNode *next;
} EdgeNode;

// 頂點表結點
typedef struct VertexNode {
	// 頂點域,儲存頂點資訊
	VertexType data;
	// 邊表頭指標
	EdgeNode *firstedge;
} VertexNode, AdjList[MAXVEX];

typedef struct {
	AdjList adjList;
	// 圖中當前頂點數和邊數
	int numNodes;
	int numEdges;
} GraphAdjList, *GraphList;

void CreateMyGraph(GraphList *plus);
int main(void) {
	int i, j;
	GraphList plus;
	CreateMyGraph(&plus);
	for (i = 0; i <= plus->numNodes; i++) {
		printf("%c:\t", plus->adjList[i].data);
		EdgeNode *e;
		e = plus->adjList[i].firstedge;
		while (e != NULL) {
			printf("%c\t", plus->adjList[e->adjvex].data);
			e = e->next;
		}
		free(e);
		printf("\n");
	}
}

void CreateMyGraph(GraphList *plus) {
	int i, j, k, w;
	EdgeNode *e;
	printf("請輸入頂點數和邊數:\n");
	scanf("%d,%d", &i, &j);
	*plus = (GraphList)malloc(sizeof(GraphAdjList));
	getchar();
	(*plus)->numNodes = i;
	(*plus)->numEdges = j;
	// 讀入頂點數
	for (i = 0; i < (*plus)->numNodes; i++) {
		// 輸入頂點資訊
		scanf("%c", &(*plus)->adjList[i].data);
		// 將邊表置為空表
		(*plus)->adjList[i].firstedge=NULL;
	}

	// 讀入numEdges條邊,建立鄰接矩陣
	for(k = 0; k < (*plus)->numEdges; k++) {
		printf("輸入邊(vi,vj)上的下標i,下標j:\n");
		scanf("%d,%d", &i, &j);
		// 向記憶體申請空間,生成邊表結點
		e = (EdgeNode *)malloc(sizeof(EdgeNode));
		// 鄰接序號為j
		e->adjvex = j;
		// 將e的指標指向當前頂點上指向的結點
		e->next = (*plus)->adjList[i].firstedge;
		// 將當前頂點的指標指向e
		(*plus)->adjList[i].firstedge = e;

		// 因為是無向圖,所以需對稱儲存
		// 向記憶體申請空間,生成邊表結點
		e=(EdgeNode *)malloc(sizeof(EdgeNode));
		// 鄰接序號為i
		e->adjvex=i;
		// 將e的指標指向當前頂點上指向的結點
		e->next= (*plus)->adjList[j].firstedge;
		// 將當前頂點的指標指向e
		(*plus)->adjList[j].firstedge=e;
	}
}

執行結果