博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图(C描述)
阅读量:6485 次
发布时间:2019-06-23

本文共 1288 字,大约阅读时间需要 4 分钟。

一、概念

  图是由顶点的非空有限集合V(由N>0个顶点组成)与边的集合E(顶点之间的关系)构成。边没有方向的图成为无向图,反之为有向图

  无向图: 有向图:

二、图的表示

  常见的图的存储方法有两种:邻接矩阵存储法与邻接表存储法

  1、邻接矩阵

    邻 接矩阵存储法也称为数组存储方法,核心就是利用两个数组来存储一个图,一个一维数组用来存放图中的数据(顶点):vertex[0,1,2...,n- 1]另外一个二维数组用来存储图中顶点之间的相互关系(边),称为邻接矩阵:A[i][j] = 1(当顶点i与顶点j有边) | 0(顶点i与顶点j无边)

举例:一中的有向图就可以表示为

数组:[0 , 1 , 2, 3]

邻接矩阵:

0 1 0 1

0 0 1 0

0 0 0 1

0 0 0 0

  

  邻接矩阵不适合存储边很少的图,可以用邻接表存储这类图

  2、邻接表

  邻接表存储法是一种顺序分配与链式分配相结合的存储的方法,由链表和顺序数组组成,数组用来存储顶点,链表用来存储边,对图中的每个顶点分别建立一个顶点,如果一个图有n个顶点那么就有n个链表,每个链表前边设置一个头结点,成为顶点结点,结构如图:

其中vertex存放顶点的数据信息,next指向顶点vertex上的第一条边。通常用一个数组统一管理顶点结点,并用该数组的下标表示顶点在图中的位置。

 

链表的每一个结点表示一条边,被称为边结点。

(边结点结构)adjvex指的是该边结点所代表的边的另外一个顶点(即该链表顶结点与该顶点构成了该条边),weight代表边权重(边长),如果图没有该项则省略,next指向下一个边结点(即该链表的顶点结点的下一条边)。

举例:一中的有向图可以表示为

数组:[0 , 1, 2, 3]

邻接表:

除了以上两种存储图的方式外还有十字链表存储法,多重邻接表存储法等。

 

三、C描述

 邻接表用C语言可以描述为:

#define MAX_VERTEX_NUM 20// 定义边(链表中结点的类型)typedef struct ArcNode{int adjvex;struct ArcNode *next;infoType *weight;}ArcNode;// 定义顶点typedef struct VNode{VertexType data;ArcNode *firstarc; } VNode G[MAX_VERTEX_NUM];

  如何用C创建一个图呢:

CreateGraph(int n , VNode G[]){  int i , e;  printf("Input the info of the vertex\n");  for(i=0;i
next = NULL; p->adjvex = e; /*i结点的第一条边*/ if(G[i].fristarc == NULL) G[i].firstarc = p; /*下一条边*/ else q->next = p; q = p; scanf("%d" , &e); } } }

转载地址:http://voiuo.baihongyu.com/

你可能感兴趣的文章
前端大牛们都学过哪些?
查看>>
在iOS当中发送电子邮件和短信
查看>>
13~1003的和
查看>>
pycharm如何新项目如何不默认创建虚拟环境(吐槽)
查看>>
MySQL字段类型详解
查看>>
ORACLE 的游标
查看>>
虚拟机安装的UBUNTU全屏的方法:
查看>>
java虚拟机类加载器
查看>>
ASP.NET状态管理之八(会话Session)
查看>>
转载:大型网站架构演变和知识体系
查看>>
set集合
查看>>
SVN服务器的搭建和使用
查看>>
mvc中枚举的使用和绑定枚举值到DropDownListFor
查看>>
多目标跟踪的评价指标
查看>>
HTTPS(SSL)详解以及PHP调用方法
查看>>
突发小事件,USB接口问题
查看>>
Nginx负载均衡配置实例详解
查看>>
L1-009. N个数求和
查看>>
sqlserver 批量删除存储过程(转)
查看>>
自建型呼叫中心
查看>>