深度遍历有向图
问题:用标记来记录是否访问过,这个是个关键点。当然也可以用栈,思想是每访问一个顶点就入栈,接着访问这个顶点的下一个顶点,最后出栈,看出栈的顶点有没有下一个顶点,如果有就继续访问。如此重复,直到栈空。
还有一点就是用到了递归思想。很像二叉树的前序遍历。
代码:
#include <iostream> #include <cstdlib> using namespace std; #define MAXV 20 typedef struct edgeNode { int data; struct edgeNode *next; }edgeList; typedef struct headNode { char vex; edgeList *firstNode; }headList; typedef struct graph //定义邻接表结构 { headList arr[MAXV]; int v,e; }*adjGraph; void createAdjGraph(adjGraph &ag) { char c; int p,q; edgeList *s; cout<<"please input the num of v and e:"; cin>>ag->v>>ag->e; for(int i=0;i<ag->v;i++) //初始化头节点 { cout<<"please input vex:"; cin>>c; ag->arr[i].vex=c; ag->arr[i].firstNode=NULL; } for(int j=0;j<ag->e;j++) { cout<<"please input two vexs:"; cin>>p>>q; s=(edgeList *)malloc(sizeof(struct edgeNode)); s->data=p; s->next=ag->arr[q].firstNode; ag->arr[q].firstNode=s; } } void showAdjGraph(adjGraph ag) { for(int i=0;i<ag->v;i++) { cout<<ag->arr[i].vex<<" "; while(ag->arr[i].firstNode!=NULL) { cout<<ag->arr[i].firstNode->data<<" "; ag->arr[i].firstNode=ag->arr[i].firstNode->next; } cout<<endl; } } void DFS(adjGraph ag,int v,int *visited) { edgeList *s; int w; visited[v]=1; s=ag->arr[v].firstNode; cout<<ag->arr[v].vex<<"->"; while(s!=NULL) { w=s->data; if(visited[w]==0) DFS(ag,w,visited); s=s->next; } } void DFSTraversal(adjGraph ag) { int visited[MAXV]; for(int i=0;i<ag->v;i++) { visited[i]=0; } for(int j=0;j<ag->v;j++) { if(visited[j]==0) DFS(ag,j,visited); } cout<<endl; } int main() { adjGraph ag; ag=(adjGraph)malloc(sizeof(struct graph)); cout<<"创建图:"<<endl; createAdjGraph(ag); cout<<"输出图"<<endl; showAdjGraph(ag); cout<<"深度遍历图:"<<endl; DFSTraversal(ag); return 0; }
运行结果: