#include<iostream>
using namespace std;
#define Vnum 100 //顶点个数的最大值
typedef struct EdgeNode
{
int adjvex; //弧的指向顶点
struct EdgeNode *next;
}*edgeptr;
typedef struct
{
int vertex;
edgeptr link;
}VexNode;
typedef VexNode Adj_List[Vnum];
void build_adjlist(Adj_List& g)
{
int n,e;
cin>>n>>e; //顶点数和边数
int x,y;
edgeptr p;
for(int i = 1; i <= n; i++)
{
g[i].vertex = i;
g[i].link = NULL;
}
for(int k = 0; k < 2*e; k++) //无向图
{
cin>>x>>y; //读入顶点对<x,y>
p = new EdgeNode;
p->adjvex = y;
p->next = g[x].link;
g[x].link = p;
}
}
int Visited0[Vnum]; //标记是否访问过
void dfs(Adj_List g, int v0) //深度优先
{
edgeptr p;
cout<<v0<<" ";
Visited0[v0] = 1;
p = g[v0].link;
while(p != NULL)
{
if(Visited0[p->adjvex] == 0)
dfs(g,p->adjvex);
p = p->next;
}
}
int Visited1[Vnum]; //标记是否访问过
void bfs(Adj_List g, int v0) //广度优先
{
int f,r;
f = 0;
r = 0;
int Q[Vnum];
edgeptr p;
p = g[v0].link;
Visited1 [v0] = 1;
cout<<v0<<" ";
int v;
do
{
while(p != NULL)
{
v = p->adjvex;
if(Visited1[v] == 0)
{
r++;
Q[r] = v;
cout<<v<<" ";
Visited1[v] = 1;
}
p = p->next; //找某一顶点的所有邻接点并进队
}
if(f != r)
{
f++;
v = Q[f];
p = g[v].link;
}
}while((p != NULL) || (f != r));
}
int main()
{
Adj_List g;
build_adjlist(g);
dfs(g, g[1].vertex);
cout<<endl;
bfs(g, g[1].vertex);
cout<<endl;
return 0;
}
C++实现数据结构图
最新推荐文章于 2024-08-28 16:41:30 发布