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日

相关文章

  • Python实现的数据结构与算法之双端队列详解

    Python实现的数据结构与算法之双端队列详解 什么是双端队列? 双端队列是一种具有队列和栈的性质的数据结构,可以在队列两端进行插入和删除操作。双端队列可以实现两端的操作,因此可以在队列两端进行插入和删除操作,既可以像队列一样先进先出,也可以像栈一样后进先出。 双端队列的操作 add_front(item):在队头插入一个元素; add_rear(item)…

    数据结构 2023年5月17日
    00
  • PHP 数据结构 算法 三元组 Triplet

    PHP 数据结构 算法 三元组 Triplet 什么是三元组 Triplet 三元组 Triplet 是指由三个数据分别确定一个元素的数据类型。 在 PHP 中可以用一个数组来实现三元组,数组下标表示元素的序号,数组中储存的则是元素的值,共有三个元素。 例如一个三元组 (a, b, c),可以用 PHP 数组表示为 $triplet = array(a, b…

    数据结构 2023年5月17日
    00
  • C语言数据结构之学生信息管理系统课程设计

    C语言数据结构之学生信息管理系统课程设计 介绍 本文讲解学生信息管理系统的设计过程,包括需求分析、设计思路、实现步骤等。 需求分析 学生信息管理系统是一种常见的数据结构应用场景。通过该系统,可以实现对学生信息的有效管理和查询。在设计之前,我们需要明确系统的需求和功能,包括: 学生信息的录入、删除、修改和查询; 各类信息的统计和分析,如学生总数、男女比例等; …

    数据结构 2023年5月17日
    00
  • 手动实现数据结构-栈结构

    1.栈结构 是一种受限的线性结构。 特点:先进后出 2.使用TS实现 1 //封装一个栈 使用泛型类 2 class ArrayStack<T=any>{//给一个默认值为any类型 3 //定义一个数组,用于存储元素 4 private data:T[]=[] 5 //push:将元素压入栈中 6 push(e:T):void{ 7 this.…

    算法与数据结构 2023年4月17日
    00
  • 数据结构之AVL树详解

    数据结构之AVL树详解 什么是AVL树? AVL树是一种自平衡的二叉搜索树,它的名称来自它的发明者Adelson-Velsky和Landis。在AVL树中,每个节点的左右子树的高度差(平衡因子)最多为1,否则需要通过旋转操作来重新平衡树。AVL树基于二叉搜索树,所以它包含了二叉搜索树的所有特性,同时也保证了树的高度始终处于对数级别,因此它的查找、插入、删除都…

    数据结构 2023年5月16日
    00
  • Java数据结构最清晰图解二叉树前 中 后序遍历

    Java数据结构最清晰图解二叉树前 中 后序遍历 前言 二叉树是数据结构中至关重要的一种数据结构,对于计算机科学的学习和工作都是至关重要的。而遍历二叉树是二叉树的重要操作之一。 为了帮助读者更好地理解二叉树前、中、后序遍历的过程,本文介绍 Java 数据结构中最清晰的图解二叉树前、中、后序遍历攻略。 什么是二叉树? 二叉树是一种非常重要的数据结构,它由根节点…

    数据结构 2023年5月17日
    00
  • C语言数据结构之顺序数组的实现

    C语言数据结构之顺序数组的实现 前言 顺序数组是数据结构的一个重要部分,它代表着一种基本的数据结构,能够在数据存储与访问方面发挥极大的作用。本文将详细讲解如何在C语言中实现顺序数组。 简介 顺序数组是在物理内存中顺序存储的一组元素数据,可以通过下标访问任意一个元素。通常情况下,顺序数组的数据类型是相同的,而且每一个元素的大小也是相同的。 实现 实现顺序数组主…

    数据结构 2023年5月17日
    00
  • C++数据结构之文件压缩(哈夫曼树)实例详解

    我来为您详细讲解一下“C++数据结构之文件压缩(哈夫曼树)实例详解”这篇文章的完整攻略: 文章基本信息 标题:C++数据结构之文件压缩(哈夫曼树)实例详解 作者:Coder_XWG 发布时间:2019年12月24日 文章概述 该篇文章主要讲解了哈夫曼树在文件压缩方面的应用。通过实例讲解了如何使用哈夫曼编码将文件进行压缩,以及如何解压缩被压缩的文件,并对文章中…

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