#include<iostream> using namespace std; #define MAX_VERTEX_NUM 50 //定义最大的结点数 typedef enum{DG,UDG}GraphKind; //定义图的种类DG(有向图) UDG(无向图) typedef char VertexData; //定义结点信息的数据类型 //定义弧结点 typedef struct EdgeNode { int adjvex; //该弧指向顶点的位置 //VertexData data; EdgeNode *next; }EdgeNode; //定义表头结点 typedef struct VetexNode { VertexData data; EdgeNode *link; }VetexNode; //定义基于邻接表的图 typedef struct AdjList { int vexNun,arcNun; //定义邻接表的顶点数,弧数 VetexNode vertex[MAX_VERTEX_NUM]; GraphKind kind; }AdjList; //定义访问标志数组(标识该顶点是否被访问过) int visited[MAX_VERTEX_NUM]={0}; // 创建图,输入信息包括(图的定点数,边数,图的种类,及每条边的起始,结束位置) void CreateGraph(AdjList *adj,int *n) { int e,s,d; char str; cout<<"输入顶点数(n)和边数(e)\n"; cin>>*n>>e; adj->arcNun=*n; adj->vexNun=e; cout<<"选择图的类型有向图(D)无向图(U)\n"; cin>>str; //判断图的类型 switch(str) { case 'D': adj->kind=DG; break; case 'U': adj->kind=UDG; break; default : cout<<"没有此类型的图\n"; break; } EdgeNode *q=NULL; //初始化n个表头结点 for(int i=1;i<=*n;i++) { cout<<"输入第"<<i<<"个结点的信息\n"; cin>>adj->vertex[i].data; adj->vertex[i].link=NULL; } for(i=1;i<=e;i++) { cout<<"请输入边的起始与目的位置\n"; cin>>s>>d; q=(EdgeNode *)malloc(sizeof(EdgeNode)); if(q==NULL) return; q->adjvex=d; q->next=adj->vertex[s].link; adj->vertex[s].link=q; } } void visit(AdjList *adjlist,int v0) { cout<<adjlist->vertex[v0].data<<endl; } //深度遍历图 void DepthFirstAdjList(AdjList *adjlist,int v0) { visit(adjlist,v0);visited[v0]=1; EdgeNode *q=adjlist->vertex[v0].link; while(q!=NULL) { if(!visited[q->adjvex]) { DepthFirstAdjList(adjlist,q->adjvex); } q=q->next; } } int main() { int n; AdjList * adj=(AdjList *)malloc(sizeof(AdjList)); CreateGraph(adj,&n); DepthFirstAdjList(adj,1); return 0; }
邻接表表示图DFS
最新推荐文章于 2022-05-31 20:53:36 发布