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

server/2024/9/25 0:29:21/

一、    实验目的

(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.ppmy.cn/server/20357.html

相关文章

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(十)

探索和构建 LLaMA 3 架构&#xff1a;深入探讨组件、编码和推理技术&#xff08;十&#xff09; Llama 推理 为了对模型进行推理&#xff0c; 需要从Meta的LLaMA 3仓库下载模型的权重。 编写模型推理的代码。在推理模型时&#xff0c;有许多可调参数需要考虑&#xff0c;包括…

MySQL数据库安装——zip压缩包形式

安装压缩包zip形式的 MySQL 8数据库 一 、先进入官网下载 https://dev.mysql.com/downloads/mysql/ 二、解压到某个文件夹 我解压到了D:\mysql\mysql8 下面 然后在这个文件夹下手动创建 my.ini 文件和 data 文件夹 my.ini 内容如下&#xff1a; 注意 basedir 和 datadi…

【机器学习原理】决策树从原理到实践

基于树的模型是机器学习中非常重要的一类模型&#xff0c;最基础的就是决策树&#xff0c;本篇主要讲述决策树的原理和几类最常见的决策树算法&#xff0c;这也是更复杂的树模型算法的基础。 参考文章&#xff1a; 1.CSDN-基于熵的两个模型(ID3,C4.5)比较详细&#xff0c;有数字…

什么ISP是住宅IP,和普通IP有什么区别?

ISP&#xff08;Internet Service Provider&#xff09;即互联网服务提供商&#xff0c;是向广大用户综合提供互联网接入业务、信息业务和增值业务的电信运营商。住宅IP&#xff0c;也称为家庭IP&#xff0c;是指由ISP分配给家庭或个人用户的IP地址。这些IP地址是真实的&#x…

Qt——实现滚动条添加小组件自动跳转到最后

为了使滚动区域在您添加新的控件后自动滑动到底部&#xff0c;显示新增的窗口&#xff0c;您可以利用 Qt 的 QScrollArea 的滚动条进行调整。在您的 DWidget::toggleNewAdd 函数中&#xff0c;添加窗口到布局后&#xff0c;可以通过调整滚动区的滚动条到最大值来实现这一点。 …

GateWay具体的使用之全链路跟踪TraceId日志

1.创建全局过滤器&#xff0c;在请求头上带入traceId参数&#xff0c;穿透到下游服务. package com.by.filter;import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.jwt.JWTValidator;…

游戏新手村21:再谈游戏广告页面设计

前文我们说到了网页游戏的LandingPage页面设计中需要遵循的一些规范和注意事项&#xff0c;本章我们重点谈下网络游戏的广告页面设计。 之前在金山的时候&#xff0c;大家习惯或者喜欢称LandingPage为分流页&#xff0c;这个页面需要加入哪些游戏信息才能在短时间内俘获玩家的…

Int4:Lucene 中的更多标量量化

作者&#xff1a;来自 Elastic Benjamin Trent, Thomas Veasey 在 Lucene 中引入 Int4 量化 在之前的博客中&#xff0c;我们全面介绍了 Lucene 中标量量化的实现。 我们还探索了两种具体的量化优化。 现在我们遇到了一个问题&#xff1a;int4 量化在 Lucene 中是如何工作的以…