图的存储(邻接矩阵邻接表)

news/2025/4/1 3:23:07/

图的存储

文章目录

  • 图的存储
    • 1 邻接矩阵
      • 1.1 邻接矩阵存储结构定义
      • 1.2 完整代码应用
    • 2 邻接表
      • 2.1 邻接表存储结构定义
      • 2.2 完整代码应用

1 邻接矩阵

  1. A [ i ] [ j ] = 1 A[i][j]=1 A[i][j]=1 表示顶点i与顶点j邻接,即ij之间存在边或者弧。

  2. A [ i ] [ j ] = 0 A[i][j]=0 A[i][j]=0 表示顶点i与顶点j不邻接。 (0≤i,j≤n-1)

图1 图的邻接矩阵存储
a)无权图 b)有权图



1.1 邻接矩阵存储结构定义

#define MaxVertexNum 100  //顶点数目的最大值
typedef char VertexType;	//顶点的数据类型
typedef int EdgeType;	//带权图中边上权值的数据类型
typedef struct{VertexType Vex[MaxVertexNum];	//顶点表,用来存储顶点EdgeType Edge[MaxVertexNum][MaxVertexNum];  //邻接矩阵,边表,用来存储边int vexnum, arcnum;	//图的当前顶点数和弧数
}MGraph;

注意邻接矩阵表示法的空间复杂度为 O ( n 2 ) O(n^2) O(n2),其中n为图的顶点数 ∣ V ∣ |V| V



1.2 完整代码应用

以下图作为输入例子:

图2 无向图及其邻接矩阵



C++代码实现:
#include<iostream>//创建无向图的邻接矩阵
using namespace std;
#define MaxVnum 100  //顶点数最大值
typedef char VexType;  //顶点的数据类型,根据需要定义
typedef int EdgeType;  //边上权值的数据类型,若不带权值的图,则为0或1
typedef struct{VexType Vex[MaxVnum];EdgeType Edge[MaxVnum][MaxVnum];int vexnum,edgenum; //顶点数,边数
}AMGraph;int locatevex(AMGraph G,VexType x){for(int i=0;i<G.vexnum;i++)//查找顶点信息的下标if(x==G.Vex[i])return i;return -1;//没找到
}void CreateAMGraph(AMGraph &G){int i,j;VexType u,v;cout<<"请输入顶点数:"<<endl;cin>>G.vexnum;cout<<"请输入边数:"<<endl;cin>>G.edgenum;cout<<"请输入顶点信息:"<<endl;for(int i=0;i<G.vexnum;i++)//输入顶点信息,存入顶点信息数组cin>>G.Vex[i];for(int i=0;i<G.vexnum;i++)//初始化邻接矩阵所有值为0,如果是网,则初始化邻接矩阵为无穷大for(int j=0;j<G.vexnum;j++)G.Edge[i][j]=0;cout<<"请输入每条边依附的两个顶点:"<<endl;while(G.edgenum--){cin>>u>>v;i=locatevex(G,u);//查找顶点u的存储下标j=locatevex(G,v);//查找顶点v的存储下标if(i!=-1&&j!=-1)G.Edge[i][j]=G.Edge[j][i]=1; //邻接矩阵储置1,如果是有向图,则把'G.Edge[j][i]=1'去掉即可else{cout << "输入顶点信息错!请重新输入!"<<endl;G.edgenum++;//本次输入不算}}
}void print(AMGraph G){//输出邻接矩阵cout<<"图的邻接矩阵为:"<<endl;for(int i=0;i<G.vexnum;i++){for(int j=0;j<G.vexnum;j++)cout<<G.Edge[i][j]<<"\t";cout<<endl;}
}int main(){AMGraph G;CreateAMGraph(G);print(G);return 0;
}



输出结果

图3 样例输出结果



2 邻接表

图4 邻接表存储结构示例

图5 绿色部分相当于顶点表


图6 每一种颜色相当于一个边表


2.1 邻接表存储结构定义

#define MaxVertexNum 100  //顶点数目的最大值
typedef struct ArcNode{		//边表结点int adjvex;	 	//该弧所指向的顶点的位置struct ArcNode *next;	//指向下一条弧的指针
}ArcNode;
typedef struct VNode{	//顶点表结点VertexType data;	//顶点信息  ArcNode *first;  //指向第一条依附该顶点的弧的指针
}VNode, AdjList[MaxVertexNum];
typedef struct{AdjList vertices;	//邻接表int vexnum, arcnum;	//图的顶点数和弧数
}ALGraph;	//ALGraph是以邻接表存储的图类型



2.2 完整代码应用

以下图作为输入样例:

图7 邻接表输入样例

#include<iostream>//创建有向图的邻接表
using namespace std;
const int MaxVnum=100;//顶点数最大值
typedef char VexType;//顶点的数据类型为字符型typedef struct AdjNode{ //定义邻接点类型int v; //邻接点下标struct AdjNode *next; //指向下一个邻接点
}AdjNode;typedef struct VexNode{ //定义顶点类型VexType data; // VexType为顶点的数据类型,根据需要定义AdjNode *first; //指向第一个邻接点
}VexNode;typedef struct{//定义邻接表类型VexNode Vex[MaxVnum];int vexnum,edgenum; //顶点数,边数
}ALGraph;int locatevex(ALGraph G,VexType x){for(int i=0;i<G.vexnum;i++)//查找顶点信息的下标if(x==G.Vex[i].data)return i;return -1;//没找到
}void insertedge(ALGraph &G,int i,int j){//插入一条边AdjNode *s;s=new AdjNode;s->v=j;s->next=G.Vex[i].first;G.Vex[i].first=s;
}void printg(ALGraph G){//输出邻接表cout<<"----------邻接表如下:----------"<<endl;for(int i=0;i<G.vexnum;i++){AdjNode *t=G.Vex[i].first;cout<<G.Vex[i].data<<":  ";while(t!=NULL){cout<<"["<<t->v<<"]\t";t=t->next;}cout<<endl;}
}void CreateALGraph(ALGraph &G){//创建有向图邻接表int i,j;VexType u,v;cout<<"请输入顶点数和边数:"<<endl;cin>>G.vexnum>>G.edgenum;cout<<"请输入顶点信息:"<<endl;for(i=0;i<G.vexnum;i++)//输入顶点信息,存入顶点信息数组cin>>G.Vex[i].data;for(i=0;i<G.vexnum;i++)G.Vex[i].first=NULL;cout<<"请依次输入每条边的两个顶点u,v"<<endl;while(G.edgenum--){cin>>u>>v;i=locatevex(G,u);//查找顶点u的存储下标j=locatevex(G,v);//查找顶点v的存储下标if(i!=-1&&j!=-1)insertedge(G,i,j);else{cout<<"输入顶点信息错!请重新输入!"<<endl;G.edgenum++;//本次输入不算}}
}int main(){ALGraph G;CreateALGraph(G);//创建有向图邻接表printg(G);//输出邻接表return 0;
}




输出结果:

图8 样例输出结果(注:邻接表不唯一,因为插入结点顺序可以不同)

http://www.ppmy.cn/news/48716.html

相关文章

计算机图形学(5):OpenGL光照

参考 介绍 现实世界中的光照是极其复杂&#xff0c;难以计算的&#xff0c;因此OpenGL的光照使用的是简化的模型&#xff0c;其中一个模型被称为冯氏光照模型(Phong Lighting Model)。 冯氏光照模型的主要结构由三个分量组成&#xff1a; 环境(Ambient)光照 漫反射(Diffuse)…

【C/C++】结构体对齐详解

文章目录 结构体内存对齐原则结构体对齐方法结构体对齐意义 结构体内存对齐原则 结构体内存对齐是由编译器自动完成的&#xff0c;编译器会按照一定的规则将结构体成员按照一定的字节对齐方式排列在内存中。不同的编译器可能会有不同的对齐规则&#xff0c;但通常都遵循以下几…

第三章 作业(7BF)【计算机系统结构】

第三章 作业&#xff08;7BF&#xff09;【计算机系统结构】 前言推荐第三章 作业&#xff08;7BF&#xff09;71115鲲鹏流水线调研华为鲲鹏处理器ARM体系的总体思想ARM的流水线结构 最后 前言 2023-4-10 18:49:41 以下内容源自《【计算机系统结构】》 仅供学习交流使用 推荐…

瀚高股份吕新杰:创新开源双驱动 躬耕国产数据库

近年来&#xff0c;国际形势不断变幻&#xff0c;也给人们带来巨大警示&#xff1a;关键核心技术是买不来、讨不来的&#xff0c;中国科技企业需寻找研发自强之路。 瀚高基础软件股份有限公司&#xff08;简称瀚高股份&#xff09;专注数据库十八年&#xff0c;始终以“振兴民…

003+limou+C语言链表之“无头单向非循环链表”的实现

0、前要&#xff1a;顺序表的缺陷 在倍数增容的时候&#xff0c;存储空间存在一定的空间浪费增容需要申请空间、拷贝数据、释放旧空间&#xff0c;有不小的消耗头部或者中部的插入、删除效率低下&#xff0c;时间复杂度是O(N)查找搜索缓慢&#xff0c;但是这个其实是可以靠树来…

Unity --- UGUI(Unity Graphical user interface)--- Canvas画布

1.UI --- User Interface --- 使用者与机器之间的交互界面 1.所谓的自适应系统指的是分辨率的适应&#xff1a; 比如在一个分辨率下做的UI放到另一个分辨率下显示时&#xff0c;如果没有自适应系统的话就会导致UI过大&#xff0c;过小&#xff0c;被辟成一半等等情况&#xff…

Excel函数培训目录

Excel快捷键★查找删除重复项★★数据透视表★★VLOOKUP 与 INDEX(MATCH())★★★多条件查找选择性粘贴 | 转置 与 运算 ★数据格式验证 ★ 函数 文本函数 文本函数ValueTRIM()去空TEXT()转换文本格式MID()中取LEFT()左取RIGHT()右取LEN()字符数量LENB()字节长度 查找函数 …

python批量下载怀俄明大学探空数据Wyoming soundings并处理

下载怀俄明大学的探空数据&#xff0c;之前用的是气象家园写的maltab脚本&#xff0c;但总是链接不上&#xff0c;而且有的站点需要用新网址&#xff0c;有的有需要用老网址&#xff0c;很麻烦&#xff0c;痛定思痛用决定终于用python了&#xff0c;主要有两种方式&#xff0c;…