#include <bits/stdc++.h>
#define VSIZE 100
typedef int VType;
typedef bool EType;
int visited[VSIZE];//对这个结点是否访问先进判断,为0则的没被访问,为1则是被访问过
typedef struct ENode{ //边链表结点
int v;//顶点下标
struct ENode *next;//下一个顶点的指针
}ENode;
typedef struct VNode{ //顶点表结点
VType data; //顶点中的数据
ENode *first;//第一个边链表结点的指针
}VNode;
typedef struct AdjLGraph{
VNode vexs[VSIZE]; //顶点数组
int VNum;//顶点数
int ENum;//边数
}AdjLGraph;
void createAdjLGraph(AdjLGraph *g)//创建邻接表
{
printf("输入顶点数\n");
scanf("%d",&g->VNum);
printf("输入边的数\n");
scanf("%d",&g->ENum);
for(int i = 0;i < g->VNum;i++){
printf("输入第%d个顶点的值\n",i+1);
scanf("%d",&g->vexs[i].data);
g->vexs[i].first = NULL;
}
for(int k = 0;k < g->ENum;k++){
int i,j;
printf("输入哪两个点相连\n");
scanf("%d %d",&i,&j);
ENode *p = (ENode *)malloc(sizeof(ENode));
p->v = j-1;
p->next = g->vexs[i-1].first;
g->vexs[i-1].first = p;
p = (ENode *)malloc(sizeof(ENode));
p->v = i-1;
p->next = g->vexs[j-1].first;
g->vexs[j-1].first = p;
}
}
void DFS(AdjLGraph g,int i)
{
visited[i] = 1; //为了表示这个顶点被访问过,所有赋值为1
printf("%d\n",g.vexs[i].data);
ENode *p = g.vexs[i].first;
while(p){ //把和这顶点相连的所有顶点都访问一遍
if(visited[p->v] == 0){
DFS(g,p->v);
}
p = p->next;
}
}
void DFSTraverse(AdjLGraph g)//遍历邻接表
{
for(int i = 0;i < g.VNum;i++){
if(visited[i] == 0){ //如果为0则表示没有被访问过,那么就调动
DFS(g,i); //DFS
}
}
}
int main()
{
AdjLGraph g;//定义一个图
createAdjLGraph(&g);//创建邻接表
DFSTraverse(g);//遍历邻接表
return 0;
}
图的邻接表的深度优先搜索
猜你喜欢
转载自blog.csdn.net/weixin_42868863/article/details/88936919
今日推荐
周排行