C语言数据结构图的创建与遍历实验示例

下面是“C语言数据结构图的创建与遍历实验示例”的完整攻略。

1. 创建数据结构图

1.1 创建图对象

首先需要创建一个图对象,可以使用邻接矩阵或邻接表来表示图。使用邻接矩阵表示时,将所有顶点的编号按照一定顺序排列在矩阵的行和列上,使用0或1表示两个顶点之间是否有边。使用邻接表表示时,需要一个array存储所有的顶点,数组中的每个元素包含一个链表,链表中存储与该顶点相连的所有边的信息。

下面是使用邻接矩阵创建图对象的示例:

#define MAX_VERTEX_NUM 100 // 最多顶点数
typedef struct {
    char vexs[MAX_VERTEX_NUM]; // 存储顶点信息
    int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边的信息
    int vexnum, arcnum; // 图的当前顶点数和边数
} GraphMatrix;

1.2 添加顶点和边

在图对象中添加顶点和边。如果使用邻接矩阵表示,可以直接在矩阵中设置边的信息。如果使用邻接表表示,需要先找到对应的顶点,然后在其链表中添加边的信息。

下面是使用邻接矩阵添加顶点和边的示例:

GraphMatrix graph;
initGraphMatrix(&graph); // 初始化图
addEdgeGraphMatrix(&graph, 'A', 'B'); // 添加边
addVertexGraphMatrix(&graph, 'C'); // 添加顶点

1.3 遍历图

可以使用深度优先遍历和广度优先遍历两种算法来遍历图。

1.3.1 深度优先遍历

深度优先遍历使用递归的方式来实现。从起始顶点开始遍历,首先访问该顶点,然后依次访问与之相邻的顶点,直到所有与之相邻的顶点都被访问过为止。

下面是使用邻接矩阵实现深度优先遍历的示例:

void DFS_GraphMatrix(GraphMatrix *graph, char v, int visited[]) {
    int i;
    int w = indexOfVertex(graph, v); // 找到该顶点在矩阵中的下标
    visited[w] = 1; // 标记该顶点已被访问
    printf("%c ", graph->vexs[w]); // 输出该顶点的信息
    for (i = 0; i < graph->vexnum; i++) {
        if (graph->arcs[w][i] == 1 && visited[i] == 0) { // 如果与该顶点相邻的顶点未被访问
            DFS_GraphMatrix(graph, graph->vexs[i], visited); // 递归访问该顶点
        }
    }
}

void traverseDFS_GraphMatrix(GraphMatrix *graph) {
    int visited[MAX_VERTEX_NUM] = { 0 }; // 初始化visited数组
    int i;
    for (i = 0; i < graph->vexnum; i++) {
        if (visited[i] == 0) { // 如果该顶点未被访问
            DFS_GraphMatrix(graph, graph->vexs[i], visited); // 使用深度优先遍历访问该顶点及其相邻的顶点
        }
    }
}

1.3.2 广度优先遍历

广度优先遍历使用队列的方式来实现。首先访问起始顶点,然后依次访问与之相邻的顶点,将其压入队列,并标记为已访问。然后从队列中弹出一个顶点,访问与之相邻的未访问的顶点,并将其压入队列,重复该过程直到队列为空。

下面是使用邻接矩阵实现广度优先遍历的示例:

void traverseBFS_GraphMatrix(GraphMatrix *graph) {
    int visited[MAX_VERTEX_NUM] = { 0 }; // 初始化visited数组
    int i, j;
    SqQueue q; // 定义队列
    initSqQueue(&q); // 初始化队列
    for (i = 0; i < graph->vexnum; i++) {
        if (visited[i] == 0) { // 如果该顶点未被访问
            visited[i] = 1; // 标记该顶点已被访问
            printf("%c ", graph->vexs[i]); // 输出该顶点的信息
            enSqQueue(&q, i); // 将该顶点加入队列
            while (!isSqQueueEmpty(q)) {
                int u;
                deSqQueue(&q, &u); // 从队列中弹出一个顶点
                for (j = 0; j < graph->vexnum; j++) {
                    if (graph->arcs[u][j] == 1 && visited[j] == 0) { // 如果与该顶点相邻的顶点未被访问
                        visited[j] = 1; // 标记该顶点已被访问
                        printf("%c ", graph->vexs[j]); // 输出该顶点的信息
                        enSqQueue(&q, j); // 将该顶点加入队列
                    }
                }
            }
        }
    }
}

2. 示例说明

2.1 示例1

创建一个7个顶点的无向图,顶点信息分别为A、B、C、D、E、F、G,边的信息如下:

A-B、A-C、B-D、B-E、C-F、D-F、E-G、F-G

使用邻接矩阵表示,创建图对象,添加顶点和边,然后使用深度优先遍历和广度优先遍历分别遍历该图。

GraphMatrix graph;
initGraphMatrix(&graph); // 初始化图
addEdgeGraphMatrix(&graph, 'A', 'B');
addEdgeGraphMatrix(&graph, 'A', 'C');
addEdgeGraphMatrix(&graph, 'B', 'D');
addEdgeGraphMatrix(&graph, 'B', 'E');
addEdgeGraphMatrix(&graph, 'C', 'F');
addEdgeGraphMatrix(&graph, 'D', 'F');
addEdgeGraphMatrix(&graph, 'E', 'G');
addEdgeGraphMatrix(&graph, 'F', 'G');
traverseDFS_GraphMatrix(&graph); // 深度优先遍历
printf("\n");
traverseBFS_GraphMatrix(&graph); // 广度优先遍历
printf("\n");

输出结果:

A B D F E G C 
A B C D E F G 

2.2 示例2

创建一个5个顶点的有向图,顶点信息分别为V0、V1、V2、V3、V4,边的信息如下:

V0->V1、V0->V2、V0->V3、V1->V4、V4->V3、V4->V2

使用邻接表表示,创建图对象,添加顶点和边,然后使用深度优先遍历和广度优先遍历分别遍历该图。

GraphAdjList graph;
initGraphAdjList(&graph); // 初始化图
addVertexGraphAdjList(&graph, "V0");
addVertexGraphAdjList(&graph, "V1");
addVertexGraphAdjList(&graph, "V2");
addVertexGraphAdjList(&graph, "V3");
addVertexGraphAdjList(&graph, "V4");
addEdgeGraphAdjList(&graph, "V0", "V1");
addEdgeGraphAdjList(&graph, "V0", "V2");
addEdgeGraphAdjList(&graph, "V0", "V3");
addEdgeGraphAdjList(&graph, "V1", "V4");
addEdgeGraphAdjList(&graph, "V4", "V3");
addEdgeGraphAdjList(&graph, "V4", "V2");
traverseDFS_GraphAdjList(&graph); // 深度优先遍历
printf("\n");
traverseBFS_GraphAdjList(&graph); // 广度优先遍历
printf("\n");

输出结果:

V0->V3->V4->V2->V1
V0 V1 V2 V3 V4 

以上是“C语言数据结构图的创建与遍历实验示例”的完整攻略,希望有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构图的创建与遍历实验示例 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 实际问题中用到的算法——递归算法确定插帧顺序

    问题: 现在需要给一个视频序列插帧,插帧算法要求每次只能由两帧输入插值得到其中间帧。如果现在需要给一个视频做 4 倍(或者更高的 8,16 倍等类似)的插帧,则一个插帧的思路是当前视频每相邻帧之间插入 3 帧,即:假设插帧前视频帧序号是 0,4,8,12…,则插帧时补充相邻帧跨过的 3 个序号,得到插帧后的视频帧序号为 0,1,2,3,4,5,6,.. 即可…

    算法与数据结构 2023年4月18日
    00
  • C语言 数据结构堆排序顺序存储(升序)

    C语言 数据结构堆排序顺序存储(升序)攻略 1. 堆排序概述 堆排序是一种常见的排序算法,通过构建最大堆或最小堆来实现排序。本文介绍的是使用顺序存储方式实现的最大堆排序,也就是升序排序。 2. 最大堆的定义和实现 最大堆指的是堆结构中父节点的值大于子节点的值,根节点的值最大。对于一棵完全二叉树,若父节点的下标为i,则其左子节点的下标为2i+1,右子节点的下标…

    数据结构 2023年5月17日
    00
  • 数据结构与算法中二叉树子结构的详解

    数据结构与算法中二叉树子结构的详解 什么是二叉树子结构 二叉树是一种数据结构,由包含根节点的节点组成,可以拓展为左子树和右子树。二叉树子结构指的是,在一棵二叉树中,具有连续节点的子树。 如何判断是否为二叉树子结构 对于一棵二叉树T和另外一棵二叉树S,我们可以判断S是否为T的子树,遵循以下判断原则: 如果树S为空,则表示S不是T的子树; 如果树S的根节点和树T…

    数据结构 2023年5月17日
    00
  • 一行python实现树形结构的方法

    想要一行Python实现树形结构,我们需要使用Python的字典数据类型来完成任务。下面是详细的操作步骤: 创建树形结构字典 我们可以用嵌套字典来表示树形结构,我们需要选择其中一个节点作为根节点,并以键值对的形式保存其子节点。最终,我们将根节点作为整个字典的返回值。下面是实现代码: tree = lambda: defaultdict(tree) 插入节点 …

    数据结构 2023年5月17日
    00
  • C语言结构体详细图解分析

    针对C语言结构体详细图解分析的攻略,我来详细讲解一下。 一、什么是结构体? 结构体是C语言中一种自定义数据结构类型,是将不同类型的变量组合在一起的方式,形成了新的数据类型。结构体成员可以是任意类型的数据,包括基本类型、数组、指针、函数等,可以理解为一个包含多个变量的大变量。 二、结构体的定义和使用 定义结构体的方式为: struct name { type1…

    数据结构 2023年5月17日
    00
  • [Week 19]每日一题(C++,数学,并查集,动态规划)

    目录 [Daimayuan] T1 倒数第n个字符串(C++,进制) 输入格式 输出格式 样例输入 样例输出 解题思路 [Daimayuan] T2 排队(C++,并查集) 输入格式 输出格式 样例输入1 样例输出1 样例输入2 样例输出2 样例输入3 样例输出3 数据规模 解题思路 [Daimayuan] T3 素数之欢(C++,BFS) 数据规模 输入格…

    算法与数据结构 2023年5月4日
    00
  • 基于C++详解数据结构(附带例题)

    基于C++详解数据结构(附带例题)攻略 简介 该攻略是基于C++编程语言详解数据结构的,主要涉及数据结构中的相关概念、操作以及例题演练。C++语言作为一种高性能的编程语言,对于开发数据结构问题具有很大的优势。 数据结构概念 数据结构基本概念 数据结构是计算机存储、组织数据的方式。具体来说,数据结构可以理解为计算机存储数据的一种方式,也可以看作是一些组织数据的…

    数据结构 2023年5月17日
    00
  • C++数据结构之AVL树的实现

    C++数据结构之AVL树的实现 什么是AVL树 AVL树是一种自平衡二叉查找树,也就是说它通过旋转操作来保持树的平衡。 在AVL树中,任何节点的两个子树高度差不超过1。如果高度差大于1,则需要通过旋转操作来调整树的平衡。 AVL树提供了比红黑树更快的插入和删除操作,但是在读取数据时红黑树更快。 AVL树的实现 结构体定义 我们可以先定义一个结构体来表示AVL…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部