user-0 提问: C语言数据结构，关于图的遍历的问题，求大神指导一下

回复:
user: user-0
content: 深度和广度的算法我懂，但是我不知道怎么修改让它输出所有可能的结果，就像我一楼写的那样

user: user-1
content: https://www.cnblogs.com/mozhuhao/p/4487652.html

user: user-1
content: #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; }  参考博客： http://blog.csdn.net/zhang0xu0/article/details/53258136

user: user-0
content: 大神不好意思能直接复制发出来嘛   好像下载不了

user: user-2
content: https://zh.wikipedia.org/wiki/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2  https://zh.wikipedia.org/wiki/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2

user: user-0
content: 这是我的源代码，在线等大神指导   #include<stdio.h>   #include<malloc.h>   #include<process.h>   #include"stdafx.h" #include <stdio.h> #define MaxVex        100            //最大顶点数 #define TRUE        1 #define FALSE        0 typedef int			VRType;			//顶点关系类型 typedef char        VertexType;    //顶点类型 typedef int         Bool; Bool    visited[MaxVex];//访问标志数组  typedef struct ArcCell//邻接矩阵结构体 { 	VRType adj; }ArcCell, AdjMatrix[MaxVex][MaxVex];  typedef struct {     VertexType    vexs[MaxVex];            //顶点数组     AdjMatrix    arc;					   //邻接矩阵     int    vexnum, arcnum;            //当前图中的结点数以及边数 }MGraph;    //广度优先遍历需要的循环队列 typedef struct {     int    data[MaxVex];     int    front, rear; }Queue;   /****************************************/ //队列的相关操作  //初始化 void InitQueue(Queue *Q) {     Q->front = Q->rear = 0; }  //入队 void EnQueue(Queue *Q, int e) {     if ((Q->rear+1)%MaxVex == Q->front)         return ;      Q->data[Q->rear] = e;     Q->rear = (Q->rear+1)%MaxVex; }  //判空 Bool QueueEmpty(Queue *Q) {     if (Q->front == Q->rear)         return TRUE;     else         return FALSE; }  //出队 void DeQueue(Queue *Q, int *e) {     if (Q->front == Q->rear)         return ;          *e = Q->data[Q->front];     Q->front = (Q->front+1)%MaxVex; } /****************************************/   //建立图的邻接矩阵 void CreateMGraph(MGraph *G) {     int i, j, k;     printf("输入顶点数和边数: ");     scanf("%d%d", &G->vexnum,&G->arcnum);     fflush(stdin);//清除标准输入设备（一般是键盘）的缓存。消除输入字符时回车的影响     printf("==============================\n");     printf("输入各个顶点:\n");     for (i=0; i<G->vexnum; ++i)     {         printf("顶点%d: ",i+1);         scanf("%c", &G->vexs[i]);         fflush(stdin);//清除标准输入设备（一般是键盘）的缓存。消除输入字符时回车的影响     }     for (i=0; i<G->vexnum; ++i)//初始化邻接矩阵     {         for (j=0; j<G->vexnum; ++j)             G->arc[i][j].adj = 0;     }     printf("==============================\n");     for (k=0; k<G->arcnum; ++k)     {         printf("输入边(vi, vj)中的下标i和j: ");         scanf("%d%d", &i,&j);         G->arc[i][j].adj=1;         G->arc[j][i] = G->arc[i][j];//设置对称弧     } }   //输出 void DisMGraph(MGraph *G) {     int i, j, k;     k = G->vexnum;     for (i=0; i<k; ++i)     {         for (j=0; j<k; ++j)         {             printf("%5d ", G->arc[i][j]);         }         putchar('\n');     } }   /****************************************/ //图的深度优先遍历 void DFS(MGraph G, int i) {     int j;     visited[i] = TRUE;     printf("%c ",    G.vexs[i]);      for (j=0; j<G.vexnum; ++j)     {         if (G.arc[i][j].adj!=0  &&  !visited[j])             DFS(G, j);     } }  void DFSTraverse(MGraph G) {     int i;     for (i=0; i<G.vexnum; ++i)         visited[i] = FALSE;      for (i=0; i<G.vexnum; ++i)     {         if (!visited[i])             DFS(G, i);     }  }   //图的广度优先遍历 void BFSTraverse(MGraph *G) {     int i, j;     Queue Q;      for (i=0; i<G->vexnum; ++i)         visited[i] = FALSE;      InitQueue(&Q);      for (i=0; i<G->vexnum; ++i)     {         if (!visited[i])         {             visited[i] = TRUE;             printf("%c ", G->vexs[i]);             EnQueue(&Q, i);              while (!QueueEmpty(&Q))             {                 DeQueue(&Q, &i);                 for (j=0; j<G->vexnum; ++j)                 {                     if (!visited[j] && G->arc[i][j].adj!=0)                     {                         visited[j] = TRUE;                         printf("%c ", G->vexs[j]);                         EnQueue(&Q, j);                     }                 }             }         }     } } /****************************************/  //程序入口 int main(){     MGraph G;     CreateMGraph(&G);     printf("\n图的深度优先遍历为: ");     DFSTraverse(G);         printf("\n图的广度优先遍历为: ");     BFSTraverse(&G);     printf("\n"); 	system("pause");     return 0; }