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日

相关文章

  • el-tree的实现叶子节点单选的示例代码

    下面我将详细讲解“el-tree的实现叶子节点单选的示例代码”的完整攻略。 示例代码实现 el-tree 的实现叶子节点单选,需要在 el-tree 上绑定 @check-change 事件,并通过 check-strictly 属性来配置选择模式。代码示例如下: <template> <el-tree :data="data&q…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构之链表的实现

    JavaScript数据结构之链表的实现 什么是链表 链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点: 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素) 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索…

    数据结构 2023年5月17日
    00
  • 使用C语言详解霍夫曼树数据结构

    使用C语言详解霍夫曼树数据结构 什么是霍夫曼树 霍夫曼树是一种带权路径长度最短的树,也称为最优二叉树,它是优化编码的核心算法。 在霍夫曼树中,每个叶子节点对应一个字符,该节点的权值为该字符出现的次数。当然,字符可以是任何数据类型。生成霍夫曼树后,在对每个字符进行编码时,字符在霍夫曼树中的路径即为其编码。(一般规定,一条从根到叶子的路径上只出现0或1,从根到某…

    数据结构 2023年5月17日
    00
  • golang中set数据结构的使用示例

    Golang中Set数据结构的使用示例 Set是一种无序的、元素不重复的数据结构。通过使用map来实现,map中的key即为Set中的元素,value则可以用来存储某种状态(比如计数)。 Set数据结构的定义 type Set struct { m map[interface{}]bool } Set数据结构的初始化 func NewSet() *Set {…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解 本文将详细讲解C语言数据结构中单链表的操作方法,包括单链表的建立、遍历、插入、删除等操作,并提供两个示例进行说明。 单链表的定义 单链表是一种常见的动态数据结构,由若干节点组成,每个节点通常包含一个数据元素和一个指向下一个节点的指针。单链表最后一个节点的指针指向NULL,表示链表的结尾。 单链表的节点定义 单链表的节点通常由结…

    数据结构 2023年5月17日
    00
  • C语言数据结构之迷宫问题

    C语言数据结构之迷宫问题 迷宫问题是一种基本的搜索问题,其中需要在一个矩阵中寻找从起点到终点的路径。在本篇文章中,我们将以C语言为例,介绍迷宫问题的完整攻略。 准备工作 在开始之前,我们先要准备好数据结构。为了表示迷宫,我们使用一个二维数组。其中,0表示可以通过的路,1表示障碍物不可通过。为了记录路径,我们还需要使用一个二维数组来表示每个格子是否已经被访问过…

    数据结构 2023年5月17日
    00
  • Java数据结构之KMP算法的实现

    Java数据结构之KMP算法的实现 1. KMP算法的概述 KMP算法的全称是Knuth-Morris-Pratt算法,是一种字符串匹配算法,用于在文本串S内查找一个模式串P的出现位置。它的特点是在P和S两个序列中,当匹配失败时,它会跳过P的部分已匹配的字符,利用这个信息来减少S和P之间的匹配次数,从而提高匹配效率。 2. KMP算法的实现 2.1 预处理失…

    数据结构 2023年5月17日
    00
  • 数据结构C语言链表的实现介绍

    数据结构C语言链表的实现介绍 1. 什么是链表? 链表是一种常见的数据结构,它由一系列的节点(Node)通过链接(Link)组成,每个节点包含两个部分:数据域(Data)和指针(Pointer),数据域用来存储数据,指针用来链接下一个节点。链表最重要的优点就是支持动态扩展,占用内存比较灵活,相比于数组,链表在增加和删除元素时更加高效。 2. 链表的实现 链表…

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