图的邻接矩阵的操作
来源:互联网 发布:珠海高凌java笔试题 编辑:程序博客网 时间:2024/04/28 16:18
图的邻接矩阵的实现比较容易,定义两个数组分别存储顶点信息(数据元素)和边或弧的信息(数据元素之间的关系) 。其存储结构形式定义如下:
#define INFINITY MAX_VAL /* 最大值∞ */
/* 根据图的权值类型,分别定义为最大整数或实数 */
#define MAX_VEX 30 /* 最大顶点数目 */
typedef enum {DG, AG, WDG,WAG} GraphKind ;
/* {有向图,无向图,带权有向图,带权无向图} */
typedef struct ArcType
{
VexType vex1, vex2 ; /* 弧或边所依附的两个顶点 */
ArcValType ArcVal ; /* 弧或边的权值 */
ArcInfoType ArcInfo ; /* 弧或边的其它信息 */
}ArcType ; /* 弧或边的结构定义 */
typedef struct
{
GraphKind kind ; /* 图的种类标志 */
int vexnum , arcnum ; /* 图的当前顶点数和弧数 */
VexType vexs[MAX_VEX] ; /* 顶点向量 */
AdjType adj[MAX_VEX][MAX_VEX];
}MGraph ; /* 图的结构定义 */
(1) 图的创建
AdjGraph *Create_Graph(MGraph * G)
{
printf(“请输入图的种类标志:”) ;
scanf(“%d”, &G->kind) ;
G->vexnum=0 ; /* 初始化顶点个数 */
return(G) ;
}
(2) 图的顶点定位
图的顶点定位操作实际上是确定一个顶点在vexs数组中的位置(下标) ,其过程完全等同于在顺序存储的线性表中查找一个数据元素。
int LocateVex(MGraph *G , VexType *vp)
{
int k ;
for (k=0 ; k<G->vexnum ; k++)
if (G->vexs[k]==*vp) return(k) ;
return(-1) ; /* 图中无此顶点 */
}
(3) 向图中增加顶点
向图中增加一个顶点的操作,类似在顺序存储的线性表的末尾增加一个数据元素。
int AddVertex(MGraph *G , VexType *vp)
{
int k , j ;
if (G->vexnum>=MAX_VEX)
{
printf(“Vertex Overflow !\n”) ;
return(-1) ;
}
if (LocateVex(G , vp)!=-1)
{
printf(“Vertex has existed !\n”) ;
return(-1) ;
}
k=G->vexnum ;
G->vexs[G->vexnum++]=*vp ;
if (G->kind==DG||G->kind==AG)
for (j=0 ; j<G->vexnum ; j++)
G->adj[j][k].ArcVal=G->adj[k][j].ArcVal=0 ;
/* 是不带权的有向图或无向图 */
else
for (j=0 ; j<G->vexnum ; j++)
{
G->adj[j][k].ArcVal=INFINITY ;
G->adj[k][j].ArcVal=INFINITY ;
/* 是带权的有向图或无向图 */
}
return(k) ;
}
(4) 向图中增加一条弧
int AddArc(MGraph *G , ArcType *arc)
{
int k , j ;
k=LocateVex(G , &arc->vex1) ;
j=LocateVex(G , &arc->vex2) ;
if (k==-1||j==-1)
{
printf(“Arc’s Vertex do not existed !\n”) ;
return(-1) ;
}
if (G->kind==DG||G->kind==WDG)
{
G->adj[k][j].ArcVal=arc->ArcVal;
G->adj[k][j].ArcInfo=arc->ArcInfo ;
/* 是有向图或带权的有向图*/
}
else
{
G->adj[k][j].ArcVal=arc->ArcVal ;
G->adj[j][k].ArcVal=arc->ArcVal ;
G->adj[k][j].ArcInfo=arc->ArcInfo ;
G->adj[j][k].ArcInfo=arc->ArcInfo ;
/* 是无向图或带权的无向图,需对称赋值 */
}
return(1) ;
}
- 图的邻接矩阵的操作
- 图的邻接矩阵存储操作
- 邻接矩阵的基本操作
- 数据结构之图的邻接矩阵的操作
- 【总结】邻接矩阵 图的基本操作
- 图的操作和l邻接矩阵存储
- 邻接矩阵关于图的常用操作
- 无向图的邻接矩阵基本操作
- 图的基本操作(基于邻接矩阵
- 邻接矩阵存储的图的基本操作c++
- 图的邻接矩阵的建立以及遍历操作
- 图的邻接矩阵存储结构基本操作的实现
- 图的存储-邻接矩阵
- 图的邻接矩阵实现
- 图的邻接矩阵表示
- 图的邻接矩阵
- 图的邻接矩阵
- 图的邻接矩阵存储
- 求二叉树的叶子结点数
- 删除SQL 的维护计划
- 求二叉树的深度
- tar常用命令选项
- 线索化二叉树
- 图的邻接矩阵的操作
- ReferenceTable overflow (max=512)。
- linux使用读写锁pthread_rwlock_t
- 邻接链表法操作图
- Android 4.0 Ethernet 和 wifi 的实现分析
- 深度优先搜索算法
- 广度优先搜索算法
- C#中ToString格式大全
- 关于iOS5 + XCode4.2环境下iPhone3G和3Gs + iOS4.2.1不能调试的问题解决方案整理