数据结构--图的临接表表示

本文介绍了如何使用C++编写一个基本的图数据结构,包括定义顶点、边和图,实现顶点插入、边的头插法插入,并展示了如何通过GetVertexPos和InsertEdge函数操作图。最后通过main函数展示了整个图的创建和打印过程。

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

#include<stdio.h>
#include<stdlib.h>

#define MAX_VERTEX_NUM 10//最大顶点个数
typedef char VertexType;//也可以写成#define VertexType char

//定义边
typedef struct Edge
{
	int dest;//顶点下标
	struct Edge* link;//链接下一条边
}Edge;
//定义顶点结构体
typedef struct Vertex
{
	VertexType data;
	Edge* adj;//指向边的指针
}Vertex;
//定义图的存储结构
typedef struct GraphLink
{
	int vernum, arcnum;//顶点个数和边的个数
	Vertex* NodeTable;
}GraphLink;

//寻找顶点v的位置序号
int GetVertexPos(GraphLink* G, VertexType v)
{
	int i = 0;
	for (;i < G->vernum;i++)
	{
		if (G->NodeTable[i].data == v)
			return i;
	}
	return -1;
}

//初始化
void InitGraph(GraphLink* G)
{
	int i;
	G->vernum = G->arcnum = 0;
	G->NodeTable = (Vertex*)malloc(sizeof(Vertex) * MAX_VERTEX_NUM);
	for (i = 0;i < MAX_VERTEX_NUM;i++)
	{
		G->NodeTable[i].adj = NULL;
	}
}

//向图中插入顶点
void InsertVertex(GraphLink* G, VertexType vertex)
{
	if (MAX_VERTEX_NUM <= G->vernum)
		return;
	G->NodeTable[G->vernum++].data = vertex;
}

//打印图
void ShowGraph(GraphLink* G)
{
	Edge* p;
	int i;
	for (i = 0;i < G->vernum;i++)
	{
		printf("%d%c:>",i, G->NodeTable[i].data);
		p = G->NodeTable[i].adj;
		while (p != NULL)
		{
			printf("%d-->", p->dest);
			p = p->link;
		}
		printf("NULL\n");
	}
	printf("\n");
}

//采用头插法的方式插入边
void InsertEdge(GraphLink* G, VertexType vertex1, VertexType vertex2)
{
	int v1 = GetVertexPos(G, vertex1);
	int v2 = GetVertexPos(G, vertex2);
	if (v1 == -1 || v2 == -1)//如果v1,v2中有一个不存在
		return;

	Edge* s;
	//v1-->v2插入一条边
	s = (Edge*)malloc(sizeof(Edge));
	s->dest = v2;
	s->link = G->NodeTable[v1].adj;
	G->NodeTable[v1].adj = s;
	//v2-->v1插入一条边
	s = (Edge*)malloc(sizeof(Edge));
	s->dest = v1;
	s->link = G->NodeTable[v2].adj;
	G->NodeTable[v2].adj = s;

	G->arcnum++;//边数增加一条
}

int main()
{
	GraphLink G;
	InitGraph(&G);//初始化
	//向图中插入顶点
	InsertVertex(&G, 'A');
	InsertVertex(&G, 'B');
	InsertVertex(&G, 'C');
	InsertVertex(&G, 'D');
	InsertVertex(&G, 'E');
	//向图中插入边
	InsertEdge(&G, 'A', 'B');
	InsertEdge(&G, 'A', 'D');
	InsertEdge(&G, 'B', 'C');
	InsertEdge(&G, 'B', 'E');
	InsertEdge(&G, 'C', 'D');
	InsertEdge(&G, 'C', 'E');
	//打印图
	ShowGraph(&G);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值