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日

相关文章

  • Java实现链表数据结构的方法

    Java实现链表数据结构的方法可以分为以下步骤: 定义链表节点类Node 首先,在Java中实现链表数据结构,需要定义一个链表节点类,称为Node。Node类中包含两个重要属性: 数据域data,用于存储每个节点的数据信息。 指针域next,用于存储下一个节点的引用。 代码示例: public class Node { public int data; //…

    数据结构 2023年5月17日
    00
  • Java数据结构之简单链表的定义与实现方法示例

    Java数据结构之简单链表的定义与实现方法示例 什么是链表 链表是线性数据结构的一种,它是由一个个节点构成的,每个节点包含两个部分,一个是数据,另一个是指向下一个节点的引用,通俗的说,就像火车一样,每节火车都是一个节点,而每车头都指向下一节车厢。 链表的定义 Java中常用链表有单向链表和双向链表,单向链表每个节点只有一个指向下一个节点的引用,而双向链表每个…

    数据结构 2023年5月17日
    00
  • Java数据结构之线性表

    Java数据结构之线性表完整攻略 什么是线性表 线性表是n个数据元素的有限序列,其中数据元素的类型相同。线性表中含有首元素和末元素。若表中只有一个数据元素,则该数据元素既是首元素又是末元素,这个数据元素成为线性表的唯一元素。 线性表的基本操作 初始化操作 initList(List L):建立一个空的线性表L 插入操作 insert(List L, int …

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘二 线性结构

    C#数据结构与算法揭秘二 线性结构 线性结构是指数据元素之间一对一的关系,即数据元素之间存在一个前驱和一个后继。一般有两种基本形式:线性表和栈、队列。 线性表 线性表是由同类型数据元素构成有序序列的线性结构,常被用于实现基于数组的数据结构,如向量、矩阵等。 线性表可以分为顺序表和链表两种。 顺序表(Sequence List):是把线性表的元素按照顺序存储在…

    数据结构 2023年5月17日
    00
  • C语言数据结构之二叉树详解

    C语言数据结构之二叉树详解 什么是二叉树? 二叉树是一种非常常用的数据结构,它具有以下几个特点: 在二叉树中,每个节点最多有两个子节点,其中一个称为左子节点,另一个称为右子节点。 每个节点都有一个值,这个值可以是任意类型的,比如整数、字符、指针等等。 可以使用递归的方式来遍历一个二叉树,具体包括前序遍历、中序遍历和后序遍历。 二叉树的存储方式 二叉树可以使用…

    数据结构 2023年5月17日
    00
  • C++20中的结构化绑定类型示例详解

    ” C++20中的结构化绑定类型示例详解 ” 具体攻略如下: 什么是结构化绑定类型? 结构化绑定类型是C++17中的新特性,它可以让我们将一个复杂类型的元素绑定到某个变量上,从而更方便地使用这些元素。 C++20还进一步扩展了结构化绑定类型的功能,可以通过给用于引用的名字声明类型来进行显式类型的绑定。 结构化绑定类型的基本用法 下面的例子展示了如何使用结构化…

    数据结构 2023年5月17日
    00
  • 从零学JSON之JSON数据结构

    从零学JSON之JSON数据结构 什么是JSON? JSON全称为JavaScript Object Notation,即JavaScript对象表示法。它是一种轻量级的数据交换格式,具有可读性高、易于开发和解析的特点。JSON格式通常用于客户端和服务器之间的数据传输,可以支持多种编程语言。如下是一个简单的JSON格式示例: { "name&quo…

    数据结构 2023年5月17日
    00
  • Unity接入高德开放API实现IP定位

    Unity接入高德开放API实现IP定位攻略 本文将详细介绍如何在Unity中接入高德开放API实现IP定位功能。 准备工作 在开始之前,需要准备以下内容: 高德开放平台账号 Unity集成开发环境 一台联网的电脑或手机 开始集成 1. 创建Unity项目 首先,我们需要在Unity中创建一个新的项目。 2. 导入AMap3D SDK 将下载好的AMap3D…

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