/** * 表頭鏈接的表中結點定義 * */ typedef struct tableBody { int vexIndex;//鄰接點在數組中的位置下標 struct tableBody *nextarc;//指向下一個鄰接點的指針 } tableBody; /** * 表頭結點定義 * */ typedef struct tableHead { char data;//頂點的數據域 struct tableBody *firstarc;//指向鄰接點的指針 } tableHead, *tableHeadArr;//存儲各鏈表頭結點的數組 /**圖-鄰接表定義*/ typedef struct { tableHead vertices[20];//圖中頂點及各鄰接點數組 int vexnum, arcnum;//記錄圖中頂點數和邊或弧數 } LJBGraph;
void createGraph(LJBGraph *g) { //總頂點個數,總邊數 int i, j, k; tableBody *tb; printf("輸入頂點數和邊數"); scanf("%d %d", &g->vexnum, &g->arcnum);//獲取頂點數和邊數 //gettchar(); for (i = 0; i < g->vexnum; i++) { char c; printf("輸入%d 個頂點值", (i + 1)); getchar(); scanf("%c", &c); g->vertices[i].data = c; //獲取頂點值, g->vertices[i].firstarc = NULL; //將邊表置爲空 } for (k = 0; k < g->arcnum; k++) { printf("輸入a,b 在圖中有a-->b:"); getchar(); char a,b; scanf("%c %c", &a, &b); //輸入i,j 在圖中有i-->j tb = (tableBody *) malloc(sizeof(tableBody)); i=localIndex(g,a); //a頂點所在頂點數組中的下標值。 j=localIndex(g,b); //b頂點所在數組中的下標值。 tb->vexIndex = j; tb->nextarc = g->vertices[i].firstarc; //頭插法創建邊表 g->vertices[i].firstarc = tb;//把新建的結點連接在頂點後面 /*若是爲無向圖,則加入如下代碼 e=(EdgeNode*)malloc(sizeof(EdgeNode)); e->adjvex = i; e->next = g->adjList[j].firstedge; g->adjList[j].firstedge= e;*/ } printfL(g); DFSTraverse(g); }
int localIndex(LJBGraph *g,char data){ for(int i=0;i<g->vexnum;i++){ if(g->vertices[i].data == data){ return i; } } printf("沒有這個字符"); return -1; }
void printfL(LJBGraph *g) { //輸出圖的信息 printf("表爲 :\n"); tableBody *p; printf("\n"); //鄰接表不須要表標題。 int i; for (i = 0; i < g->vexnum; i++) { printf("%d%c\t",(i),g->vertices[i].data);//表頭結點 p = g->vertices[i].firstarc; while (p) { printf("%d\t", p->vexIndex);//外表結點 p = p->nextarc;//外表結點下移 } printf("\n"); } }
int main(void) { LJBGraph *g; createGraph(g); return 0; }
存儲結構 | 儲存方式 | 操做特性 |
鄰接矩陣 |
一維數組(頂點)
二維數組(鄰接關係)
|
1:易於斷定頂點是否鄰接,查頂點的鄰接點
2:插入、刪除頂點複雜
|
鄰接表 |
頭結點(頂點)
表結點(鄰接關係)
|
1
:易於:查詢某頂點的鄰接點,邊或弧的插入、刪除
2:斷定頂點是否鄰接,比鄰接矩陣低效。
|