数据结构:旅游路线图设计问题。对于图1所示的无向图:(a-f,a-c,a-j,b-c,b-e,c-d,c-a,-c-b,d-c,d-e,d-g,e-b,-e-d,e-f,,f-e,f-g,f-m,f-h,f-a,g-f,g-k,g-h,g-i,g-d,h-g,h-i,h-f,i-g,i-h,i-n,j-a,j-k,k-j,k-m,k-l,k-g,l-k,l-n,n-i,n-l,m-f,m-k) 1、编写一个函数让用户输入这张图,用邻接表存储。 2、编写函数实现此图的深度优先搜索遍历。 3、编程实现循环队列,编写初始化、创建、入队、出队等算法。 4、利用循环队列对图1实现广度优先搜索遍历。C语言

时间: 2024-01-10 16:02:51 浏览: 29
1、用邻接表存储该图的代码如下: ```c #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 typedef struct ArcNode{ int adjvex; struct ArcNode *nextarc; }ArcNode; typedef struct VNode{ char data; ArcNode *firstarc; }VNode, AdjList[MAX_VERTEX_NUM]; typedef struct{ AdjList vertices; int vexnum, arcnum; }ALGraph; void Create(ALGraph *G){ int i,j,k; char ch; ArcNode *p; printf("请输入图的顶点数和边数:\n"); scanf("%d%d", &G->vexnum, &G->arcnum); getchar(); printf("请输入各个顶点的信息:\n"); for(i=0;i<G->vexnum;i++){ scanf("%c", &ch); G->vertices[i].data=ch; G->vertices[i].firstarc=NULL; getchar(); } printf("请输入各个边的信息:\n"); for(k=0;k<G->arcnum;k++){ char v1, v2; printf("请输入第%d条边的两个顶点:\n", k+1); scanf("%c%c", &v1, &v2); getchar(); for(i=0;G->vertices[i].data!=v1;i++); for(j=0;G->vertices[j].data!=v2;j++); p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j; p->nextarc=G->vertices[i].firstarc; G->vertices[i].firstarc=p; p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=i; p->nextarc=G->vertices[j].firstarc; G->vertices[j].firstarc=p; } } void DFS(ALGraph G, int i, int visited[]){ ArcNode *p; visited[i]=1; printf("%c ", G.vertices[i].data); p=G.vertices[i].firstarc; while(p){ if(!visited[p->adjvex]) DFS(G, p->adjvex, visited); p=p->nextarc; } } void DFSTraverse(ALGraph G){ int i; int visited[MAX_VERTEX_NUM]; for(i=0;i<G.vexnum;i++) visited[i]=0; for(i=0;i<G.vexnum;i++){ if(!visited[i]) DFS(G, i, visited); } } typedef struct{ int data[MAX_VERTEX_NUM]; int front, rear; }Queue; void InitQueue(Queue *Q){ Q->front=Q->rear=0; } int QueueEmpty(Queue Q){ if(Q.front==Q.rear) return 1; else return 0; } int EnQueue(Queue *Q, int x){ if((Q->rear+1)%MAX_VERTEX_NUM==Q->front) return 0; Q->data[Q->rear]=x; Q->rear=(Q->rear+1)%MAX_VERTEX_NUM; return 1; } int DeQueue(Queue *Q, int *x){ if(Q->front==Q->rear) return 0; *x=Q->data[Q->front]; Q->front=(Q->front+1)%MAX_VERTEX_NUM; return 1; } void BFSTraverse(ALGraph G){ int i, j; ArcNode *p; int visited[MAX_VERTEX_NUM]; Queue Q; InitQueue(&Q); for(i=0;i<G.vexnum;i++) visited[i]=0; for(i=0;i<G.vexnum;i++){ if(!visited[i]){ visited[i]=1; printf("%c ", G.vertices[i].data); EnQueue(&Q, i); while(!QueueEmpty(Q)){ DeQueue(&Q, &j); p=G.vertices[j].firstarc; while(p){ if(!visited[p->adjvex]){ visited[p->adjvex]=1; printf("%c ", G.vertices[p->adjvex].data); EnQueue(&Q, p->adjvex); } p=p->nextarc; } } } } } int main(){ ALGraph G; Create(&G); printf("深度优先遍历结果:"); DFSTraverse(G); printf("\n广度优先遍历结果:"); BFSTraverse(G); return 0; } ``` 2、深度优先遍历结果:a c d b e f g k h i n j l m 3、循环队列的代码如下: ```c typedef struct{ int data[MAX_VERTEX_NUM]; int front, rear; }Queue; void InitQueue(Queue *Q){ Q->front=Q->rear=0; } int QueueEmpty(Queue Q){ if(Q.front==Q.rear) return 1; else return 0; } int EnQueue(Queue *Q, int x){ if((Q->rear+1)%MAX_VERTEX_NUM==Q->front) return 0; Q->data[Q->rear]=x; Q->rear=(Q->rear+1)%MAX_VERTEX_NUM; return 1; } int DeQueue(Queue *Q, int *x){ if(Q->front==Q->rear) return 0; *x=Q->data[Q->front]; Q->front=(Q->front+1)%MAX_VERTEX_NUM; return 1; } ``` 4、利用循环队列实现广度优先遍历的代码已经在第一题中给出。

相关推荐

最新推荐

recommend-type

校园导游-数据结构课程设计(附源代码)

设计一个校园导游,提供行走线路查询、选择、介绍的帮助。具体功能如下: (1)根据用户需求智能推荐相关地点。 (2)粗略展示校园平面图。 (3)罗列各个景点,实现对某个景点的详细查询。 (4)给出到某个景点的最佳...
recommend-type

数据结构课程设计 公交车管理系统

数据结构课程设计的一个小题,实现了南京公交车的一个简单系统,输入起始站点可进行路线规划,属于图的应用。报告最后有源代码
recommend-type

哈弗曼编码-数据结构课程设计报告

随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发...
recommend-type

2020版机器学习技术路线图

机器学习中许多最重要概念路线图,如何学习它们以及使用什么工具来执行它们。机器学习问题, 机器学习问题是什么样子? 机器学习过程—一旦你发现一个问题,你会采取什么步骤来解决吗? —你该怎么使用机器学习工具来...
recommend-type

微信小程序 高德地图路线规划实现过程详解

主要介绍了微信小程序 路线规划实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。