首页 > 其他分享 >C语言实现广义表

C语言实现广义表

时间:2022-10-12 17:58:46浏览次数:54  
标签:实现 代码 GList 原子 un 广义 C语言 节点

前言

在学习广义表的时候,我先是翻阅了严蔚敏老师的《数据结构》第二版教材,然后翻阅了我们上课的教材,周桂红老师的《数据结构》第一版,两本书中,广义表都在"串、数组、广义表"这个章节,大概是第四章。问题来了,严老师的教材对于广义表的代码实现没有提及,周老师的教材对于广义表的代码实现只是给了纯代码,加上代码中寥寥无几的注释,特别是在建立广义表的代码实现上面,逻辑复杂难懂,没有阐述实现的基本思想。

后来,我先是取到了 BliBli 视频网站上面去搜索有关广义表的学习视频,第一个找到的是青岛大学老师的教学视频,但是此视频只讲原理不讲代码如何实现,接下来我先后在 CSDN,C 语言中文网,C 语言网查找资料,发现有的标题写的 C 语言实现广义表,但是代码却是使用的 C++写的,有的文章写的好,但只写了如何创建,没有一篇是代码和实现思想均有详细清晰阐述的文章。于是我决定自己不看教材,试着自己写一个代码实现,其中包含一些基本运算函数。

广义表的存储结构

本例子基于实现此图,实现广义表 (a,(b,c,d))

typedef struct Node
{
    int tag; //标志域
    union
    {
        char atom; //原子结点的值域
        struct
        {
            struct Node *hp, *tp;
        } ptr; //子表结点的指针域,hp指向表头;tp指向表尾
    } un;
} GList;

广义表创建的基本思想

由于广义表的每一个节点,可能是原子节点,也可能是表节点,那么我们将创建表节点和原子节点分开,分别编写函数

创建原子节点

  1. 设置原子节点的标识域
  2. 开辟原子域空间
  3. 设置原子域的标志域
  4. 设置原子域的原子值
  5. 为原子节点尾指针开辟空间
  6. 返回原子节点的尾指针

创建表节点

  1. 设置表节点的标识域
  2. 设置表节点的尾指针
  3. 创建子节点并开辟空间
  4. 返回子节点的头指针

广义表的取头尾操作

较为简单,直接看代码示例。

GList *Get_Head(GList *L)
{
    GList *head = L->un.ptr.hp;

    return head;
}

GList *Get_Tail(GList *L)
{
    GList *tail = L->un.ptr.tp;
    return tail;
}

广义表遍历的基本思想

如果发现标识域等于 0,那么就是原子节点,直接打印,否则就分别递归头指针和为尾指针。

int GListTraverse(GList *L)
{

    if (L == NULL)
    {
        return 0;
    }
    // 如果该节点为原子节点,打印
    if (L->tag == 0)
    {
        printf("%c", L->un.atom);
    }
    // 如果该节点为表节点,递归函数
    else if (L->tag == 1)
    {
        GListTraverse(L->un.ptr.hp);
        GListTraverse(L->un.ptr.tp);
    }
}

广义表求深度基本思想

和遍历类似,如果是表节点那么深度depth就自增。

int GList_Depth(GList *L)
{
    int depth = 1;

    if (L == NULL)
    {
        return depth;
    }

    // 如果该节点为表节点,递归函数
    if (L->tag == 1)
    {
        depth++;
        GList_Depth(L->un.ptr.tp);
    }

    return depth;
}

本文完整代码

标签:实现,代码,GList,原子,un,广义,C语言,节点
From: https://www.cnblogs.com/huanghongzhe/p/16785412.html

相关文章

  • [caffe解读] caffe从数学公式到代码实现3-shape相关类
    接着上一篇说,本篇开始读layers下面的一些与blobshape有关的layer,比如flatten_layer.cpp等,具体包括的在下面;flatten_layer.cppconv与deconv虽然也与shape有关,但是由于比较复......
  • [caffe解读] caffe从数学公式到代码实现1-导论
    新板块说明今天开一个新板块,目标是死磕现有的几大机器学习框架的代码,给想入门的小白们一些帮助。作为一个在图像行业战斗了几年的程序员,深知入门一个框架,和真的能用好一个框......
  • [caffe解读] caffe从数学公式到代码实现2-基础函数类
    接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些cpp。absval_layer.cpp其中,下面这些layer是不需要反向传播的,大部分都是io类,我们就不讲了,自己去看。thres......
  • HTML5 组件Canvas实现图像灰度化
    作者| 贾志刚HTML5发布很长一段时间了,一直以来没有仔细的看过,学习后,发现HTML5中的Canvas组件功能是如此的强大,今天我们一起来看看HTML5Canvas是怎么做到的吧!1.新建一个h......
  • Redis持久化实现的简单过程
    Redis有3种实现持久化的方式:AOF日志、RDB快照、混合持久化Redis写入AOF日志的过程Redis执行完写操作命令后,将命令追加到server.aof_buf缓冲区通过write()系统调用,将a......
  • Redis实现搜索历史
    需求:实现搜索历史最大保存N条,保存N天一.RedisTemplate Stringkey=RedisKeyPrefix.识虫历史记录.getKey()+SecurityUtils.getLoginUser().getUser().getUserI......
  • C++ 实现视频文件播放(Windows Media Player、MFC、C#)
    <fontcolor=purplesize=5face="隶书">无为也,则用天下而有余;有为也,则为天下用而不足。1、简介https://docs.microsoft.com/en-us/windows/win32/wmp/about-the-windows-......
  • 单链表-Python实现-jupyter->markdown 格式测试
    单链表引入顺序表理解Python变量的本质:变量存储的不是值,是值的地址理解Python的"="表示的是指向关系案例:交换a,b的值,a=10,b=20a,b=20,10t0:a这块内存(也有id),......
  • LcdToos如何实现PX01自动调Flicker及VCOM烧录
    准备工作:LcdTools+PX01点亮需调Flicker的屏;F118Flicker探头,用于自动Flicker校准测量,F118连接PX01上电后,探头屏会提示零点校准,此时需盖住探头窗口再按探头“MODE”按......
  • [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积
    今天要讲的就是跟卷积相关的一些layer了im2col_layer.cppbase_conv_layer.cppconv_layer.cppdeconv_layer.cppinner_product_layer.cpp01im2col_layer.cpp这是caffe里面的重......