【2023王道数据结构】【图】通过C++实现利用邻接表法存储创建图结构C、C++完整实现(可直接运行)

~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌


题目及题解持续更新中
【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;
}

猜你喜欢

转载自blog.csdn.net/m0_47256162/article/details/124774113