- /*******************************************************************************/
- bool visited[MAXVEX];//访问标识数组
- void DFS(MGraph MG,int i){//邻接矩阵的深度优先递归算法
- int j;
- visited[i] = true;//修改i的访问标识
- printf("%c ",MG.vexs[i]);//打印顶点,也可以换成其他操作
- for(j=0;j<numVertexes;j++){//对访问的结点的邻接点进行递归调用
- if(MG.arc[i][j]==1 && !visited[j]){//如果相关的边存在,而且结点还没有被访问,就递归
- DFS(MG,j);
- }
- }
- }
- void DFSTraverse(MGraph MG){
- int i;
- for(i=0;i<MG.numVertexes;i++){//初始化访问标识数组,均设置成未访问状态
- visited[i] = false;
- }
- for(i=0;i<MG.numVertexes;i++){//
- if(!visited[i]){//如果是连通图,只会执行一次
- DFS(MG,i);
- }
- }
- }
- /*******************************************************************************/
- void DFS(GraphAdjList GL,int i){//邻接表的深度优先递归算法
- EdgeNode *p;
- visited[i] = true;
- printf("%c ",GL->adjList[i].data);//打印,也可以是其他操作
- p = GL->adjList[i].firstedge;//指向下一个邻接点
- while(p){//如果不为空
- if(!visited[p->adjvex])//如果还没有被访问过
- DFS(GL,p->adjvex);//递归调用
- }
- p = p->next;
- }
- }
- void DFS(GraphAdjList GL){
- int i;
- for(i=0;i<GL->numVertexes;i++){//初始化所有都是未访问状态
- visited[i] = false;
- }
- for(i=0;i<GL->numVertexes;i++){
- if(!visited[i]){//如果是连通图,只会执行一次
- DFS(GL,i);
- }
- }
- }
- /*******************************************************************************/
- void BFSTraverse(MGraph MG){//邻接矩阵的广度优先递归算法
- int i,j;
- Queue Q;//广度遍历相当于层次遍历,需要一个队列
- for(i=0;i<MG.numVertexes;i++){
- visited[i] = false;
- }
- initQueue(&Q);
- for(i=0;i<MG.numVertexes;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<MG.numVertexes;j++){
- if(MG.arc[i][j] == 1 && !visited[j]){//相关的邻接点如果还没有访问就入队
- visited[j] = true;//先打印
- printf("%c",MG.vex[j]);
- EnQueue(&Q,j);//后入队
- }
- }
- }
- }
- }
- }
- /*******************************************************************************/
- void BFSTraverse(GraphAdjList GL){//邻接表的广度优先递归算法
- int i;
- EdgeNode *p;
- Queue Q;
- for(i=0;i<GL->numVertexes;i++){
- visited[i] = false;
- }
- initQueue(&Q);
- for(i=0;i<GL->numVertexes;i++){
- if(!visited[i]){
- visited[i] = true;
- printf("%c",GL->adjList[i].data);
- EnQueue(&Q,i);
- while(!QueueEmpty(Q)){
- DeQueue(&Q,&i);
- p = GL->adjList[i].firstedge;//找到当前结点指向边表的头指针
- while(p){
- if(!visited[p->adjvex]){//如果没有访问,一次访问并入栈
- visited[p->adjvex] = true;
- printf("%c",GL->adjList[p->adjvex].data);
- EnQueue(&Q,p->adjvex);
- }
- p=p->next;//指针指向下一个邻接点
- }
- }
- }
- }
- }
转载于:https://blog.51cto.com/fanaticssk/839710