图的存储结构

图不可能用简单的顺序存储结构表示
在这里插入图片描述
一.邻接矩阵
在这里插入图片描述
1.无向图
基本思想:用一维数组存储图的顶点,用矩阵 n*n(二维数组)表示图中各顶点之间的邻接关系。有边指向顶点就用1表示,没有就用0

该矩阵是对称矩阵,因为是无向图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.有向图
在这里插入图片描述
出度对应行 入度对应列
在这里插入图片描述
3.网
在这里插入图片描述
4.建立无向网图的邻接矩阵代码实现

typedef char VertexType;
typedef int EdgeType;   
#define MAXVEX 100      
#define INFINITY 65535 //用65535来表示无穷

typedef struct MGraph{
	VertexType vexs[MAXVEX];      //顶点表 
	EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵 可看作边表 
	int numVertexes, numEdges;
}MGraph;

//建立无向网图
void CreateMGraph(MGraph *G)
{
	int i, j, k, w;
	printf("输入顶点数和边数:\n");
	scanf("%d%d", &G -> numVertexes, &G -> numEdges);
	for(i = 0; i < G -> numVertexes; i++) //建立顶点表 
	{
		scanf(&G -> vexs[i]);
	}
	for(i = 0; i < G -> numVertexes; i++)
	{
		for(j = 0; j < G -> numVertexes; j++)
		{
			G -> arc[i][j] = INFINITY;
		}
	}
	for(k = 0; k < G -> numEdges; k++)
	{
		printf("输入边(vi, vj)上的下标i, 下标j和权w:\n");
		scanf("%d%d%d", &i, &j, &w);
		G -> arc[i][j] = w;
		G -> arc[j][i] = G -> arc[i][j]; //无向图 矩阵对称 
	}
} 

二.邻接表
在这里插入图片描述
因而引出邻接表
1.概念
在这里插入图片描述
2.无向图
在这里插入图片描述
3.有向图
对于有向图 邻接表只能表示一个度 后面的十字链表会弥补这个不足
在这里插入图片描述
在这里插入图片描述
3.网
对于网 在数据域加上一个权值即可
在这里插入图片描述
4.代码实现
应用了在单链表创建中的头插法 对于无向图,一条边对应都是两个顶点,所以在循环中,一次就针对i和j分别进行了插入

//创建邻接表
typedef char VertexType;
typedef int EdgeType;

typedef struct EdgeNode{    //边表结点 
	int adjvex;            //存储顶点对应的下标 
	EdgeType weight;
	struct EdgeNode *next;
}EdgeNode; 

typedef struct VertexNode{ //顶点表结点 
	VertexType data;
	EdgeType *firstedge;
}VertexNode, AdjList[MAXVEX];

typedef struct GraphAdList{
	AdjList adjList;
	int numVertexes, numEdges;
}GraphAdjList;

void CreateALGraph(GraphAdjList *G)
{
	int i, j, k;
	EdgeNode *e;
	printf("输入顶点数和边数:\n");
	scanf("%d%d", &G -> numVertexes, &G -> numEdges);
	for(i = 0; i < G -> numVertexes; i++)
	{
		scanf(&G -> adjList[i].data);
		G -> adjList[i].firstedge = NULL; //将边表置为空表
		for(k = 0; k < G -> numEdges; k++)
		{
			printf("输入边(vi, vj)上的顶点序号:\n");
			scanf("%d%d", &i, &j);
			e = (EdgeNode*)malloc(sizeof(EdgeNode));
			e -> adjvex = j;
			e -> next = G -> adjList[i].firstedge;
			G -> adjList[i].firstedge = e;
			
			e = (EdgeNode*)malloc(sizeof(EdgeNode));
			e = adjvex = i;
			e -> next = G -> adjList[j].firstedge;
			G -> adjList[j].firstedge = e;  
			
		} 
	}
}

三.十字链表
在这里插入图片描述
在这里插入图片描述
四.邻接多重表
对于关注点在顶点,则邻接表是个不错的选择。但是关注边的操作,则需要找到这条边的两个边表结点进行操作,相对比较麻烦。
在这里插入图片描述
具体实现
在这里插入图片描述
五.边集数组
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值