图的邻接表存储结构

本文详细介绍了一种基于邻接表的数据结构实现图的方法。包括定义邻接表边类型(ArcNode)、邻接表头节点类型(VNode)及图邻接表类型(AdjGraph)。并提供了创建和销毁图的算法代码,展示了如何使用动态内存分配来构建图的邻接表,以及如何在完成操作后释放内存。

Define

typedef struct Anode
{
	int no;//该节点编号
	int weight;//该边的信息,如权值
	struct Anode *nextarc;//指向下一个节点的指针
}ArcNode;//邻接表边类型 即指向结点的边
typedef struct Vnode
{
	char info;//头结点信息  注意不是结点编号
	ArcNode *firstarc;//指向第一个邻接点的指针
}VNode;//邻接表头节点类型
typedef struct
{
	VNode adjlist[MAXV];//顶点数组  MAXV:最大结点数
	int n, e;//n:顶点数
}AdjGraph;//图邻接表类型

 

Create

void CreatAdj(AdjGraph *&G, int A[MAXV][MAXV], int n, int e){
	
	G = (AdjGraph *)malloc(sizeof(AdjGraph));
	G->n = n; G->e = e;
	for(int i = 0; i < n; ++i)
		G->adjlist[i].firstarc = NULL;
		
	for(int i = 0; i < n; ++i)
		for(int j = 0; j < n; ++j)
			if(A[i][j] != 0 && A[i][j] != INF){
				ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
				p->no = j;//notice**
				p->weight = A[i][j];
				
				ArcNode *r = NULL;
				r = G->adjlist[i].firstarc;
				
				p->nextarc = G->adjlist[i].firstarc;//头插法,顺序和数组是反的 
				G->adjlist[i].firstarc = p;//这里用不了尾插,因为没有头结点 
			}
}

 

Destroy

void Destroy(AdjGraph *&G)
{
	ArcNode *q;
	for (int i = 0; i < G->n; i++)
	{
		ArcNode *p = G->adjlist[i].firstarc;
		
		while (p != NULL)
		{
			q = p;
			p = p->nextarc;
			free(q);
			q = NULL;
		}
	}
	free(G);
	G = NULL;
	cout << "Destroy adjacent Graph..." << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值