資料結構 圖的鄰接表儲存結構及DFS/BFS遍歷
阿新 • • 發佈:2018-12-17
//鄰接表 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define INF 999 using namespace std; typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; int weight; }ArcNode; typedef struct VNode { ArcNode *firstarc; }VNode; typedef struct { VNode adjlist[100]; int n,e; }AdjGraph; int vis[99]={0}; void CreatAdj(AdjGraph *&G,int A[6][10],int n,int e) { int i,j,k; ArcNode *p; G=(AdjGraph *)malloc(sizeof(AdjGraph)); for(i=0;i<n;i++) { G->adjlist[i].firstarc=NULL; } for(i=0;i<n;i++) { for(j=n-1;j>=0;j--) { if(A[i][j]!=0&&A[i][j]!=INF) { p=(ArcNode *)malloc(sizeof(ArcNode)); p->adjvex=j; p->weight=A[i][j]; p->nextarc=G->adjlist[i].firstarc; G->adjlist[i].firstarc=p; } } } G->n=n; G->e=e; } void DispAdj(AdjGraph *G) { ArcNode *p; for(int i=0;i<G->n;i++) { p=G->adjlist[i].firstarc; printf("%2d:",i); while(p!=NULL) { printf("%2d[%d]->",p->adjvex,p->weight); p=p->nextarc; } printf("^\n"); } } void Destory(AdjGraph *&G) { int i; ArcNode *pre,*p; for(i=0;i<G->n;i++) { pre=G->adjlist[i].firstarc; if(pre!=NULL) { p=pre->nextarc; while(p!=NULL) { free(pre); pre=p; p=p->nextarc; } free(pre); } } free(G); } void dfs(AdjGraph *G,int v) { cout<<" "<<v<<endl; vis[v] = 1; ArcNode *p; p = G->adjlist[v].firstarc; while(p!=NULL) { if(vis[p->adjvex]==0) { dfs(G,p->adjvex); } p = p->nextarc; } } void bfs(AdjGraph *G,int v) { int que[99],fron = 0,rear = 0; ArcNode *p; memset(vis,0,sizeof(vis)); int w , i; vis[v] = 1; rear+=1; que[rear] = v; cout<<v<<endl; while(fron!=rear) { fron++; w = que[fron]; p = G->adjlist[w].firstarc; while(p!=NULL) { if(vis[p->adjvex]==0) { cout<<p->adjvex<<endl; vis[p->adjvex]=1; rear++; que[rear] = p->adjvex; } p = p->nextarc; } } } int main() { memset(vis,0,sizeof(vis)); AdjGraph *G; int A[6][10]={ {0,5,INF,7,INF,INF}, {INF,0,4,INF,INF,INF}, {8,INF,0,INF,INF,9}, {INF,INF,5,0,INF,6}, {INF,INF,INF,5,0,INF}, {3,INF,INF,INF,1,0}}; CreatAdj(G,A,6,10); for(int i=0;i<6;i++){ for(int j=0;j<10;j++){ cout<<A[i][j]<<" "; } cout<<endl; } DispAdj(G); cout<<endl<<"dfs"<<endl; dfs(G,0); cout<<"BFS"<<endl; bfs(G,0); Destory(G); return 0; }