实验六 图及其应用

本篇博客主要介绍如何设计并验证带权图的邻接表表示,包括无向图的广度优先搜索(BFS)和有向图的深度优先搜索(DFS)。内容涉及算法设计,并提供了参考代码的头文件部分,源代码可在给出的链接中查看。
摘要由CSDN通过智能技术生成

2.(必做题)设计并验证如下算法:带权图采用邻接表表示,实现无向图的广度优先搜索与有向图的深度优先搜索。

#define MAX_VERTEX_NUM 20	//图的邻接表存储表示
typedef struct ArcNode {
   
	int adjvex; 	//该弧所指向的顶点的位置
	struct ArcNode *nextarc; 	//指向下一条弧的指针
	InfoType *info; 	//该弧相关信息的指针
} ArcNode;
typedef struct VNode {
   
	VertexType data; 	//顶点信息
	ArcNode *firstarc; 	//指向第一条依附该顶点弧的指针
} VNode,AdjList[MAX_VERTEX_NUM]
typedef struct {
   
	AdjList vertices;
	int vexnum,arcnum; 	//图的当前顶点数和弧数
	int kind; 	//图的种类标志
} ALGraph;

抄来的参考代码,要分离队列头文件和源程序

#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define QElemType int
#include "Queue.h"
//图的邻接表存储表示
typedef char VertexType;    //顶点信息abcde
typedef int InfoType;		//InfoType代表权值w类型

typedef struct ArcNode {
   
	int adjvex; 	//该弧所指向的顶点的位置
	struct ArcNode *nextarc; 	//指向下一条弧的指针
	InfoType *info;	//该弧相关信息的指针
} ArcNode;

typedef struct VNode {
   
	VertexType data; 	//顶点信息
	ArcNode *firstarc; 	//指向第一条依附该顶点弧的指针
} VNode,AdjList[MAX_VERTEX_NUM];
typedef struct {
   
	AdjList vertices;
	int vexnum,arcnum; 	//图的当前顶点数和弧数
	int kind; 	//图的种类标志
} ALGraph;
void Graph_Create();
void Graph_Create_UDG(ALGraph *G);
void Graph_Create_DG(ALGraph *G);
void Graph_print(ALGraph G);
void dfs(int u,int *mark,ALGraph G);
void dfs_init(ALGraph G);
void bfs(ALGraph G);
ArcNode *nextAdjvex(ALGraph G,ArcNode *v,ArcNode *w);
ArcNode *FiestAdjvex(ALGraph G,QElemType v);
int main() {
   
	Graph_Create();
	return 0;
}
void Graph_Create() {
   
	do {
   
		ALGraph g;
		printf("\n输入数字来确定你要选择的图的种类(1.无向图,2.有向图)\n");
		scanf("%d",&g.kind);
		switch(g.kind) {
   
			case 0:
				return;
			case 1:
				printf("无向图BFS遍历:\n");
				Graph_Create_UDG(&g);
				Graph_print(g);
				bfs(g);
				break;
			case 2:
				printf("有向图DFS遍历:\n");
				Graph_Create_DG(&g);
				Graph_print(g);
				printf("深度搜索:\n");
				dfs_init(g);
				break;
			default:
				printf("错误输入!\n重试\n");
				break;
		}
	} while(1);
}
void Graph_Create_UDG(ALGraph *G) {
    //UDG 无向图
	int i,u,v,w;
	ArcNode* add;
	printf("请输入无向图的顶点数,边数:");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	getchar();
	printf("请输入%d个顶点的信息:",G->vexnum);
	for(i=0; i<G->vexnum; i++) {
   
		scanf("%c",&G->vertices[i].data);
		G->vertices[i].firstarc = NULL;	//头节点初始化
	}
	printf("请依次输入%d条边的信息:\n",G->arcnum);
	for(i=0; i<G->arcnum; i++) {
   			//依次读取m条边的信息
		scanf("%d %d %d",&u,&v,&w);

		add = (ArcNode*)malloc(sizeof(ArcNode)); //构造 u->v 这条边
		add->adjvex = v;
		add->info = (InfoType*) malloc(sizeof(InfoType));
		*add->info = w;
		add->nextarc = G->vertices[u].firstarc;
		G->vertices[u].firstarc = add;

		//无向图 ,相对称,则构造v->u这条边
		add = (ArcNode*)malloc(sizeof(ArcNode));
		add->adjvex = u;
		add->info = (InfoType*) malloc(sizeof(InfoType));
		*add->info = w;
		add->nextarc = G->vertices[v].firstarc;
		G->vertices[v].firstarc = add;
	}
}
void Graph_Create_DG(ALGraph *G) {
    //DG 有向图
	int i,u,v,w;
	ArcNode* add;
	printf("请输入有向图的顶点数,边数:");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	getchar();
	printf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值