標籤:style blog color 資料 for io
建立一個有向圖的鄰接表,首先要構思好它的鄰接表裡麵包含哪些結構資料,然後根據哪些資料來建立相應的結構體。但也要注意資料的輸入。
#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 10typedef struct ArcNode //弧節點結構體{ int adjvex; //該弧指向定點的位置 int data; struct ArcNode * nextarc; //指向下下一條弧的指標}ArcNode;typedef struct VNode //定點結構體{ char data; ArcNode * firstarc; //指向第一條弧的指標}VNode, AdjList[MAX_SIZE];typedef struct //建立圖的結構體{ AdjList vertices; //頂點數組 int vexnum, arcnum; //頂點個數及弧的條數}ALGraph;int Find(ALGraph G, char ch) //尋找此節點位於頂點數組的那個位置{ int i; for(i = 0; i<G.vexnum; i++) { if(ch == G.vertices[i].data) break; } return i;}void Input(ALGraph & G) //構建鄰接表的輸入操作{ int mark, data; //mark是用來標記是否有下一條弧,data則用來儲存要輸入的資料 ArcNode * p; char ch; printf("請輸入圖的頂點數和弧的條數。\n"); scanf("%d%d", &G.vexnum, &G.arcnum); printf("請輸入頂點資訊。\n"); getchar(); for(int i = 0; i<G.vexnum; i++) { scanf("%c", &G.vertices[i].data); getchar(); } printf("請按照各個頂點的順序來輸入弧節點。\n"); for(int i = 0; i<G.vexnum; i++) { mark = 1; G.vertices[i].firstarc = NULL; printf("請判斷以%c為弧尾的弧。\n", G.vertices[i].data); while(mark) { printf("判斷是否有下一個弧,若有則輸入1,無則輸入0。\n"); scanf("%d", &mark); getchar(); if(mark) { p = (ArcNode *)malloc(sizeof(ArcNode)); p->nextarc = NULL; printf("輸入弧節點的資訊:"); scanf("%c", &ch); getchar(); scanf("%d", &data); p->adjvex = Find(G, ch); p->data = data; p->nextarc = G.vertices[i].firstarc; G.vertices[i].firstarc = p; } } }}void Output(ALGraph G) //輸出圖的有關資訊{ for(int i = 0; i<G.vexnum; i++) { printf("%c : ", G.vertices[i].data); while(G.vertices[i].firstarc) //輸出每個節點弧中所包含的資料 { printf("%d ", G.vertices[i].firstarc->data); G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc ; } printf("\n"); }}int main(){ ALGraph G; Input(G); Output(G); return 0;}