基于邻接表的图的各种遍历

来源:互联网 发布:北京数据恢复培训 编辑:程序博客网 时间:2024/06/05 11:08

基于邻接表的图的各种遍历
/** * *Coder: LinX  2017-7-13 - 2017-7-14  * *内容: 基于邻接表的图的各种遍历  * */   #include <stdio.h>  #include <stdlib.h>  #define MAXSIZE 100  typedef struct ArcNode {  int adj_vex;  struct ArcNode *next_arc;  }ArcNode;  typedef struct {  char data;  ArcNode *first_arc;  }VNode;  typedef struct {  VNode adjlist[MAXSIZE];  int vnums,enums;  }AGraph;  AGraph* createDG();//创建基于邻接表的有向图  void DFS(AGraph *G,int visit[],int startVT);//基于邻接表的图的深度优先遍历   void BFS(AGraph *G,int visit[],int startVT); //基于邻接表的图的广度优先遍历    int main() {  int i,visit[MAXSIZE];  for(i=0;i<MAXSIZE;i++) {  visit[i]=0;  }  AGraph *G=createDG();  DFS(G,visit,0);  printf("\n");  for(i=0;i<MAXSIZE;i++) {  visit[i]=0;  }  BFS(G,visit,0);  return 0;  }  /*基于邻接表的图的深度优先遍历*/  void DFS(AGraph *G,int visit[],int startVT) {  int curVT;  ArcNode *p;  p=G->adjlist[startVT].first_arc;  printf("%c ",G->adjlist[startVT].data);  visit[startVT]=1; while(p!=NULL){if(visit[p->adj_vex]==0){DFS(G,visit,p->adj_vex);}p=p->next_arc;}   }  /*基于邻接表的图的广度优先遍历*/  void BFS(AGraph *G,int visit[],int startVT) {  int queue[MAXSIZE];  int front=0,rear=0,curVT;  queue[++rear]=startVT;  printf("%c ",G->adjlist[startVT].data);  ArcNode *p;  while(front!=rear) {  front=(front+1)%MAXSIZE;  curVT=queue[front];  p=G->adjlist[curVT].first_arc;  while(p!=NULL) {  if(visit[p->adj_vex]==0) {  printf("%c ",G->adjlist[p->adj_vex].data);  rear=(rear+1)%MAXSIZE;  queue[rear]=p->adj_vex;  visit[p->adj_vex]=1;  }  p=p->next_arc;  }  }   }    /*创建基于邻接表的有向图*/  AGraph* createDG() {  int i=0,v1,v2;  AGraph *G;  ArcNode *s;  char c;  G=(AGraph *)malloc(sizeof(AGraph));  printf("请输入顶点的个数: ");  scanf("%d",&G->vnums);  printf("请输入边的条数: ");  scanf("%d",&G->enums);  for(i=0;i<G->vnums;i++) {  G->adjlist[i].first_arc=NULL;  }  printf("输入顶点(#结尾): ");  i=-1;  while((c=getchar())!='#'){G->adjlist[i].data=c;i++;} printf("输入边信息(输入一对顶点的位置): ");  for(i=0;i<G->enums;i++) {  scanf("%d%d",&v1,&v2);  s=(ArcNode *)malloc(sizeof(ArcNode));  s->next_arc=NULL;  s->adj_vex=v2-1;  //这里使用头插法   s->next_arc=G->adjlist[v1-1].first_arc;  G->adjlist[v1-1].first_arc=s;  }  return G;  }


原创粉丝点击