《数据结构与算法》-图的操作

//图的相关操作
#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 (p)
	{
		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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值