关于创建图和深度遍历图的相关代码(图使用的是邻接表方式存储)

//图的相关操作
#include<stdio.h>
#include<stdlib.h>
typedef int Dtype;
#define MAXVEX 20
#define INFINITY 32768
int visited[MAXVEX] = { 0 }; //需要一个辅助数组visited来确定已被访问的元素(注: 0号元素不用)
typedef struct ArcNode //定义一个邻接表的邻接点结构体变量
{
int Adjvex; //Adjvex表示数组下标
struct ArcNode *next; //指向下一个节点的指针
}ArcNode;

typedef struct VertexNode //此结构体定义邻接表的数组和指向下一个邻接点的指针
{
Dtype Adjdata;
ArcNode *first;
}VertexNode;

typedef struct
{
VertexNode vertex[MAXVEX];
int vexnum; //图G中的顶点个数
int arcnum; //图G中的边的个数
}AdjList; //定义邻接表结构体变量

void CreatAdjList(AdjList G) //创建邻接多表
{
ArcNode p;
printf(“请输入图中顶点的个数:”);
scanf_s(“%d”,&G->vexnum);
printf(“请输入图中的边的个数:”);
scanf_s(“%d”,&G->arcnum);
G->vertex[0].Adjdata = 0;
G->vertex[0].first=NULL; //0号元素不使用,故此处值为零
for (int i = 1; i <= G->vexnum; i++) //0号元素不存
{
printf(“请输入第%d个顶点的值:\n”,i);
scanf_s(“%d”, &G->vertex[i].Adjdata); //此处的“ %d ”需要指出的是上面定义的数据类型假设为int型;
G->vertex[i].first = NULL; //将所有的first指针置空
}
for (int k = 1; k <= G->arcnum;k++)
{
int i,j;
printf(“请输入边(vi-vj)的对应的下标值:”);
scanf_s(“%d,%d”,&i,&j);
p = (ArcNode
)malloc(sizeof(ArcNode));
p->Adjvex = j;
p->next = G->vertex[i].first;
G->vertex[i].first = p;
p = (ArcNode
)malloc(sizeof(ArcNode));
p->Adjvex = i;
p->next = G->vertex[j].first;
G->vertex[j].first = p;
}
}

void visit(int v)
{
printf(“%d\t”, v);
}
//深度遍历
void DFS(AdjList *g, int i)
{
visit(g->vertex[i].Adjdata);
visited[i] = 1;
ArcNode *p;
p = g->vertex[i].first;
while §
{
if (visited[p->Adjvex] == 0)
DFS(g, p->Adjvex);
p = p->next;
}
}

//图的深度优先遍历 DFS遍历

void DFSTraverse(AdjList *g)
{
int i;
for (i = 1; i <= g->vexnum; i++)
visited[i] = 0;
for (i = 1; i <= g->vexnum; i++)
{
if (visited[i] == 0)
{
DFS(g,i);
}
}
}

int main()
{
AdjList G;
CreatAdjList(&G);
DFSTraverse(&G);
}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/weixin_43529092/article/details/85952679
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞