图的遍历——C语言

来源:互联网 发布:python 全文搜索引擎 编辑:程序博客网 时间:2024/06/08 04:52

利用邻接矩阵存储一张图,分别采用图的深度优先搜索和广度优先搜索遍历该图,并输出遍历结果。


主程序:

#include <stdio.h>#include <stdlib.h>#define MAXVEX  100                      //最大顶点数#define INFINITY    65535               //用65535来代表无穷大int visited[MAXVEX]={0};typedef struct{    char vexs[MAXVEX];            //顶点表    int  arc[MAXVEX][MAXVEX];         //邻接矩阵,可看作边    int  numVertexes, numEdges;      //图中当前的顶点数和边数}Graph;void CreateGraph(Graph *g){    int i,j,k,w,t;     printf("输入顶点数,边数和t(中间用空格):");     scanf("%d %d %d", &(g->numVertexes), &(g->numEdges),&t);     printf("\n"); for(i=1;i<=g->numVertexes;i++)     {      getchar();     printf("输入第%d顶点信息vexs[%d]=",i,i);     scanf("%c",&(g->vexs[i]));     }     printf("\n");     for(i=1;i<=g->numVertexes;i++)            for(j=1;j<=g->numVertexes;j++)                if (t>2)    g->arc[i][j] = INFINITY;                else        g->arc[i][j]=0;     for(k=1;k<=g->numEdges;k++)           {            printf("输入i j(中间用空格):");    scanf("%d %d",&i,&j);            if(i>g->numVertexes ||j>g->numVertexes)  exit(0);            if(t>2)            {                  printf("输入w:");      scanf("%d",&w);                  g->arc[i][j]=w;                  if(t==3)  g->arc[j][i]=w;            }            else            {     g->arc[i][j]=1;                  if (t==1)    g->arc[j][i]=1;            }     }     printf("\n");     printf("输出邻接矩阵:\n");     for(i=1;i<=g->numVertexes ;i++)     {     for(j=1;j<=g->numVertexes ;j++)     {     printf("%8d",g->arc[i][j]);       if(t>2&&g->arc[i][j]==65535)           g->arc[i][j]=0;  else if(t>2&&g->arc[i][j]!=65535)              g->arc[i][j]=1; } printf("\n");     }}void dfs (Graph g,int i)         //广度优先搜索,从顶点i开始遍历{       int j;       printf("%d->",i);         //输出访问顶点        visited[i]=1;            //全局数组访问标记置1表示已经访问        for(j=1; j<=g.numVertexes; j++)               if ((g.arc[i][j]==1)&&(!visited[j]))                        dfs (g,j);}void bfs (Graph g,int i){  int visited[MAXVEX]={0};      int  q[g.numVertexes+1] ;      int  f,r,j ;      f=r=0 ;      printf("%d->",i);      visited[i]=1 ;      r++;  q[r]=i ;      while (f<r)      {    f++; i=q[f] ;            for (j=1; j<=g.numVertexes; j++)                   if ((g.arc[i][j]==1)&&(!visited[j]))                   {    printf("%d->",j);    ;     visited[j]=1 ;     r++; q[r]=j ;  }       }}int main(){    Graph g;    int i;    printf("t为1~4,分别表示无向图、有向图、带权无向图、带权有向图\n");    CreateGraph(&g);    printf("\n输入i:");    scanf("%d",&i);    printf("\n深度优先搜索遍历:");    dfs (g,i);    printf("NULL\n");    printf("广度优先搜索遍历:");    bfs (g,i);        printf("NULL\n");    return 0;}
输入输出示例:

1.无向图

t为1~4,分别表示无向图、有向图、带权无向图、带权有向图输入顶点数,边数和t(中间用空格):8 10 1输入第1顶点信息vexs[1]=1输入第2顶点信息vexs[2]=2输入第3顶点信息vexs[3]=3输入第4顶点信息vexs[4]=4输入第5顶点信息vexs[5]=5输入第6顶点信息vexs[6]=6输入第7顶点信息vexs[7]=7输入第8顶点信息vexs[8]=8输入i j(中间用空格):1 2输入i j(中间用空格):1 3输入i j(中间用空格):2 4输入i j(中间用空格):2 5输入i j(中间用空格):3 6输入i j(中间用空格):3 7输入i j(中间用空格):4 8输入i j(中间用空格):5 8输入i j(中间用空格):6 8输入i j(中间用空格):7 8输出邻接矩阵:       0       1       1       0       0       0       0       0       1       0       0       1       1       0       0       0       1       0       0       0       0       1       1       0       0       1       0       0       0       0       0       1       0       1       0       0       0       0       0       1       0       0       1       0       0       0       0       1       0       0       1       0       0       0       0       1       0       0       0       1       1       1       1       0输入i:1深度优先搜索遍历:1->2->4->8->5->6->3->7->NULL广度优先搜索遍历:1->2->3->4->5->6->7->8->NULL--------------------------------Process exited after 74.92 seconds with return value 0请按任意键继续. . .

2.带权无向图

t为1~4,分别表示无向图、有向图、带权无向图、带权有向图输入顶点数,边数和t(中间用空格):5 8 3输入第1顶点信息vexs[1]=1输入第2顶点信息vexs[2]=2输入第3顶点信息vexs[3]=3输入第4顶点信息vexs[4]=4输入第5顶点信息vexs[5]=5输入i j(中间用空格):1 2输入w:6输入i j(中间用空格):1 3输入w:1输入i j(中间用空格):1 5输入w:3输入i j(中间用空格):2 5输入w:9输入i j(中间用空格):2 4输入w:8输入i j(中间用空格):4 5输入w:7输入i j(中间用空格):4 3输入w:2输入i j(中间用空格):3 5输入w:4输出邻接矩阵:   65535       6       1   65535       3       6   65535   65535       8       9       1   65535   65535       2       4   65535       8       2   65535       7       3       9       4       7   65535输入i:3深度优先搜索遍历:3->1->2->4->5->NULL广度优先搜索遍历:3->1->4->5->2->NULL--------------------------------Process exited after 42.63 seconds with return value 0请按任意键继续. . .



0 1