数据结构:实验六:图的操作

一、    实验目的

(1)掌握图的邻接矩阵和邻接表存储结构。

(2)熟练图的邻接表的基本运算。

(3)加深图的深度优先遍历算法和广度优先遍历算法的理解

二、  实验要求

有下图所示的带权有向图及其对应的邻接矩阵,编写一个程序exp7-1.c,实现图的各种基本运算和下面main函数中的每一步功能。

(1)依据所给的邻接矩阵,创建图的邻接表存储,并输出邻接表结构;

(2)输出从顶点0出发的一个深度优先遍历序列

(3)输出从顶点0出发的一个广度优先遍历序列

(4)销毁图的邻接表。

三、实验环境

Windows+DEV C++( 或者其他编译工具)

四、实验步骤及结果 

1.类型声明

typedef char VertexType[10];//顶点的数据类型//声明邻接矩阵类型typedef struct vertex//顶点{int adjvex;//邻接点域VertexType data;//顶点信息} VType;//顶点的类型typedef struct graph//图表{int n,e;//顶点数、边数VType vexs[MAXV];//存放顶点信息int edges[MAXV][MAXV];//邻接矩阵数组} MatGraph;//完整的图邻接矩阵类型//声明邻接表类型typedef struct ANode//边结点{int adjvex;//该边的邻接点编号int weight;//该边的相关信息,例如权值(这里用整型表示)struct ANode *nextarc;//指向下一条边的指针} ArcNode;//边结点的类型typedef struct Vnode //头结点{VertexType data;//顶点信息ArcNode *firstarc;//指向第一个边结点} VNode;// 邻接表的头结点类型typedef struct{int n,e;//图中顶点数n和边数eVNode adjlist[MAXV];//邻接表的头结点数组} AdjGraph;

2.图的基本运算在链式存储结构上的实现

void DestroyGraph(AdjGraph *&g)//销毁邻接表运算算法 {int i;ArcNode *pre,*p;for (i=0;i<g->n;i++)// 遍历所有的单链表{pre=g->adjlist[i].firstarc;//p指向第i个单链表的头结点if (pre!=NULL){p=pre->nextarc;while (p!=NULL) //释放第i个单链表的所有边结点{free(pre);pre=p;p=p->nextarc;}free(pre);//释放头结点数组}}free(g);}void DispGraph(AdjGraph *g)//输出邻接表g运算算法{ArcNode *p;int i;for (i=0;i<g->n;i++){printf("  [%2d]",i);p=g->adjlist[i].firstarc;if (p!=NULL)printf("→");while (p!=NULL){printf("%d(%d)",p->adjvex,p->weight);p=p->nextarc;}printf("\n");}}

3. 程序exp7-1.c的设计,及完成实验要求中的功能

#include <iostream>using namespace std;#include <stdlib.h>#define MAXV 100//定义最大顶点数#define INF 32767//定义无穷大#include <stdio.h>int visited[MAXV];//访问标志数组int visited1[MAXV];typedef char VertexType[10];//顶点的数据类型//声明邻接矩阵类型typedef struct vertex//顶点{int adjvex;//邻接点域VertexType data;//顶点信息} VType;//顶点的类型typedef struct graph//图表{int n,e;//顶点数、边数VType vexs[MAXV];//存放顶点信息int edges[MAXV][MAXV];//邻接矩阵数组} MatGraph;//完整的图邻接矩阵类型//声明邻接表类型typedef struct ANode//边结点{int adjvex;//该边的邻接点编号int weight;//该边的相关信息,例如权值(这里用整型表示)struct ANode *nextarc;//指向下一条边的指针} ArcNode;//边结点的类型typedef struct Vnode //头结点{VertexType data;//顶点信息ArcNode *firstarc;//指向第一个边结点} VNode;// 邻接表的头结点类型typedef struct{int n,e;//图中顶点数n和边数eVNode adjlist[MAXV];//邻接表的头结点数组} AdjGraph;void CreateGraph1(MatGraph &G,int A[][MAXV],int n,int e) //建立邻接矩阵运算算法{int i,j;G.n=n;G.e=e;for (i=0;i<n;i++)for (j=0;j<n;j++)G.edges[i][j]=A[i][j];}void DestroyGraph1(MatGraph G)//销毁邻接矩阵运算算法{}void DispGraph1(MatGraph G)//输出邻接矩阵运算算法{int i,j;for (i=0;i<G.n;i++){for (j=0;j<G.n;j++)if (G.edges[i][j]<INF)printf("%4d",G.edges[i][j]);elseprintf("%4s","∞");printf("\n");}}int Degree1(MatGraph G,int v)//有向图邻接矩阵顶点度运算算法{int i,d1=0,d2=0,d;if (v<0 || v>=G.n)return -1;for (i=0;i<G.n;i++)if (G.edges[v][i]>0&&G.edges[v][i]<INF)d1++;for (i=0;i<G.n;i++)if (G.edges[i][v]>0&&G.edges[i][v]<INF)d2++;d=d1+d2;return d;}void DFS1(MatGraph G,int v)//邻接矩阵存储的深度优先遍历序列{int w;printf("%d",v);visited1[v]=1;for (w=0;w<G.n;w++)if (G.edges[v][w]!=0&&G.edges[v][w]!=INF&&visited1[w]==0)DFS1(G,w);}void BFS1(MatGraph G,int v)//邻接矩阵存储的广度优先遍历序列{int i,w;int Qu[MAXV],front=0,rear=0;for (i=0;i<G.n;i++) visited1[i]=0;printf("%d",v);visited1[v]=1;rear=(rear+1)%MAXV;Qu[rear]=v;while (front!=rear){front=(front+1)%MAXV;w=Qu[front];for (i=0;i<G.n;i++)if (G.edges[w][i]!=0&&G.edges[w][i]!=INF&&visited1[i]==0){printf("%d",i);visited1[i]=1;rear=(rear+1)%MAXV;Qu[rear]=i;}}}void CreateGraph(AdjGraph *&g,int A[][MAXV],int n,int e)//建立邻接表运算算法{int i,j;ArcNode *p;g=(AdjGraph *)malloc(sizeof(AdjGraph));//动态分配空间g->n=n;g->e=e;for (i=0;i<g->n;i++)//所有的头结点指针置为空g->adjlist[i].firstarc=NULL;for (i=0;i<g->n;i++)//遍历邻接矩阵for (j=g->n-1;j>=0;j--)if (A[i][j]>0&&A[i][j]<INF)//存在一条边<i,j>{p=(ArcNode *)malloc(sizeof(ArcNode));//创建一个结点pp->adjvex=j;//存放邻接点p->weight=A[i][j];//存放权p->nextarc=g->adjlist[i].firstarc;//采用头插法插入结点pg->adjlist[i].firstarc=p;}}void DestroyGraph(AdjGraph *&g)//销毁邻接表运算算法 {int i;ArcNode *pre,*p;for (i=0;i<g->n;i++)// 遍历所有的单链表{pre=g->adjlist[i].firstarc;//p指向第i个单链表的头结点if (pre!=NULL){p=pre->nextarc;while (p!=NULL) //释放第i个单链表的所有边结点{free(pre);pre=p;p=p->nextarc;}free(pre);//释放头结点数组}}

4.实验结果截图

如需源文件,请私信作者,无偿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/5599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工程记录】Python爬虫入门记录(Requests BeautifulSoup)

目录 写在前面1. 环境配置2. 获取网页数据3. 解析网页数据4. 提取所需数据4.1 简单提取4.2 多级索引提取 5. 常见问题 写在前面 仅作个人学习与记录用。主要整理使用Requests和BeautifulSoup库的简单爬虫方法。在进行数据爬取时&#xff0c;请确保遵守相关法律法规和网站的服务…

Ubuntu安装Neo4j

Ubuntu&#xff08;在线版&#xff09; 更新软件源 sudo apt-get update 添加Neo4j官方存储库 wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo deb https://debian.neo4j.com stable latest | su…

二分图--判定以及最大匹配

水了个圈钱杯省一&#xff0c;不过估计国赛也拿不了奖&#xff0c;但还是小小挣扎一下。 什么是二分图&#xff1a;G(V,E)是一个无向图&#xff0c;若顶点V可以分为两个互不相交的子集A,B&#xff0c;并图中的每一条边&#xff08;i,j)所关联的ij属于不同的顶点集&#xff0c;…

Java image-processing 包依赖错误

错误的信息为&#xff1a; [ERROR] Failed to execute goal on project image-processing: Could not resolve dependencies for project com.ossez:image-processing:jar:0.0.2-SNAPSHOT: Failed to collect dependencies at org.openimaj:core-image:jar:1.3.10 -> org.op…

spring-boot示例

spring-boot版本&#xff1a;2.0.3.RELEASE 数据库: H2数据库 &#xff08;嵌入式内存性数据库&#xff0c;安装简单&#xff0c;方便用于开发、测试&#xff0c;不适合用于生产&#xff09; mybatis-plus框架&#xff0c;非常迅速开发CRUD

SpringMVC整体工作流程

. 用户发起一个请求&#xff0c;请求首先到达前端控制器前端控制器接收到请求后会调用处理器映射器&#xff0c;由此得知&#xff0c;这个请求该由哪一个Controller来进行处理(并未调用Controller)&#xff1b;前端控制器调用处理器适配器&#xff0c;告诉处理器适配器应该要…

Macos安装OrbStack

什么是OrbStack OrbStack 是一种在 macOS 上运行容器和 Linux 机器的快速、轻便和简单方法。它是 Docker Desktop 和 WSL 的超强替代品&#xff0c;所有这些都在一个易于使用的应用程序中。 在Macos M系列芯片上&#xff0c;经常遇到docker镜像不兼容的问题&#xff0c;此时使…

ubuntu的镜像源+bionic版本

首先第一步 查找和你自己ubuntu版本匹配的版本号 匹配代号如下 在终端输入lsb_release -a查看自己系统上的版本号 可以看到我这个版本号的代号是bionic。 每个版本的镜像文件都是有规律的。 bionic版本的源如下 # 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic ma…

Linux内核之页面映射到虚拟地址:insert_page用法实例(六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

vscode连接阿里云 无法连接

如果是首次连接&#xff0c;需要在阿里云控制台下 点击重置密码 同时注意在重置密码页面最下方&#xff0c;有开启密码登录选项

Nginx实现端口转发与负载均衡配置

前言&#xff1a;当我们的软件体系结构较为庞大的时候&#xff0c;访问量往往是巨大的&#xff0c;所以我们这里可以使用nginx的均衡负载 一、配置nginx实现端口转发 本地tomcat服务端口为8082 本地nginx端口为8080 目的&#xff1a;将nginx的8080转发到tomcat的8082端口上…

SOLIDWORKS DRAFTSIGHT 2024新功能Top10

SOLIDWORKS 2024 以更加强大的姿态亮相&#xff0c;帮助您重塑设计。为了助力您简化和加快由概念到成品的产品开发流程&#xff0c;SOLIDWORKS 2024 涵盖全新以用户为中心的增强功能&#xff0c;致力帮您实现更智能、更快速地与您的团队和外部合作伙伴协同工作&#xff0c;下面…

C语言 循环语句 (1) 讲述循环概念演示while语句

接下来 我们来说 循环控制结构 循环的基本原理及循环语句 再说原理之前 我们 先来看几个案例 要求是 让用户在键盘中输入三个整数 然后将这些整数求和 这个用我们之前的知识就能轻松搞定 #define _CRT_SECURE_NO_WARNINGS//禁用安全函数警告 #pragma warning(disable:6031)…

MyBatis(XML映射器操作)

文章目录 XML映射器操作&#xff08;XxxMapper.xml&#xff09;文件目录1.基本介绍1.优点2.常用顶级元素 2.环境配置1.在原来的父模块下创建一个子模块2.删除没用的两个文件夹3.创建基本目录4.父模块的pom.xml5.jdbc.properties6.mybatis-config.xml7.测试使用MonsterMapperTes…

FSNotes for Mac v6.7.1中文激活:轻量级笔记管理工具

FSNotes for Mac&#xff0c;一款专为Mac用户打造的轻量级笔记管理工具&#xff0c;让您的笔记管理变得简单而高效。 FSNotes for Mac v6.7.1中文激活版下载 它采用Markdown文件格式&#xff0c;让您轻松创建和编辑富文本笔记&#xff0c;无需担心格式问题。同时&#xff0c;FS…

C++ | Leetcode C++题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> generateMatrix(int n) {int num 1;vector<vector<int>> matrix(n, vector<int>(n));int left 0, right n - 1, top 0, bottom n - 1;while (left < r…

十一、大模型-Semantic Kernel与 LangChain 的对比

Semantic Kernel 与 LangChain 的对比 Semantic Kernel 和 LangChain 都是用于开发基于大型语言模型&#xff08;LLM&#xff09;的应用程序的框架&#xff0c;但它们各有特点和优势。 基本概念和目标 Semantic Kernel 是一个由微软开发的轻量级 SDK&#xff0c;旨在帮助开发…

STM32标准库控制一盏LED闪烁

实物连接&#xff1a; ## 软件编程&#xff1a;默认已经有一个工程模板&#xff0c;代码实现逻辑&#xff1a; 1、使用RCC开启GPIO的时钟&#xff1b; 2、使用GPIO初始化函数实现初始化GPIO 3、使用输入或输出的函数控制GPIO口 #include "stm32f10x.h" …

Android(Java)项目支持Kotlin语言开发

Android&#xff08;Java&#xff09;项目通过相关Kotlin设置后&#xff0c;允许同时使用Java语言和Kotlin语言进行开发代码的。 示例环境&#xff1a; Android Studio Giraffe | 2022.3.1 Patch 3 Java 8 Kotlin 1.9.20 设置Kotlin选项&#xff1a; 第一步&#xff1a;在项…

数据链路层(计算机网络)

0、前言 本文大多数图片都来自于 B站UP主&#xff1a;湖科大教书匠 的教学视频&#xff0c;对高军老师及其团队制作出这么优质的课程表示感谢。本文的撰写目的不是为了应试&#xff0c;且受限于个人水平&#xff0c;可能和标准答案有所出入&#xff0c;请自行甄别&#xff0c;…