图的存储结构之邻接表

//结构代码如下:

/*图的邻接表存储结构*/
typedef struct EdgeNode1   /*边表结点结构*/
{
	EdgType adjvex;/*邻接点域,存储该顶点对应的下标*/

	EdgType weight;/*这里实现的是无向网图的邻接表存储结构,所以需要一个权值,代表两个顶点的距离*/

	struct EdgeNode1* next;/*链域,指向下一个邻接点*/
	
}EdgeNode1;

typedef struct VertexNode1   /*顶点表结点结构*/
{
	VerterType data; /*顶点域,存储顶点信息*/

	EdgeNode1* firstedge; /*边表头指针*/

}VertexNode1,adjlist1[MAX];

typedef struct graph1
{
	adjlist1 adj;

	EdgType numVertexes;  /*图中当前的顶点数*/

	EdgType numEdges;    /*图中当前的边数*/
}graph1;

(1)无向图
在这里插入图片描述
性质:
(1)我们要获取某个顶点的度,就要去查找这个顶点的边表中结点的个数。
(2)我们要判断vi到vj是否存在边,只需要测试vi的边表链表中是否存在结点vj的下标j即可。
(3)我们若是要获取顶点的所有邻接点,就是对此顶点的边表进行遍历。

(2)有向图

有向图由于有方向,我们是以顶点为弧尾来存储边表的,这样很容易就可以得到每个顶点的出度。但是由于有时也需要确定顶点的入度或以顶点作为弧头的弧,我们可以建立一个有向图的逆邻接表,即对每个顶点vi都建立一个链接为vi为弧头的表
在这里插入图片描述
(3)带权值的网图
在这里插入图片描述
//创建一个无向图(带权值)

void CreateGraph1(graph1* g)
{
	int i = 0, j = 0, k = 0;

	int w = 0;

	EdgeNode1* p = NULL;

	printf("请输入顶点数和边数:\n");

	scanf_s("%d,%d", &g->numVertexes, &g->numEdges,4);

	getchar();    //可以获取回车符

	printf("请输入顶点信息:\n");

	for (i = 0; i < g->numVertexes; i++)
	{
		scanf_s("%c", &g->adj[i].data,5);

		//getchar();  //获取回车符

		g->adj[i].firstedge = NULL;

	}

	getchar();  //获取回车符

	for (k = 0; k < g->numEdges; k++)
	{
		printf("input edge(vi,vj) vertexs series and the weight:\n");

		scanf_s("%d,%d,%d", &i, &j, &w,4);

		getchar();
		
		//头插法
		p = (EdgeNode1*)malloc(sizeof(EdgeNode1));  /*向内存申请空间,生成边表结点*/
		
		p->adjvex = j;

		p->next = g->adj[i].firstedge;

		p->weight = w;

		g->adj[i].firstedge = p;

		//头插法
		p = (EdgeNode1*)malloc(sizeof(EdgeNode1)); //这里申请两次结点时因为,结构是无向图,比如v0-v1是相连的,那v1-v0也是相连的,边数为n,那么边表结点为2n

		p->adjvex = i;

		p->next = g->adj[j].firstedge;

		p->weight = w;

		g->adj[j].firstedge = p;
	}
}
#include"graph.h"
int main(void)
{
	graph1 gra;
	CreateGraph1(&gra);
	system("pause");
	return 0;
}

//调试结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
//通过顶点数和边数的值以及调试结果就可以画出相关图形。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值