无向图的邻接表
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXVEX 100 /* 最大頂點數,應由用戶定義 */typedef int Status; /* Status是函數的類型,其值是函數結果狀態代碼,如OK等 */
typedef char VertexType; /* 頂點類型應由用戶定義 */
typedef int EdgeType; /* 邊上的權值類型應由用戶定義 */typedef struct EdgeNode /* 邊表結點 */
{int adjvex; /* 鄰接點域,存儲該頂點對應的下標 */EdgeType info; /* 用于存儲權值,對于非網圖可以不需要 */struct EdgeNode *next; /* 鏈域,指向下一個鄰接點 */
}EdgeNode;typedef struct VertexNode /* 頂點表結點 */
{VertexType data; /* 頂點域,存儲頂點信息 */EdgeNode *firstedge;/* 邊表頭指針 */
}VertexNode, AdjList[MAXVEX];typedef struct
{AdjList adjList; int numNodes,numEdges; /* 圖中當前頂點數和邊數 */
}GraphAdjList;/* 建立圖的鄰接表結構 */
void CreateALGraph(GraphAdjList *G)
{int i,j,k;EdgeNode *e;printf("輸入頂點數和邊數:\n");scanf("%d,%d",&G->numNodes,&G->numEdges); /* 輸入頂點數和邊數 */for(i = 0;i < G->numNodes;i++) /* 讀入頂點信息,建立頂點表 */{scanf(&G->adjList[i].data); /* 輸入頂點信息 */G->adjList[i].firstedge=NULL; /* 將邊表置為空表 */}for(k = 0;k < G->numEdges;k++)/* 建立邊表 */{printf("輸入邊(vi,vj)上的頂點序號:\n");scanf("%d,%d",&i,&j); /* 輸入邊(vi,vj)上的頂點序號 */e=(EdgeNode *)malloc(sizeof(EdgeNode)); /* 向內存申請空間,生成邊表結點 */e->adjvex=j; /* 鄰接序號為j */ e->next=G->adjList[i].firstedge; /* 將e的指針指向當前頂點上指向的結點 */G->adjList[i].firstedge=e; /* 將當前頂點的指針指向e */ e=(EdgeNode *)malloc(sizeof(EdgeNode)); /* 向內存申請空間,生成邊表結點 */e->adjvex=i; /* 鄰接序號為i */ e->next=G->adjList[j].firstedge; /* 將e的指針指向當前頂點上指向的結點 */G->adjList[j].firstedge=e; /* 將當前頂點的指針指向e */ }
}int main(void)
{ GraphAdjList G; CreateALGraph(&G);return 0;
}
總結