__3.4 邻接多重链表—无向图邻接表的优化

#include "pch.h"
#include <iostream>

typedef char VertexType;	//顶点类型
typedef int EdgeType;		//边上的权值类型
#define MAXVEX 100			//最大顶点数
#define myINFINITY 65535	//用65535代表正无穷

//边表节点,用于构建链表
typedef struct EdgeNode {
	int iVex;
	int jVex;			//边所依附的两个顶点的下标
	EdgeNode* iLink;	//指向依附于顶点 iVex 的下一条边
	EdgeNode* jLink;	//指向依附于顶点 jVex 的下一条边
	EdgeType weight;	//权值
}EdgeNode;

//顶点表节点,用于存储顶点
typedef struct VertexNode {
public:
	VertexNode() : data('\0'), firstEdge(nullptr), TD(0) { }
	VertexType data;		//顶点数据域
	EdgeNode* firstEdge;	//边表头指针,指向第一条边
	int TD;					//顶点的度
}VertexNode, AdjList[MAXVEX];

//邻接多重链表结构体
typedef struct {
	AdjList adjlist;			//顶点数组
	int numVertexes, numEdges;	//图中顶点数和边数
}AdjMultiList;

//建立无向网的邻接多重链表
void CreateAdjMultiList(AdjMultiList* AML) {
	std::cout << "请依次输入顶点数和边数:";
	std::cin >> AML->numVertexes >> AML->numEdges;

	//读入顶点信息,建立顶点表
	for (int i = 0; i < AML->numVertexes; ++i) {
		std::cout << "请输入第 " << i + 1 << " 个顶点的信息:";
		std::cin >> AML->adjlist[i].data;
	}

	//读入numEdeges条边,建立边表
	for (int k = 0; k < AML->numEdges; ++k) {
		int i = 0, j = 0;
		EdgeType w;
		std::cout << "请依次输入边(Vi, Vj)的上标i,下标j和权 W:";
		std::cin >> i >> j >> w;

		EdgeNode* e = new EdgeNode;
		e->iVex = i;
		e->jVex = j;
		e->weight = w;
		e->iLink = AML->adjlist[i].firstEdge;		//用 e 的 iLink 域将 e 插入 Vi 的邻接链表中
		AML->adjlist[i].firstEdge = e;
		e->jLink = AML->adjlist[j].firstEdge;		//用 e 的 jLink 域将 e 插入 Vj 的邻接链表中
		AML->adjlist[j].firstEdge = e;

		++AML->adjlist[i].TD;		//Vi Vj 的度增加
		++AML->adjlist[j].TD;
	}
}


//打印无向网的邻接多重表
void ShowAdjMultiList(const AdjMultiList& AML) {
	std::cout << std::endl;
	for (int i = 0; i < AML.numVertexes; ++i) {
		std::cout << "顶点V" << i << "的度为:" << AML.adjlist[i].TD << std::endl;
		auto p = AML.adjlist[i].firstEdge;
		while (p) {
			if (i == p->iVex) {		//一条边所依附的两个顶点的 iVex 和 jVex 正好相反
				std::cout << "V" << p->iVex << "(" << AML.adjlist[i].data << ")---V" << p->jVex << "("
					<< AML.adjlist[p->jVex].data << ") weight:" << p->weight << std::endl;
				p = p->iLink;
			}
			else if (i == p->jVex) {
				std::cout << "V" << p->jVex << "(" << AML.adjlist[i].data << ")---V" << p->iVex << "("
					<< AML.adjlist[p->iVex].data << ") weight:" << p->weight << std::endl;
				p = p->jLink;
			}
		}
		std::cout << std::endl;
	}
}

int main() {
	AdjMultiList AML;
	CreateAdjMultiList(&AML);
	ShowAdjMultiList(AML);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40843865/article/details/89224995
3.4
今日推荐