数据结构图代码

图抽象数据类型

ADT Graph
{
	数据对象:
		D={ai | 1<=i<=n, n>=0, ai为ElemType类型;}
	数据关系:
		R = {<ai,aj> | ai,aj属于D, 1 <= i,j <= n, 其中每个元素可以有零个或多个前驱元素,可以有0个或多个后继元素; }
	基本运算:
		CreateGraph(&g):创建图
		DestroyGraph(&g):销毁图
		DispGraph(g):输出图
		DFS(g,v):从v出发的深度优先遍历图g
		BFS(g,v): 从v出发的广度优先遍历图g
}

 邻接矩阵存储

//邻接矩阵
#define MAXV 105
#define INF 32767

typedef int InfoType;
typedef struct
{
	int no;
	InfoType info;
}VertexType;
typedef struct
{
	int edges[MAXV][MAXV]; //起点 终点
	int n, e; //总顶点数 总边数
	VertexType vexs[MAXV]; //顶点信息数组
}MatGraph;

邻接表存储

//邻接表
typedef struct ANode
{
	int adjvex;  //边的邻接点编号
	struct ANode* nextarc; //指向下一条边的指针
	int weight;  //边信息
}ArcNode;  //边结点 -- 存该点邻接点编号 指向下一边的指针 边的信息
typedef struct VNode
{
	InfoType info; //顶点信息
	ArcNode* firstarc; //指向表的第一个边结点
}VNode; //头结点类型 -- 存信息 指向第一个记录的边
typedef struct
{
	VNode adjlist[MAXV]; //头结点的数组
	int n, e; //总顶点数,边数
}AdjGraph;  // -- 头结点数组 点数 边数

由矩阵创建图

void CreateAdj(AdjGraph*& G, int A[MAXV][MAXV], int n, int e)
{
	int i, j;
	ArcNode* p; //用于建立结点
	G = (AdjGraph*)malloc(sizeof(AdjGraph));
	for (i = 0; i < n; i++)
		G->adjlist[i].firstarc = NULL; //初始化
	for (i = 0; i < n; i++)
		for (j = n - 1; j >= 0; j--)
			if (A[i][j] != 0 && A[i][j] != INF)
			{
				p = (ArcNode*)malloc(sizeof(ArcNode));
				p->adjvex = j;
				p->weight = A[i][j];
				//链表头插法
				p->nextarc = G->adjlist[i].firstarc;
				G->adjlist->firstarc = p;
			}
	G->n = n; G->e = e;
}

输出图

void DispAdj(AdjGraph* G)
{
	int i;
	ArcNode* p; //用于建立结点
	for (i = 0; i < G->n; i++)
	{
		p = G->adjlist[i].firstarc; //第一个的边结点
		cout << i << ":";
		while (p != NULL)
		{
			cout << p->adjvex << "[" << p->weight << "] -> ";  //遍历链
			p = p->nextarc;
		}
		cout << endl;
	}
}

销毁图

void DestroyAdj(AdjGraph*& G)
{
	int i;
	ArcNode* pre, * p;
	for (int i = 0; i < G->n; i++)
	{
		pre = G->adjlist[i].firstarc; //pre也free
		if (pre != NULL)
		{
			p = pre->nextarc; //p往下保存结点
			while (p != NULL)
			{
				free(pre); //先free掉pre
				pre = p;
				p = p->nextarc;
			}
			free(pre);
		}
	}
	free(G);
}

邻接矩阵转邻接表

void MatToList(MatGraph g, AdjGraph*& G)
{
	int i, j;
	ArcNode* p;
	G = (AdjGraph*)malloc(sizeof(AdjGraph));
	for (i = 0; i < g.n; i++)
		G->adjlist[i].firstarc = NULL; //置初值
	for (i = 0; i < g.n; i++)
		for (j = g.n - 1; j >= 0; j--)
			if (g.edges[i][j] != 0 && g.edges[i][j] != INF)
			{
				p = (ArcNode*)malloc(sizeof(ArcNode));
				p->adjvex = j;
				p->weight = g.edges[i][j];
				p->nextarc = G->adjlist[i].firstarc;
				G->adjlist[i].firstarc = p;
			}
	G->n = g.n; G->e = g.e;
}

邻接表转邻接矩阵

void ListToMat(AdjGraph* G, MatGraph& g)
{
	int i;
	ArcNode* p;
	for (int i = 0; i < G->n; i++)
	{
		p = G->adjlist[i].firstarc;
		while (p != NULL)
		{
			g.edges[i][p->adjvex] = p->weight;
			p = p->nextarc;
		}
	}
	g.n = G->n; g.e = G->e;
}

  • 38
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值