#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;
}
__3.4 邻接多重链表—无向图邻接表的优化
猜你喜欢
转载自blog.csdn.net/qq_40843865/article/details/89224995
今日推荐
周排行