【資料結構】圖的深度優先遍歷 廣度優先遍歷
阿新 • • 發佈:2018-11-24
檔案操作比直接輸入方便許多
#include <stdio.h> #include <stdlib.h> #include <string.h> #define M 20 /*鄰接表的儲存結構*/ typedef struct node /*表結點 或者 邊表結點*/ { int adjvex; struct node *next; }edgenode; typedef struct vnode /*頭結點*/ { char vertex; edgenode *firsteage; }vertexnode; typedef struct /*鄰接表型別*/ { vertexnode adjlist[M]; int n,e; }linkedgraph; int vis[M]; void creat (linkedgraph *g,int c) { int i,j,k; edgenode *s; FILE *f; f=fopen("test.txt","r"); if(f) { fscanf(f,"%d%d",&g->n,&g->e); for(i=0;i<g->n;i++) { fscanf(f,"%1s",&g->adjlist[i].vertex); g->adjlist[i].firsteage=NULL; } for(k=0;k<g->e;k++) { fscanf(f,"%d%d",&i,&j); s=(edgenode*)malloc(sizeof(edgenode)); s->adjvex=j; s->next=g->adjlist[i].firsteage; g->adjlist[i].firsteage=s; if(c==0) { s=(edgenode*)malloc(sizeof(edgenode)); s->adjvex=i; s->next=g->adjlist[j].firsteage; g->adjlist[j].firsteage=s; } } fclose(f); } else { g->n=0; } } void dfs(linkedgraph g,int i) { edgenode *p; printf("%c ",g.adjlist[i].vertex); vis[i]=1; p=g.adjlist[i].firsteage; while(p) { if(!vis[p->adjvex]) { dfs(g,p->adjvex); } p=p->next; } } void DfsTraverse(linkedgraph g) { int i; memset(vis,0,sizeof(vis)); printf("\nDFS:\n"); for(i=0;i<g.n;i++) { if(!vis[i]) { dfs(g,i); printf("\n"); } } printf("\n"); } void bfs(linkedgraph g,int i) { int j; edgenode *p; int queue[M],front ,rear; front=0;rear=0; printf("%c ",g.adjlist[i].vertex); vis[i]=1; queue[rear++]=i; while(rear>front) { j=queue[front++]; p=g.adjlist[j].firsteage; while(p) { if(vis[p->adjvex]==0) { printf("%c ",g.adjlist[p->adjvex].vertex); queue[rear++]=p->adjvex; vis[p->adjvex]=1; } p=p->next; } } } //返回連通分量的個數 int BfsTraverse(linkedgraph g) { printf("BFS:\n"); int i,count=0; memset(vis,0,sizeof(vis)); for(i=0;i<g.n;i++) { if(!vis[i]) { count++; bfs(g,i); printf("\n"); } } return count; } void print(linkedgraph *g) { printf("\n\n輸出:\n"); edgenode *p; int i; printf("一共有%d個結點,%d條邊\n",g->n,g->e); for(i=0;i<g->n;i++) { p=g->adjlist[i].firsteage; printf("V%d -> ",i); while(p) { printf("%d",p->adjvex); if(p->next) printf(" -> "); p=p->next; } printf("\n"); } } int main () { int count; linkedgraph g; creat(&g,0); print(&g); DfsTraverse(g); count=BfsTraverse(g); printf("一共有%d個連通分量\n",count); return 0; }
帶權無向圖的有區別的程式碼,有向圖c=0即可。
typedef struct node /*表結點 或者 邊表結點*/ { int adjvex; int data; struct node *next; }edgenode; void creat (linkedgraph *g,int c) { int i,j,k,w; edgenode *s; FILE *f; f=fopen("test.txt","r"); if(f) { fscanf(f,"%d%d",&g->n,&g->e); for(i=0;i<g->n;i++) { fscanf(f,"%1s",&g->adjlist[i].vertex); g->adjlist[i].firsteage=NULL; } for(k=0;k<g->e;k++) { fscanf(f,"%d%d%d",&i,&j,&w); s=(edgenode*)malloc(sizeof(edgenode)); s->data=w; s->adjvex=j; s->next=g->adjlist[i].firsteage; g->adjlist[i].firsteage=s; if(c==0) { s=(edgenode*)malloc(sizeof(edgenode)); s->data=w; s->adjvex=i; s->next=g->adjlist[j].firsteage; g->adjlist[j].firsteage=s; } } fclose(f); } else { g->n=0; } } void print(linkedgraph *g) { printf("\n\n輸出:\n"); edgenode *p; int i; printf("一共有%d個結點,%d條邊\n",g->n,g->e); for(i=0;i<g->n;i++) { p=g->adjlist[i].firsteage; printf("V%d -> ",i); while(p) { printf("%d (w = %d)",p->adjvex,p->data); if(p->next) printf(" -> "); p=p->next; } printf("\n"); } }