嵌套之美:广义表,在数据层层叠叠之间,展现信息的层次

news2024/10/17 7:22:12

目录

一、基本概念

二、运行方式

三、运用场景

四、解题思路

五、代码实现

1. 广义表的存储结构

2. 广义表深度计算

六、易错提示

七、代码分析

八、深度剖析

九、总结


一、基本概念

        广义表(Generalized List)是一种递归的数据结构,它可以包含零个或多个元素,每个元素可以是原子或另一个广义表。广义表可以看作是线性表的推广,它允许嵌套结构,使其能够表示更加复杂的数据关系。

二、运行方式

        广义表通常使用递归的方式进行操作。例如,访问广义表中的元素,判断广义表是否为空,计算广义表的深度等操作,都需要递归算法。

三、运用场景

广义表在很多领域都有应用,例如:

  • 表示树形结构: 广义表可以用来表示树形结构,例如文件目录结构、语法树等。

  • 表示多维数组: 广义表可以用来表示多维数组,例如矩阵等。

  • 表示表达式: 广义表可以用来表示表达式,例如数学表达式、逻辑表达式等。

  • 表示程序代码: 广义表可以用来表示程序代码,例如语法树、符号表等。

四、解题思路

在使用广义表解决问题时,需要仔细分析问题的特点,并制定合适的算法。一般来说,需要考虑以下几个方面:

  • 广义表的存储结构: 应该选择合适的存储结构来存储广义表,例如线性链表、树形结构等。

  • 广义表的访问方式: 应该根据问题的要求,选择合适的访问方式,例如递归访问、迭代访问等。

  • 广义表的运算方式: 应该根据问题的要求,选择合适的运算方式,例如求深度、求长度、求元素个数等。

  • 广义表的转换: 应该根据问题的要求,将广义表转换为其他数据结构,例如树形结构、线性链表等。

五、代码实现

1. 广义表的存储结构

#include <stdio.h>
#include <stdlib.h>

typedef struct GListNode 
{
    char data; // 存放原子数据
    struct GListNode *next; // 指向下一个节点
    struct GListNode *subList; // 指向子表头节点
} GListNode;

typedef struct GList 
{
    GListNode *head; // 广义表头节点
} GList;

// 创建一个新的广义表节点
GListNode *createGListNode(char data) 
{
    GListNode *node = (GListNode *)malloc(sizeof(GListNode));
    if (node != NULL) 
    {
        node->data = data;
        node->next = NULL;
        node->subList = NULL;
    }
    return node;
}

// 创建一个新的广义表
GList *createGList() 
{
    GList *list = (GList *)malloc(sizeof(GList));
    if (list != NULL) 
    {
        list->head = NULL;
    }
    return list;
}

// 在广义表尾部添加一个节点
void addGListNode(GList *list, char data) 
{
    GListNode *node = createGListNode(data);
    if (list->head == NULL) 
    {
        list->head = node;
    } 
    else 
    {
        GListNode *p = list->head;
        while (p->next != NULL) 
        {
            p = p->next;
        }
        p->next = node;
    }
}

// 在广义表中插入一个子表
void insertSubList(GListNode *node, GList *subList) 
{
    node->subList = subList->head;
}

// 打印广义表
void printGList(GList *list) 
{
    GListNode *p = list->head;
    while (p != NULL) 
    {
        printf("%c", p->data);
        if (p->subList != NULL) 
        {
            printf("(");
            printGList(p->subList);
            printf(")");
        }
        p = p->next;
        if (p != NULL) 
        {
            printf(", ");
        }
    }
}

int main() 
{
    // 创建一个广义表
    GList *list = createGList();
    addGListNode(list, 'A');
    addGListNode(list, 'B');

    // 创建一个子表
    GList *subList = createGList();
    addGListNode(subList, 'C');
    addGListNode(subList, 'D');

    // 将子表插入到广义表中
    GListNode *p = list->head->next; // 指向第二个节点
    insertSubList(p, subList);

    // 打印广义表
    printGList(list);
    printf("\n");
    return 0;
}

2. 广义表深度计算

#include <stdio.h>
#include <stdlib.h>

typedef struct GListNode 
{
    char data;
    struct GListNode *next;
    struct GListNode *subList;
} GListNode;

typedef struct GList 
{
    GListNode *head;
} GList;

// 创建一个新的广义表节点
GListNode *createGListNode(char data) 
{
    GListNode *node = (GListNode *)malloc(sizeof(GListNode));
    if (node != NULL) 
    {
        node->data = data;
        node->next = NULL;
        node->subList = NULL;
    }
    return node;
}

// 创建一个新的广义表
GList *createGList() 
{
    GList *list = (GList *)malloc(sizeof(GList));
    if (list != NULL) 
    {
        list->head = NULL;
    }
    return list;
}

// 在广义表尾部添加一个节点
void addGListNode(GList *list, char data) 
{
    GListNode *node = createGListNode(data);
    if (list->head == NULL) 
    {
        list->head = node;
    } 
    else 
    {
        GListNode *p = list->head;
        while (p->next != NULL) 
        {
            p = p->next;
        }
        p->next = node;
    }
}

// 在广义表中插入一个子表
void insertSubList(GListNode *node, GList *subList) 
{
    node->subList = subList->head;
}

// 计算广义表的深度
int getDepth(GList *list) 
{
    if (list->head == NULL) 
    {
        return 0; // 空表深度为0
    }
    int maxDepth = 0; // 初始化最大深度
    GListNode *p = list->head;
    while (p != NULL) 
    {
        int subListDepth = 0; // 子表深度
        if (p->subList != NULL) 
        {
            subListDepth = getDepth(p->subList); // 递归计算子表深度
        }
        maxDepth = (subListDepth + 1) > maxDepth ? (subListDepth + 1) : maxDepth; // 更新最大深度
        p = p->next;
    }
    return maxDepth;
}

int main() 
{
    GList *list = createGList();
    addGListNode(list, 'A');
    addGListNode(list, 'B');

    GList *subList1 = createGList();
    addGListNode(subList1, 'C');
    addGListNode(subList1, 'D');

    GList *subList2 = createGList();
    addGListNode(subList2, 'E');
    addGListNode(subList2, 'F');

    GListNode *p = list->head->next; // 指向第二个节点
    insertSubList(p, subList1);

    p = p->next; // 指向第三个节点
    insertSubList(p, subList2);

    int depth = getDepth(list);
    printf("广义表深度为:%d\n", depth);
    return 0;
}

六、易错提示

  • 指针越界: 在访问广义表中的元素时,一定要注意指针的移动范围,避免越界。

  • 递归调用错误: 在使用递归算法时,一定要正确设置递归的终止条件,避免无限递归。

  • 内存泄漏: 在创建和释放广义表节点时,一定要注意内存的分配和释放,避免内存泄漏。

七、代码分析

  • 存储结构: 代码中使用线性链表来存储广义表,每个节点包含数据、指向下一个节点的指针和指向子表的指针。

  • 深度计算: 深度计算使用递归算法,遍历广义表中的所有节点,计算每个节点的深度,并更新最大深度。

  • 内存管理: 代码中使用 malloc 和 free 函数来分配和释放内存,确保内存的正确使用。

八、深度剖析

  • 广义表的本质: 广义表是一种递归的数据结构,它允许嵌套结构,使其能够表示更加复杂的数据关系。

  • 广义表的应用: 广义表在很多领域都有应用,例如表示树形结构、表示多维数组、表示表达式等。

  • 广义表的实现: 广义表可以使用多种数据结构来实现,例如线性链表、树形结构等。选择合适的实现方法取决于项目的具体需求。

九、总结

        广义表是一种非常重要的数据结构,它能够表示更加复杂的数据关系,在很多领域都有应用。掌握广义表的概念、存储结构、运算方式等知识,对于开发高效的程序非常重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Map 双列集合根接口 HashMap TreeMap

Map接口是一种双列集合,它的每一个元素都包含一个键对象Key和值Value 键和值直接存在一种对应关系 称为映射 从Map集中中访问元素, 只要指定了Key 就是找到对应的Value 常用方法 HashMap实现类无重复键无序 它是Map 接口的一个实现类,用于存储键值映射关系,并且HashMap 集合没…

51单片机快速入门之 LED点阵 结合74hc595 的应用 2024/10/16

51单片机快速入门之 LED点阵 结合74hc595 的应用 74HC595是一种常用的数字电路芯片&#xff0c;具有串行输入并行输出的功能。它主要由两个部分组成&#xff1a;一个8位的移位寄存器和一个8位的存储寄存器。数据通过串行输入管脚&#xff08;DS&#xff09;逐位输入&#xff0…

unity Gpu优化

不一样的视角&#xff0c;深度解读unity性能优化。unity性能优化&#xff0c;unity内存优化&#xff0c;cpu优化&#xff0c;gpu优化&#xff0c;资源优化&#xff0c;资源包、资源去重优化&#xff0c;ugui优化。 gpu优化静态批处理静态批处理原理规则静态合批的原理静态合批的…

Spring Boot视频网站:安全与可扩展性设计

4 系统设计 4.1系统概要设计 视频网站系统并没有使用C/S结构&#xff0c;而是基于网络浏览器的方式去访问服务器&#xff0c;进而获取需要的数据信息&#xff0c;这种依靠浏览器进行数据访问的模式就是现在用得比较广泛的适用于广域网并且没有网速限制要求的B/S结构&#xff0c…

Appium环境搭建、Appium连接真机

文章目录 一、安装Android SDK二、安装Appium-desktop三、安装Appium Inspector 一、安装Android SDK 首先需要安装jdk&#xff0c;这里就不演示安装jdk的过程了 SDK下载地址&#xff1a;Android SDK 下载 1、点击 Android SDK 下载 -> SKD Tools 2、选择对应的版本进行下…

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…

云栖实录 | 智能运维年度重磅发布及大模型实践解读

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 钟炯恩 | 阿里云智能集团运维专家 张颖莹 | 阿里云智能集团算法专家 活动&#xff1a; 2024 云栖大会 AI 可观测专场 -智能运维&#xff1a;云原生大规模集群GitOps实践 2024 …

【c++】c++11多线程开发

2 C多线程 本文是参考爱编程的大丙c多线程部分内容&#xff0c;按照自己的理解对其进行整理的一篇学习笔记&#xff0c;具体一些APi的详细说明请参考大丙老师教程。 代码性能的问题主要包括两部分的内容&#xff0c;一个是前面提到资源的获取和释放&#xff0c;另外一个就是多…

使用rabbitmq-operator在k8s集群上部署rabbitmq实例

文章目录 前言一、rabbitmq-operator二、进行部署1.部署cluster-operator2.创建自己需要的特定命名空间3.创建rabbitmq的instance4.创建nodeport访问 结果验证 前言 使用rabbitmq-operator在k8s集群上部署rabbitmq实例。时区设置为上海 一、rabbitmq-operator 官网地址&#…

数学建模算法与应用 第16章 优化与模拟方法

目录 16.1 线性规划 Matlab代码示例&#xff1a;线性规划求解 16.2 整数规划 Matlab代码示例&#xff1a;整数规划求解 16.3 非线性规划 Matlab代码示例&#xff1a;非线性规划求解 16.4 蒙特卡洛模拟 Matlab代码示例&#xff1a;蒙特卡洛模拟计算圆周率 习题 16 总结…

java代码生成器集成dubbo,springcloud详解以及微服务遐想

摘要 今天终于有了点空闲时间&#xff0c;所以更新了一下代码生成器&#xff0c;修复了用户反馈的bug&#xff0c;本次更新主要增加了dubbo和springcloud脚手架的下载功能&#xff0c;架子是本人亲自搭建&#xff0c;方便自由扩展或者小白学习使用&#xff0c;你也许会问为什么…

红日安全vulnstack (二)

目录 环境搭建 网卡设置 修改Kali网段 IP 分布 WEB渗透 Weblogin服务开启 漏洞扫描 CVE工具利用 MSF上线 内网渗透 域内信息收集 凭证横向移动 权限维持 黄金票据 参考文章 https://www.cnblogs.com/bktown/p/16904232.htmlhttps://blog.csdn.net/m0_75178803/ar…

leetcode54:螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff1a;matrix [[1,2,3,…

hackmyvm-Hundred靶机

主机发现 sudo arp-scan -l 以sudo权限执行arp-scan -l 扫描并列出本地存在的机器&#xff0c;发现靶机ip为192.168.91.153 nmap扫描 端口发现 21/tcp open ftp 22/tcp open ssh 80/tcp open http web信息收集 我们先尝试一下ftp端口的匿名登录 FTP:是文件传输协议的端…

个人博客系统_测试报告

1.项目背景 基于SSM框架实现的个人博客系统&#xff0c;由五个页面构成&#xff1a;用户登录页、博客发表页、博客编辑页、博客列表页以及博客详情页。登录即可查看自己与其他用户已发布的博客&#xff0c;也可以使用自己的账号发布博客&#xff0c;通过使用Selenium定位web元…

《人工智能:CSDN 平台上的璀璨之星》

一、CSDN 上的 AI 热门话题 GPT-3 作为 CSDN 上的热门话题&#xff0c;其应用极为广泛。GPT-3 是 OpenAI 开发的一种基于 Transformer 架构的大规模预训练语言模型&#xff0c;拥有惊人的 1750 亿个参数。它具有多任务处理能力&#xff0c;能够执行多种自然语言处理任务&#x…

保护企业终端安全,天锐DLP帮助企业智能管控终端资产

为有效预防员工非法调包公司的软硬件终端资产&#xff0c;企业管理员必须建立高效的企业终端安全管控机制&#xff0c;确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统&#xff0c;确保任何未经授权的资产变动都能被迅…

Ajax处理错误信息(处理响应报文)

<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><form action""><div>用户名<input type"text" class"username"></div>…

【2024-10-16】某小破站w_rid参数分析

声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、参数分析三、代码一、前言 看一下小破站的参数加密 网址: aHR0cHM6Ly9zcGFjZS5iaWxpYmlsaS5jb20vNDA1Nz…

c++就业1.1.3海量数据去重的Hash与BloomFilter

找到具体的位置 通过映射 当前需要插入的指向 上一层最后一个 方便头插 布隆过滤器 - 查找是否有这个值 但是不能够返回value 服务器和过滤器进行网络交互 我们要知道这个key在不在mysql中 去查询并且在mysql中进行查询 所以在服务器部署布隆过滤器 为了节约内存 用位图 对str…