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

一、    实验目的

(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和边数e

 VNode 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和边数e

 VNode 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]);

   else

    printf("%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));//创建一个结点p

    p->adjvex=j;//存放邻接点

    p->weight=A[i][j];//存放权

    p->nextarc=g->adjlist[i].firstarc;//采用头插法插入结点p

    g->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.mfbz.cn/a/580221.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python时序预测系列】麻雀算法(SSA)优化LSTM实现单变量时间序列预测(源码)

这是我的第269篇原创文章。 一、引言 麻雀算法&#xff08;Sparrow Search Algorithm&#xff0c;SSA&#xff09;是一种基于麻雀群体行为的算法&#xff0c;它可以用来优化深度学习模型中的参数。在优化LSTM模型时&#xff0c;可以通过麻雀算法来调整LSTM的参数&#xff0c;以…

亚马逊测评的目的是什么?

测评的目的&#xff1a;店铺销量、留评 特别是新品&#xff0c;一个产品销量很低也没什么评价的产品&#xff0c;很难说服真实买家们&#xff0c;因为同类目还有其他的选择&#xff0c;不管是谁都不愿意当小白鼠的&#xff0c;而且打造爆款&#xff0c;提升产品权重这些都离不…

【华为】SVI接口实验配置

【华为】SVI接口实验配置 拓扑实验要求设备核心交换机PCPC1PC2 查看VLAN验证 配置文档 拓扑 实验要求 一台三层交换机&#xff0c;两台PC PC1 和 PC2 静态获取地址&#xff0c;并处于不同VLAN 然后PC的网关是处在三层交换机LSW1身上&#xff0c;不同VLAN就是处在不同网段&…

Jenkins - macOS 上安装

文章目录 关于 JenkinsmacOS 上安装 Jenkins方式一&#xff1a;brew方式二&#xff1a;tomcat Jenkins war 关于 Jenkins 官网上下载Jenkins并将其安装到持续集成服务器 https://jenkins.io/download/ macOS 上安装 Jenkins 现在本 macOS 上测试 https://www.jenkins.io/do…

HarmonyOS 应用开发——入门

首先当然是华为的官方文档了&#xff0c;要认真学习: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/start-overview-0000001478061421-V2 不想花时间看&#xff0c;可以看我下面总结的干货&#xff0c;哈哈 第一个问题&#xff1a;stage架构和fa架构的区…

MySql 导出导入(备份还原)

1&#xff0c;导出备份 要导出MySQL数据库中的数据&#xff0c;使用mysqldump命令。假设要导出名为mydatabase的数据库到名为backup.sql的文件中&#xff1a; mysqldump -u 用户名 -p 数据库名 > backup.sql 参数说明&#xff1a; -u mysql用户名称 -p 执行后会要求输入…

文献阅读:全皮层原位测序揭示了输入依赖区域的身份

文献介绍 「文献题目」 Whole-cortex in situ sequencing reveals input-dependent area identity 「研究团队」 Anthony M. Zador&#xff08;美国冷泉港实验室&#xff09; 「发表时间」 2024-04-24 「发表期刊」 Nature 「影响因子」 64.8 「DOI」 10.1038/s41586-024-0…

LeetCode39题: 组合总和(原创)

【题目描述】 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复…

回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测

回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测 目录 回归预测 | Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现NGO-ESN北方苍鹰算法优化回声状态网络…

C++(Qt)软件调试---crashpad捕获崩溃(19)

C(Qt)软件调试—crashpad捕获崩溃&#xff08;19&#xff09; 文章目录 C(Qt)软件调试---crashpad捕获崩溃&#xff08;19&#xff09;1、概述2、资源地址3、配置环境4、解决报错5、测试代码6、测试结果7、Qt中使用crashpad 更多精彩内容&#x1f449;个人内容分类汇总 &#x…

mysql 开启远程连接

登录到mysql mysql -uroot -p 打开mysql数据库并查询user表 use mysql; select user, host from user;更改需要远程连接数据库为任何ip 可以连接&#xff0c; 并刷新系统权限相关的表 update user set host% where hostlocalhost and userroot; flush privileges;

测评与广告双管齐下:敦煌网卖家如何结合自养号实现快速出单

敦煌网作为中国领先的B2B跨境电商平台&#xff0c;为卖家提供了广阔的市场和丰富的资源&#xff0c;但为何有些卖家却难以获得订单呢?下面的内容中&#xff0c;帮助卖家快速出单。 一、如何快速出单? 1、优化产品详情页&#xff1a;产品详情页是吸引买家下单的关键页面。卖…

Shell脚本编写-猜测当前系统是哪个发行版

1、编写脚本 该脚本会确定当前系统中可用的包管理器。同时还以已安装的软件包管理器为指导&#xff0c;猜测当前系统是基于哪个 Linux 发行版。 #!/bin/bash #检查当前系统的可用包管理器&#xff0c;以安装的软件包管理器为指导&#xff0c;猜测当前的系统是基于哪个Linux发行…

顺序表常用操作实现算法

查找操作 插入操作 删除操作 小结 参考附录模拟代码&#xff1a; #include <iostream> const int maxn200; //顺序表 typedef struct{//定义静态类型 int num[maxn];// 装数数组 int len;//记录长度 }sqlist; typedef struct{//定义动态类型 int *num;int len; }sqlist…

XYCTF 2024

本博客仅为记录解题的过程&#xff01; MISC game google识图 XYCTF{Papers Please} 熊博士 XYCTF{liu_ye_mei_you_xiao_jj} 疯狂大杂烩&#xff01;九转功成 在远古时期&#xff0c;修仙过程被分为&#xff1a;炼气、筑基、结丹、元婴、化神、炼虚、合体、大乘、渡劫等九…

MOM是什么?

数字化时代&#xff0c;制造企业纷纷引入信息化系统工具来实现数字化转型升级&#xff0c;你可能对OA、CRM、ERP、MES耳熟能详&#xff0c;说起MOM&#xff0c;你了解吗&#xff1f;今天小编跟你一起认识下它。 MOM是什么&#xff1f; MOM&#xff08;制造运营管理&#xff09…

泰迪智能科技受邀参加2024年粤港澳大湾区产教融合技能人才培养联盟理事会会议

4月24日下午&#xff0c;2024年粤港澳大湾区产教融合技能人才培养联盟&#xff08;以下简称联盟&#xff09;理事会会议在白云区成功举办。 会议由广州市人力资源和社会保障局、广州市发展和改革委员会、广州市教育局、广州市工业和信息化局、广州市总工会等单位指导&#xff…

面经总结(二)(数据库)

数据库常识&#xff1a; 1、数据库系统包含什么&#xff1f; 包含了数据库、数据库管理系统、数据库管理员和应用程序。 数据库&#xff08;DB)&#xff1a;顾名思义是存放数据的仓库&#xff0c;实现数据的持久化。 数据库管理系统&#xff08;DBMS)&#xff1a;类似于操作系…

winrar压缩时排除指定目录排除所有子目录下的目录名称排除所有不需要的目录减小备份体积移除中间目录惊喜

winrar排除指定目录所有指定目录 说明(废话)解决方1. 打开 WinRAR。2. 导航到你要压缩的目录&#xff0c;然后选择该目录中的文件或文件夹。3. 点击“添加”按钮。4. 在弹出的“压缩文件名和参数”窗口中&#xff0c;切换到“文件”标签页。5. 在“文件”标签页中&#xff0c;找…

Topaz Gigapixel AI v7.1.2激活版:智能图像增强与放大

Topaz Gigapixel AI&#xff0c;这款基于人工智能技术的图像处理软件&#xff0c;以其卓越的功能和高效的性能&#xff0c;为图像处理领域注入了新的活力。 Topaz Gigapixel AI v7.1.2激活版下载 作为一款专注于图像增强与放大的软件&#xff0c;Topaz Gigapixel AI利用深度学习…
最新文章