数据结构——图(Code)

这篇博客详细介绍了图的两种存储结构——邻接矩阵和邻接表,并提供了相应的代码实现。此外,还涵盖了图的深度优先遍历(DFS)、广度优先搜索遍历(BFS)以及在图的应用中涉及的普里姆算法和克鲁斯卡尔算法。
摘要由CSDN通过智能技术生成

下面写的代码可能感觉会很乱,所以加上了目录,意在为了引导,也就是你需要回顾哪个算法,就能够快速定位到该位置。

另外,阅读代码是件非常枯燥的事,所以尽量每一行都加的注释,方便阅读理解。

四、图
(一)图的顺序存储结构——邻接矩阵
  1. 结构体的声明

    typedef enum
    {
         
    	DG_GRAPH = 0,						//有向图
    	DN_GRAPH							//无向图
    }GRAPH_TYPE;							//图的类型结构体
    typedef struct
    {
         
    	int no;								//顶点的编号
    	int data;							//顶点存放的数据
    
    }VERTEX_TYPE;							//顶点类型结构体
    
    typedef struct 
    {
         
    	int n, e;							//n为顶点数,e为边数
    	int edge[MAXSIZE][MAXSIZE];			//存放邻接矩阵的边信息
    	VERTEX_TYPE ver_type[MAXSIZE];		//存放结点信息
    	GRAPH_TYPE graph_type;				//图的类型(可写可不写)
    }MGRAPH;								//图的邻接矩阵结构体
    
  2. 图的邻接矩阵表示

    /*
    method:
    	构造图的邻接矩阵
    param:
    	m_graph		图
    	vex_num		顶点的数量
    	edges		边的信息
    */
    int CreateDG(MGRAPH** m_graph,GRAPH_TYPE graph_type ,int vex_num, int edges[][MAXSIZE])
    {
         
    	int edge_num = 0;
    	int i = 0, j = 0;
    	(*m_graph)->n = vex_num;									//结点个数赋值
    	for (i = 0; i < vex_num; i++)
    	{
         
    		(*m_graph)->ver_type[i].no = i;							//顶点序号为下标
    		(*m_graph)->ver_type[i].data = i;						//顶点数据为下标
    		for (j = 0; j < vex_num; j++)
    		{
         
    			(*m_graph)->edge[i][j] = edges[i][j];				//给图的边赋值
    			if (graph_type == DG_GRAPH)							//判断有向图还是无向图
    			{
         
    				if (edges[i][j] == 1)							//计算边的数量
    					++edge_num;
    			}
    			else if(graph_type == DN_GRAPH)						//判断有向图还是无向图	
    			{
         
    				if (edges[i][j] != MAX_NUM && edges[i][j] != 0)	//计算边的数量
    					++edge_num;
    			}
    		}
    	}
    	if(graph_type == DG_GRAPH)
    		(*m_graph)->e = edge_num;								//边的个数
    	else if(graph_type == DN_GRAPH)		
    		(*m_graph)->e = edge_num / 2;							//无向图边的个数为 1 的一半		
    	return OK;
    }
    
(二)图的链式存储结构——邻接表
  1. 结构体的声明

    #define OK 1
    #define ERROR -1
    #define MAXSIZE 6
    typedef struct ArcNode
    {
         
    	int adj_vertex;						//该边所指向的顶点信息
    	struct ArcNode* nextarc;			//指向下一条边的指针
    	int info;							//该边的相关信息,如权值
    }ArcNode;								//弧指针结构体
    		
    typedef struct
    {
         
    	int data;							//顶点信息
    	ArcNode* first_arc;					//指向第一条边的指针
    }V_NODE;								//顶点指针结构体
    
    typedef struct
    {
         
    	V_NODE adj_list[MAXSIZE]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值