~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌
✌ 题目及题解持续更新中
【2023王道数据结构目录】课后算法设计题C、C++代码实现完整版大全
题目: 通过C++实现利用邻接表法存储创建图结构
代码实现:
#include <iostream>
using namespace std;
#define MAX_VERTEX_NUM 100
// 边表结点
typedef struct EdgeNode
{
int adjvex; // 该结点在顶点表中位置
struct EdgeNode *next; //指向下一条边的指针
} EdgeNode;
//顶点表结点
typedef struct VertexNode
{
char data; // 顶点信息
EdgeNode *first; // 指向相邻的第一个边表结点
} VertexNode, AdjList[MAX_VERTEX_NUM];
//邻接表
typedef struct
{
AdjList adj_list; // 邻接表
int vertex_num, edge_num; //顶点数量,边数量
} Graph;
void InitGraph(Graph &g, char vertex[], int edge[][5], int n)
{
/***********************************
* description: 初始化图的邻接表
* input:
* @g: 图的引用
* @vertex: 图的顶点信息
* @edge: 图的邻接矩阵
* @n: 图的顶点数
* return:
***********************************/
g.vertex_num = n; // 初始化图的顶点数量
g.edge_num = 0;
// 初始化邻接表
for (int i = 0; i < n; i++)
{
g.adj_list[i].data = vertex[i]; // 初始化顶点信息
g.adj_list[i].first = NULL; // 将指针置为空
EdgeNode *p = NULL; // 定义工作指针,用于创建边表结点
// 创建每个顶点的边链表
for (int j = 0; j < n; j++)
{
// 如果存在路径,采用头插法创建边表
if (edge[i][j] != 0)
{
p = new EdgeNode; // 创建一个边表结点
p->adjvex = j; // 邻接的结点信息
// 头插法
p->next = g.adj_list[i].first;
g.adj_list[i].first = p;
// 图的边数目加1
g.edge_num++;
}
}
}
// 由于是有向图,边数需要除以2
g.edge_num /= 2;
}
void PrintGraph(Graph g)
{
/***********************************
* description: 打印图的邻接表
* input:
* @g: 输入的图结构
* return:
***********************************/
for (int i = 0; i < g.vertex_num; i++)
{
// 打印顶点表信息
cout << g.adj_list[i].data << ": ";
EdgeNode *p = g.adj_list[i].first; // 初始化工作指针,指向第一个边表结点
while (p)
{
cout << g.adj_list[p->adjvex].data << '\t'; // 打印边表信息
p = p->next; // 指向下一个相邻结点
}
cout << endl;
}
}
void InitGraph(Graph &g)
{
/***********************************
* description: 初始化图结构,本函数中修改图的数据
* input:
* @g: 图的结构
* return:
***********************************/
char vertex[] = {
'1', '2', '3', '4', '5'}; //图的顶点名称
//图的邻接矩阵
int edge[5][5] = {
{
0, 1, 0, 1, 0},
{
1, 0, 1, 0, 1},
{
0, 1, 0, 1, 1},
{
1, 0, 1, 0, 0},
{
0, 1, 1, 0, 0}};
InitGraph(g, vertex, edge, 5);
}
int main()
{
Graph g;
InitGraph(g);
PrintGraph(g);
cout << g.edge_num << '\t' << g.vertex_num;
}