图的存储结构大赏------数据结构C语言(图)

本次所讲的是常有的四种结构:

  1. 邻接矩阵
  2. 邻接表
  3. 十字链表
  4. 邻接多重表

邻接矩阵

概念

两个数组,一个表示顶点的信息,一个用来表示关联的关系。

  • 如果是无权图,那么1代表有关系,0代表没有关系。
  • 如果是有权图(网)那么用INT_MAX代表没有关系,使用具体的值来代表有关系。

说明

在这里,由于邻接矩阵很好实现,我试着增加难度,使用稀疏矩阵存储无向图。

完整实现:

//注意:所有数组从  0  开始
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char VertexData;
typedef struct Graph
{
VertexData *data;
int * matrix;
int max;
}Graph;
int Locate(int x, int y)
{
if(x==y)
return -1;//这种情况不予考虑,因为不考虑自己到自己
if(y > x)
{
int t = y;
y = x;
x = t;
}
return (x-1)*x/2+y;
}
Graph* Create(int n)
{
Graph*G = (Graph*)malloc(sizeof(Graph));
G->max = n;
G->matrix = (int *)calloc((n-1)*n/2,sizeof(int));
for(int i = 0; i < (n-1)*n/2; i++)
{
G->matrix[i] = 0;
}
G->data = (VertexData*)calloc(n,sizeof(VertexData));
return G; }
void Fill(Graph *G, int n)
{
for(int i = 0; i < n; i++)
{
char buf[12];
scanf("%s",buf);
G->data[i] = buf[0];
}
}
void AddArc(Graph *G, int n)
{
for(int i = 0; i < n; i++)
{
int a,b;
scanf("%d%d",&a,&b);
G->matrix[Locate(a,b)] = 1;
}
}
void PrintMatrix(Graph *G)
{
int cnt = 0;
for(int i = 1; i < G->max; i++)
{
for(int j = 0; j < i; j++)
printf("%d ",G->matrix[cnt++]);
putchar('\n');
}
}
int main()
{
int n;
scanf("%d",&n);
Graph *G = Create(n);
Fill(G,n);
int m;
scanf("%d",&m);
AddArc(G,m);
PrintMatrix(G);
return 0;
}

邻接表(链表法)(链式前向星)

话不多说,直接上代码。

由于西工大NOJ已经有相关应用可参考一下博客

基于图的广度优先搜索策略(耿7.11)--------西工大noj.20

基于图的深度优先搜索策略(耿7.10)--------西工大noj

十字链表法

#include<stdio.h>
#include <stdlib.h>
#include <string.h>//我这里的头以及尾巴与书上的不一样。
typedef struct ArcNode
{
int from, to;
struct ArcNode * fnext, *tonext;
int w;
}ArcNode;
typedef struct VertexNode
{
char info;
ArcNode *ff, *ft;
}VertexNode;
typedef struct Graph
{
int num_vertex;
int num_arc;
VertexNode *ver;
}Graph;
Graph *Create(int n)
{
Graph * G = (Graph*)malloc(sizeof(Graph));
G->num_vertex = n;
G->num_arc = 0;
G->ver = (VertexNode*)calloc(n+1, sizeof(VertexNode));
for(int i = 1; i <= n; i++)
{
G->ver[i].ff = NULL;
G->ver[i].ft = NULL;//在这里可以补加点的信息
}
return G;
}
void AddArc(Graph *G,int a, int b, int c)
{
(G->num_arc)++;
ArcNode *s = (ArcNode*)malloc(sizeof(ArcNode));
s->from = a;
s->to = b;
s->fnext = G->ver[a].ff;
G->ver[a].ff = s;
s->tonext = G->ver[b].ft;
G->ver[b].ft = s;
s->w = c;
}
int main()
{ return 0;
}

图的存储结构大赏------数据结构C语言(图)的更多相关文章

  1. 图的存储结构与操作--C语言实现

    图(graph)是一种比树结构还要复杂的数据结构,它的术语,存储方式,遍历方式,用途都比较广,所以如果想要一次性完成所有的代码,那代码会非常长.所以,我将分两次来完成图的代码.这一次,我会完成图的五种 ...

  2. 【PHP数据结构】图的存储结构

    图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...

  3. 图的存储结构(邻接矩阵与邻接表)及其C++实现

    一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...

  4. C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)

    图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息. 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用 ...

  5. K:图的存储结构

      常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...

  6. 【algo&ds】6.图及其存储结构、遍历

    1.什么是图 图表示"多对多"的关系 包含 一组顶点:通常用 V(Vertex)表示顶点集合 一组边:通常用 E(Edge)表示边的集合 边是顶点对:(v,w)∈ E,其中 v,w ...

  7. 图的存储结构:邻接矩阵(邻接表)&链式前向星

    [概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...

  8. 图的存储结构的实现(C/C++实现)

    存档: #include <stdio.h> #include <stdlib.h> #define maxv 10 #define max 10 typedef char e ...

  9. Search Quick Union Find(图的存储结构)

    Quick Find:适用于search频繁的情况 每个节点有一个id值,id相同表示两个节点相连通.在union时要将等于某一个id值都改成另一个id值 Quick Union: 适用于union频 ...

随机推荐

  1. 干货|Linux平台搭建网关服务器

    概述 集群中一共10台服务器组成了局域网环境,但其中只有一台有外网网卡可以访问互联网.现要求另外9台服务器通过这台主机进行互联网访问.  实验环境介绍 利用iptables搭建网关服务器,即通过SNA ...

  2. Docker被禁了!只能靠它了......

    科技飞速发展的今天,企业对候选人有了新的更高要求,如市场.运营等必须会Python.Sql,面试常问诸如用户漏斗等考察数据分析能力.可以说,懂数据的人会更有竞争力通过面试. 而市场上,专业的数据分析人 ...

  3. Blazor和Vue对比学习(基础1.8):Blazor中实现计算属性和数据监听

    1.7章<传递UI片断>,需要做几个案例,这部分暂停消化几天.我们先把基础部分相对简单的最后两章学习了. 计算属性和数据监听是Vue当中的概念,本质上都是监听数据的变化,然后做出响应.两者 ...

  4. data:image字符转byte[]

    var data = "data:image/bmp;base64,Qk3aHwAAAAAAADYAAAAoAAAAZAAAABsAAAABABgAAAAAAKQfAAAAAQAAAAEAA ...

  5. mysql配置与存储引擎与字段类型与约束条件

    目录 字符编码与配置文件 存储引擎 创建表的完整语法 字段类型 整型 浮点型 字符类型 数字的含义 枚举与集合 日期类型 约束条件 字符编码与配置文件 在MySQL5.X系列中,显示的字符编码有多种, ...

  6. K8S Flannel网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

  7. 记一次生产事故的排查与优化——Java服务假死

    一.现象 在服务器上通过curl命令调用一个Java服务的查询接口,半天没有任何响应.关于该服务的基本功能如下: 1.该服务是一个后台刷新指示器的服务,即该服务会将用户需要的指示器数据提前计算好,放入 ...

  8. sql语句中 int(1)与int(10)有什么区别?资深开发竟然能理解错

    过完春节该投入战斗了,上班第一天发现了一个挺有意思的知识点给大家分享一下:一直以来的的误区我们都认为了int后面的跟的数字为最大显示宽度会对后面插入的参数会有限制,其实倒不是这样的 # 困惑 最近遇到 ...

  9. Amazon 消息订阅对接

    亚马逊的api 谁用谁知道...... 除了坑还是坑 头疼一周整出来,分享给铁汁们 amazon 的订阅思维,我只能说外国人脑回路有点长 下面就讲讲具体流程步骤: 第一步: 参照官方教程:设置通知(A ...

  10. 不忍了,快速下载Visual Studio Code

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月2日. 奇怪的原因 因为一些众所周知的原因,在国内下载Visual Studio Code的速度比较慢,所以我们需要一些方法来加快 ...