数据结构-图-邻接矩阵

本文探讨了图这种比线性表和树更复杂的数据结构,重点介绍了邻接矩阵的存储方式。通过两个数组分别存储顶点信息和边的关系,详细讲解了如何创建、操作和销毁图,包括无向网、有向网、无向图和有向图的各种操作,以及邻接点的查找和管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图是一种较线性表和树更为复杂的数据结构。在线性表中,数据元素之间只有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能与下一层中多个元素相关,但只能与上一层中一个元素相关。而在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,图的应用极为广泛。

可以用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。

邻接矩阵:行、列各对应一个顶点,若第i行对应顶点到第j列对应的顶点有弧相连则A[i][j]=1,否则为0.

辅助宏的定义:

#define OK         1
#define ERROR      0
#define TRUE       1
#define FALSE      0
#define OVERFLOW  -1
#define UNDERFLOW -2
#define maxn 100
#define INFINITY  32767  //最大值 一定要很大
#define MAX_INFO  50
#define MVNUM     100

typedef int    Status;
typedef char VertexType;
typedef char InfoType;
typedef enum   {DG,DN,UDG,UDN} GraphKind; //图类型 有向图,无向图, 有向网,无向网
 

弧的存储结构定义:

typedef struct ArcType {//弧的定义
   double adj; //邻接数,0、1或w、无穷大
   InfoType *Info; //弧的附加信息
}ArcType;

图的数组表示存储结构定义:

//图的数组表示存储结构定义
typedef struct{
   VertexType *vexs; //顶点信息
   ArcType **arcs; //邻接矩阵
   int vexnum,arcnum; //顶点数 弧数
   GraphKind kind; //图的类型标记
}MGraph;

图的创建.

Status CreateGraph(MGraph &G){
   //图的创建
   //输入图的种类及顶点和边信息构造图G
   scanf("%d",&G.kind); //枚举值DG DN UDG UDN 实际输入0 1 2 3
   switch(G.kind){
      case DG: return CreateDG(G);
      case DN: return CreateDN(G);
      case UDG:return CreateUDG(G);
      case UDN:return CreateUDN(G);
      default :return ERROR;
   }
}

建立无向网G.

Status CreateUDN(MGraph &G){
   //建立无向网G
   int IncInfo,i,j,k;
   double w;
   char s[MAX_INFO];
   VertexType v1,v2;
   scanf("%d %d %d",&G.vexnum,&G.arcnum,&IncInfo); //IncInfo为0表弧没有附加信息
   if(!(G.vexs=(VertexType *)malloc(G.vexnum*sizeof(VertexType))))
       exit(OVERFLOW);
   if(!(G.arcs=(ArcType **)malloc(G.vexnum*sizeof(ArcType *))))
       exit(OVERFLOW);
   for(i=0;i<G.vexnum;i++){
       if(!(G.arcs[i]=(ArcType *)malloc(G.vexnum*sizeof(ArcType))))
           exit(OVERFLOW);
       scanf(" %c",&G.vexs[i]);
       for(j=0;j<G.vexnum;j++){
           G.arcs[i][j].adj=INFINITY; //各弧初始化
           G.arcs[i][j].Info=NULL;
       }
   }
   for(k=0;k<G.arcnum;k++){
       scanf(" %c %c %lf",&v1,&v2,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值