数据结构之 图(一) 图的存储结构

简介: 数据结构之 图(一) 图的存储结构

图的存储一般用邻接矩阵或邻接表来存储


邻接矩阵

图的存储要考虑两方面的内容,①顶点的信息,②各个顶点之间的边的信息。顶点信息,我们用0 – n-1来表示各个顶点。边的信息用二维数组来表示。其中这个存储边信息的二维数组就是邻接矩阵。代码如下(C++代码):

#define MaxVertexNum 100//设置顶点最大为100个
#define maxn 1000000;
int MGraph[MaxVertexNum];//邻接矩阵,用来存储图
int n;//存储有多少个顶点
int m;//有几条边

下列是创建图的代码:

void CreateMGraph( int MGraph[] ){
  cin>> n >> m;//输入图的顶点数和边数
  for(int i = 0;i <G->e;i++){
    for(int j = 0;j < G->e;j++){
      G->edges[i][j] = maxn;//初始化为无穷大,表示此路不通;
    }
  }
  int a,b,c;
  for(int i = 0;i < G->e;i++){
    cin>>a>>b>>c;//表示从a到b的距离是c
    MGraph[a][b] = c;
    MGraph[b][a] = c;//有这句话创建的是无向图,两边都可以走,若是有向图,则这句话可不写
  }
}

邻接表

邻接表的存储是一种顺序存储和链式存储相结合的存储方式,首先用一个数组来存储顶点信息,称为邻接表的表头节点他有两类元素,代码创建如下

typedef struct node{
  int vdata;
  struct node *next;
}VertexNode;
VertexNode Map[MaxVertexNum];//这就是那个邻接表的顶点信息数组


第二个就是表结点,表节点有三类元素,分别是自身data,自己是哪号结点,还有后一个节点的地址,代码如下

typedef struct vnode{
  int data;//表示路径长短
  int Nnode;//表示当前结点是哪个顶点
  struct vnode *next;
}EdgeNode;//这两个的定义其实是一样的,只不过含义不一样


下面来创建邻接表

void CreateALGraph(){
  EdgeNode *s;
  cin>>n>>m;//输入图的顶点数和边数
  int a,b,c;
  for(int i = 0;i < n;i++){
  cin>>a;//输入每个顶点
  Map[i]->vdata = a;
  Map[i]->next = NULL;
  }
  for(int i = 0;i < m;i++){
  cin>>a>>b>>c;
  s = (EdgeNode *)malloc(sizeof(EdgeNode));
  s->Nnode = b;
  s->data = c;
  s->next = Map[a]->next;
  Map[a]->next = s;
  }
}


下一章来说图的遍历

相关文章
|
6天前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
1月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
19天前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
11天前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
15天前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
1月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
222 8
|
1月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
1月前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
1月前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
1月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。