#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-07-16 17:57:51 发布
1844

被折叠的 条评论
为什么被折叠?



