無向圖的構建及廣度優先遍歷---鄰接表實現
阿新 • • 發佈:2019-01-06
相關問題及基本理論已於前面的幾篇部落格中說明,現僅僅給出code。
code
/* 無向圖的構建(鄰接表實現)及其廣度優先遍歷 */ #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 30 typedef char VtType; bool visted[MAX_VERTEX_NUM]; //遍歷標記 typedef struct chain { int vid; //鄰接表表頭索引 struct chain* next; }Queue; //先入先出佇列 Queue* head=NULL; typedef struct ARC { int adj; struct ARC* nextarc; }ArcNode; //表節點 typedef struct { VtType data; ArcNode* firstarc; }VNODE,VList[MAX_VERTEX_NUM]; //一維表頭 typedef struct { VList vertices; int vexnum,arcnum; }VLGraph; //鄰接表圖 void AddArc(VLGraph &G,int m,int n) //表中新增m結點到n結點的路徑 { ArcNode* np,*curp,*save; np=(ArcNode*)malloc(sizeof(ArcNode)); np->adj=n; np->nextarc=NULL; curp=G.vertices[m].firstarc; if(curp==NULL) { G.vertices[m].firstarc=np; //第一個節點為空直接新增 } else { while(curp->adj < np->adj) //不為空時,後移實現節點索引的遞增排列 { save=curp; curp=curp->nextarc; if(curp==NULL) { break; } } if(curp==NULL) { save->nextarc=np; } else { if(curp==G.vertices[m].firstarc) { save=G.vertices[m].firstarc; G.vertices[m].firstarc=np; np->nextarc=save; } else { save->nextarc=np; np->nextarc=curp; } } } } void CreateG(VLGraph &G) //建立無向圖 { int i; G.vexnum=8; G.arcnum=9; for(i=0;i<G.vexnum;i++) { G.vertices[i].firstarc=NULL; G.vertices[i].data=97+i; } AddArc(G,0,1); AddArc(G,1,0); AddArc(G,3,1); AddArc(G,1,3); AddArc(G,3,7); AddArc(G,7,3); AddArc(G,4,7); AddArc(G,7,4); AddArc(G,4,1); AddArc(G,1,4); AddArc(G,0,2); AddArc(G,2,0); AddArc(G,2,5); AddArc(G,5,2); AddArc(G,2,6); AddArc(G,6,2); AddArc(G,5,6); AddArc(G,6,5); return; } void ShowVlist(VLGraph G) //鄰接表輸出 { int i; ArcNode* curp; printf("The adjacent list is:\n"); for(i=0;i<G.vexnum;i++) { printf("%c",G.vertices[i].data); curp=G.vertices[i].firstarc; while(curp!=NULL) { printf("-->%d",curp->adj); curp=curp->nextarc; } printf("-->NULL\n"); } return; } void BFS(VLGraph G,int v) //廣度優先遍歷遞迴函式 { ArcNode* curp; Queue* temp,*newnode; if(visted[v]!=true) { printf("%c ",G.vertices[v].data); visted[v]=true; } curp=G.vertices[v].firstarc; while(curp!=NULL) { if(visted[curp->adj]!=true) { printf("%c ",G.vertices[curp->adj].data); visted[curp->adj]=true; if(head==NULL) { head=(Queue*)malloc(sizeof(Queue)); head->vid=curp->adj; head->next=NULL; } else { temp=head; while(temp->next=NULL) { temp=temp->next; } newnode=(Queue*)malloc(sizeof(Queue)); newnode->vid=curp->adj; newnode->next=NULL; temp->next=newnode; } } curp=curp->nextarc; } while(head!=NULL) { temp=head; head=head->next; BFS(G,temp->vid); free(temp); } return; } void BFSTraverse(VLGraph G) //廣度優先遍歷介面函式 { int i; printf("The breadth traverse result is:\n"); for(i=0;i<G.vexnum;i++) { visted[i]=false; } for(i=0;i<G.vexnum;i++) { if(visted[i]==false) { BFS(G,i); } } return; } int main(void) { VLGraph G; CreateG(G); ShowVlist(G); printf("\n"); BFSTraverse(G); printf("\n\n"); system("pause"); return 0; }