采用邻接表表示发创建无向图:
1.输入总顶点数和总边数
2.建立顶点表:
依次输入点的信息存于顶点表中,每个头结点的指针域为NULL
3.建立邻接表
依次输入每条边依附的两个顶点;确定两个顶点的序号i和j;将此边结点分别插入到vi和vj对应的两个边链表的头部
#include <iostream>
#include <string>
typedef char VexType;
typedef int OtherInfo;
#define MVNum 100 // 最大定点数
// 两种结点方式:头节点 + 边表结点
// 头节点
// data | firstedge
// 数据 | 指向第一个边结点
struct ArcNode;
struct HNode
{
VexType data;
ArcNode *firstarc;
};
typedef HNode AdjList[MVNum]; // 头结点数组 AdjList v; ---- HNode v[MVNum];
// 边表结点
// adjvex | nextarc | info
// 临界点域:存放与vi邻接的顶点,在表头数组中的位置 | 链域:指向下一条边或弧 | 边的权值(没有权值可以没有)
struct ArcNode
{
int adjvex;
ArcNode *nextarc;
OtherInfo info;
};
// 图的结构定义
struct ALGraph
{
AdjList vertices; // vertices -- vertex的复数,找到头结点相当于找到了邻接表
int vexnum, arcnum; // 图当前顶点数和弧数
};
// 采用邻接表表示法创建无向图
void CreateUDG(ALGraph &G);
// 确定两个顶点的序号
int LocateVex(const ALGraph &G, const VexType &v);
int main()
{
ALGraph G;
CreateUDG(G);
// 打印邻接表
for (int i = 0; i < G.vexnum; ++i)
{
std::cout << G.vertices[i].data << ": ";
ArcNode *p = G.vertices[i].firstarc;
while (p)
{
std::cout << p->adjvex << " ";
p = p->nextarc;
}
std::cout << std::endl;
}
return 0;
}
// 采用邻接表表示法创建无向图
// 1.输入总顶点数和总边数
// 2.建立顶点表:
// 依次输入点的信息存于顶点表中,每个头结点的指针域为NULL
// 3.建立邻接表
// 依次输入每条边依附的两个顶点;确定两个顶点的序号i和j;将此边结点分别插入到vi和vj对应的两个边链表的头部
void CreateUDG(ALGraph &G)
{
// 1.输入总顶点数和总边数
std::cout << "输入总顶点数和总边数" << std::endl;
std::cin >> G.vexnum >> G.arcnum;
// 2.建立顶点表:
// 依次输入点的信息存于顶点表中,每个头结点的指针域为NULL
std::cout << "输入点的信息" << std::endl;
for (int i = 0; i < G.vexnum; ++i)
{
std::cin.clear();
std::cin >> G.vertices[i].data;
G.vertices[i].firstarc = NULL;
}
// 3.建立邻接表
std::cout << "依次输入每条边依附的两个顶点" << std::endl;
std::cin.clear();
for (int k = 0; k < G.arcnum; ++k)
{
VexType v1, v2;
// 依次输入每条边依附的两个顶点
std::cin >> v1 >> v2;
// 确定两个顶点的序号i和j
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
// std::cout << v1 << ": " << i << " " << v2 << ": " << j << std::endl;
// 将此边结点分别插入到vi和vj对应的两个边链表的头部
ArcNode *p1 = new ArcNode();
p1->adjvex = j;
p1->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p1;
// std::cout << G.vertices[p1->adjvex].data << std::endl;
ArcNode *p2 = new ArcNode();
p2->adjvex = i;
p2->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = p2;
// std::cout << G.vertices[p2->adjvex].data << std::endl;
}
}
// 确定两个顶点的序号
int LocateVex(const ALGraph &G, const VexType &v)
{
for (int i = 0; i < G.vexnum; ++i)
{
if (G.vertices[i].data == v)
return i;
}
return -1;
}