使用鄰接表儲存無向圖
阿新 • • 發佈:2019-05-12
問題描述
使用鄰接表儲存下圖所示無向圖
解題思路
建立一個鄰接表接受無向圖資訊
程式實現
#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; } }
執行結果