邻接表,存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。
对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点。
/* MGraph.cc: 图的邻接矩阵存储表示和实现 */
/* 包含图类型Graph定义;创建图;深度优先遍历;广度优先遍历 */
/* 用到引用型参数,在TC下无法通过编译,VC等C++编译器可通过 */
#include <stdio.h>
#include <string.h>
#include <limits.h> //含INT_MAX
#define VType char //顶点值类型
#define EType int //边权值类型
#define MAXVNUM 50 //最大顶点个数
#define DIGRAPH 0 //有向图(网)
#define UNDIGRAPH 1 //无向图(网)
#define INVALID INT_MAX //无效权值(最大整数表示无穷大)
#define EMPTY -1 //"空"顶点序号
删边i-j邻接矩阵:
有向图:map[i][j] = 0
无向图:map[i][j] = map[j][i] = 0
邻接表:
有向图:
p = v[i] ->firstedge;
pre = p
while (p &&p ->data != j)
{pre = pp = p ->next}
if (p &&pre == p) v[i] ->firstedge = p ->next
else if (p) pre ->next = p ->next
无向图:
p = v[i] ->firstedge;
pre = p
while (p &&p ->data != j)
{pre = pp = p ->next}
if (p &&pre == p) v[i] ->firstedge = p ->next
else if (p) pre ->next = p ->next
p = v[j] ->firstedge;
pre = p
while (p &&p ->data != i)
{pre = pp = p ->next}
if (p &&pre == p) v[j] ->firstedge = p ->next
else if (p) pre ->next = p ->next
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)