非递归dfs算法
来源:互联网 发布:中国电建华东院 知乎 编辑:程序博客网 时间:2024/06/06 22:33
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MAXSIZE 100 typedef char InfoType; typedef char vertex; typedef struct ANode //定义弧类型 { int adjvex; struct ANode *nextarc; InfoType Info; }ArcNode; typedef struct //定义顶点类型 { vertex data; ArcNode *fistarc; }VertexNode; typedef struct //定义图类型 { VertexNode adjlist[MAXSIZE]; //邻接表 int n,e; }ALGraph; void CreateALGraph(ALGraph *&g,int array[][MAXSIZE],int k) //传递一个邻接矩阵创建图 { g=(ALGraph *)malloc(sizeof(ALGraph)); for(int i=0;i<k;i++) g->adjlist[i].fistarc=NULL; int cnt=0; ArcNode *p; for(int i=0;i<k;i++) for(int j=0;j<k;j++) if(array[i][j]!=0) { cnt++; p=(ArcNode *)malloc(sizeof(ArcNode)); p->adjvex=j; p->nextarc=g->adjlist[i].fistarc; g->adjlist[i].fistarc=p; } g->n=k;g->e=cnt; } void dfs(ALGraph *g,int v,int visited[],int _vertex[]) //dfs() { int _v,i=0; //_v为初始顶点v的邻接点 ArcNode *p; _vertex[0]=v; //保存顶点的数组 visited[v]=1; //标记顶点是否已访问的数组 p=g->adjlist[v].fistarc; //p为顶点v的第一条边 while(p!=NULL) { _v=p->adjvex; if(visited[_v]==0) //如果该顶点未访问过 { i++; _vertex[i]=_v; visited[_v]=1; p=g->adjlist[_v].fistarc; //从下一个未访问过的顶点开始深度优先遍历 } else //否则找下一个相领顶点 p=p->nextarc; } for(int j=0;j<=i;j++) //打印出_vertex数组中的内容,即连通图的所有顶点 printf("%d ",_vertex[j]); printf("\n"); } int main() //主函数调用 { int graph_array[ ][MAXSIZE]={ {0,1,0,1,1}, {1,0,1,1,0}, {0,1,0,1,1}, {1,1,1,0,1}, {1,0,1,1,0} }; ALGraph *g; CreateALGraph(g,graph_array,5); int visited[MAXSIZE]={0}; int _vertex[MAXSIZE]={0}; dfs(g,2,visited,_vertex); system("pause"); return 0; }