C 图的链表表示 和 邻接矩阵表示

本文介绍了如何使用链表和邻接矩阵表示图,包括单源无权最短路径的BFS算法。链表表示节省内存,通过构建边节点、邻接点和顶点表头节点来实现。而邻接矩阵表示法适用于Dijkstra和Floyd算法,但在稀疏图中可能造成空间浪费。
摘要由CSDN通过智能技术生成

图的链表表示

单源无权最短路径——BFS
可以考虑用链表表示——更节省内存空间;

#define MaxVertexNum 100    /* 最大顶点数设为100 */
typedef int Vertex;         /* 用顶点下标表示顶点,为整型 */
typedef int WeightType;        /* 边的权值设为整型 */
typedef char DataType;        /* 顶点存储的数据类型设为字符型 */

1.构建边节点
左边,右边,权重

typedef struct ENode *PtrToENode;
struct ENode{
   
    Vertex V1, V2;      /* 有向边<V1, V2> */
    WeightType Weight;  /* 权重 */
};
typedef PtrToENode Edge;

2.定义邻接点
邻接点的权重weight;
next指针指向下一个邻接点;
下标AdjV;

/* 邻接点的定义 */
typedef struct AdjVNode *PtrToAdjVNode; 
struct AdjVNode{
   
    Vertex AdjV;        /* 邻接点下标 */
    WeightType Weight;  /* 边权重 */
    PtrToAdjVNode Next;    /* 指向下一个邻接点的指针 */
};

3.定义顶点的表头节点
表头节点有一个头指针,指向该节点连的第一个对象;
data可以存放顶点的数据;

/* 顶点表头结点的定义 */
typedef struct Vnode{
   
    PtrToAdjVNode FirstEdge;/* 边表头指针 */
    DataType Data;            /* 存顶点的数据 */
    /* 注意:很多情况下,顶点无数据,此时Data可以不用出现 */
} AdjList[MaxVertexNum];    /* AdjList是邻接表类型 */
 

4.构建图节点
LGraph图内储存列表,G保存指向每个节点的边节点的表头结点;

typedef struct GNode *PtrToGNode;
struct GNode{
     
    int Nv;     /* 顶点数 */
    int Ne;     /* 边数   */
    AdjList G;  /* 邻接表 */
};
typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */

5.构建createGraph函数
输入节点数,赋值给Graph->Nv;
初始化G【i】的头指针指向NULL,代表没有边;

LGraph CreateGraph( int VertexNum )
{
    /* 初始化一个有VertexNum个顶点但没有边的图 */
    Vertex V;
    LGraph Graph;
     
    Graph = (LGraph)malloc( sizeof(struct GNode) ); /* 建立图 */
    Graph->Nv = VertexNum;
    Graph->Ne = 0;
    /* 初始化邻接表头指针 */
    /* 注意:这里默认顶点编号从0开始,到(Graph->Nv - 1) */
       for (V=0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值