首页 > 软件开发 > 编程语言 >

广义表的长度和深度怎么算

来源:互联网 2023-03-17 00:01:28 版权归原作者所有,如有侵权,请联系我们

广义表(Lists,又称列表)是一种非线性的数据结构,是线性表的一种推广。即广义表中放松对表元素的原子限制,容许它们具有其自身结构。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。fTh办公区 - 实用经验教程分享!

工具/原料

  • 计算机
  • C语言

广义表的长度和深度的计算

  • 广义表的长度fTh办公区 - 实用经验教程分享!

    通过前一节对广义表的介绍,例子中给出了几个广义表的长度。例如:空表的长度为 0,只含有一个原子的广义表长度为 1,等等。

    fTh办公区 - 实用经验教程分享!

    fTh办公区 - 实用经验教程分享!

    广义表的长度指的是广义表中数据元素的数量。这里需要指明的是,一个广义表中,一个原子算做是一个元素,一个子表也只算做一个元素。

    fTh办公区 - 实用经验教程分享!

    fTh办公区 - 实用经验教程分享!

    在 LS = (a1,a2,…,an) 中,ai表示原子或者子表, LS 的长度为 n。fTh办公区 - 实用经验教程分享!

  • 广义表的深度fTh办公区 - 实用经验教程分享!

    广义表的深度,指的是广义表中括号的重数。

    fTh办公区 - 实用经验教程分享!

    例如:C=(a,(b,c,d)):fTh办公区 - 实用经验教程分享!

    fTh办公区 - 实用经验教程分享!

    广义表的长度和深度怎么算fTh办公区 - 实用经验教程分享!

  • 该信息未经许可获取自百度经验
  • 求解广义表的深度fTh办公区 - 实用经验教程分享!

    求广义表的深度之前,首先要将广义表用某个数据结构表示出来,在前边学习广义表时,介绍了两种表示广义表的方法。这里采用的方法是第一种。

    fTh办公区 - 实用经验教程分享!

    fTh办公区 - 实用经验教程分享!

    表示结构为:(拿广义表C为例)fTh办公区 - 实用经验教程分享!

    广义表第一节中有具体实现的代码,实现函数为:creatGlist(Glist C)。这里不再过多介绍。fTh办公区 - 实用经验教程分享!

    求广义表深度的算法用到的是递归的思想,解题思路是:fTh办公区 - 实用经验教程分享!

    从广义表 C 的开头位置,一次遍历表中每个数据元素:当遍历对象为原子时,返回原子的深度为 0 ;遍历对象为表 C 的子表时,继续遍历子表中的数据元素。fTh办公区 - 实用经验教程分享!

    递归的出口有两个:当遍历对象为原子时,返回 0 ;遍历对象为空表时,返回 1 (空表的深度为 1 );fTh办公区 - 实用经验教程分享!

    设置一个初始值为 0 的整形变量 max ,用 max 和遍历过程中返回的整形数值进行比较,取大的那一个,知道程序结束,max 1就是广义表的深度。fTh办公区 - 实用经验教程分享!

    fTh办公区 - 实用经验教程分享!

    广义表的长度和深度怎么算fTh办公区 - 实用经验教程分享!

  • int GlistDepth(Glist C){fTh办公区 - 实用经验教程分享!

      //如果表C为空表时,直接返回长度1;fTh办公区 - 实用经验教程分享!

      if (!C)   {fTh办公区 - 实用经验教程分享!

        return 1;fTh办公区 - 实用经验教程分享!

      }fTh办公区 - 实用经验教程分享!

      //如果表C为原子时,直接返回0;fTh办公区 - 实用经验教程分享!

      if (C->tag == 0)   {fTh办公区 - 实用经验教程分享!

        return 0;fTh办公区 - 实用经验教程分享!

      }fTh办公区 - 实用经验教程分享!

      int max = 0;  //设置表C的初始长度为0;fTh办公区 - 实用经验教程分享!

      for (Glist pp=C; pp; pp=pp->ptr.tp)   {fTh办公区 - 实用经验教程分享!

        int dep = GlistDepth(pp->ptr.hp);fTh办公区 - 实用经验教程分享!

        if (demax)     {fTh办公区 - 实用经验教程分享!

          max = dep;  //每次找到表中遍历到深度最大的表,并用max记录fTh办公区 - 实用经验教程分享!

        }fTh办公区 - 实用经验教程分享!

      }fTh办公区 - 实用经验教程分享!

      //程序运行至此处,表明广义表不是空表,由于原子返回的是0,而实际长度是1,所以,此处要 1;fTh办公区 - 实用经验教程分享!

      return max 1;fTh办公区 - 实用经验教程分享!

    }fTh办公区 - 实用经验教程分享!

完整代码

  • 1

    #include stdio.h>fTh办公区 - 实用经验教程分享!

    #include stdlib.h>fTh办公区 - 实用经验教程分享!

    typedef struct GLNode{fTh办公区 - 实用经验教程分享!

      int tag;  //标志域fTh办公区 - 实用经验教程分享!

      union  {fTh办公区 - 实用经验教程分享!

        char atom;  //原子结点的值域fTh办公区 - 实用经验教程分享!

        struct    {fTh办公区 - 实用经验教程分享!

          struct GLNode *hp, *tp;fTh办公区 - 实用经验教程分享!

        }ptr;  //子表结点的指针域,hp指向表头;tp指向表尾fTh办公区 - 实用经验教程分享!

      };fTh办公区 - 实用经验教程分享!

    }*Glist, GNode;fTh办公区 - 实用经验教程分享!

    Glist creatGlist(Glist C){fTh办公区 - 实用经验教程分享!

      //广义表CfTh办公区 - 实用经验教程分享!

      C=(Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      C->tag = 1;fTh办公区 - 实用经验教程分享!

      //表头原子‘a’fTh办公区 - 实用经验教程分享!

      C->ptr.hp = (Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      C->ptr.hp->tag = 0;fTh办公区 - 实用经验教程分享!

      C->ptr.hp->atom = 'a';fTh办公区 - 实用经验教程分享!

      //表尾子表(b,c,d),是一个整体fTh办公区 - 实用经验教程分享!

      C->ptr.tp = (Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      C->ptr.tp->tag = 1;fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp = (Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.tp = NULL;fTh办公区 - 实用经验教程分享!

      //开始存放下一个数据元素(b,c,d),表头为‘b’,表尾为(c,d)fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->tag = 1;fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.hp = (Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.hp->tag = 0;fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.hp->atom = 'b';fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp = (Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      //存放子表(c,d),表头为c,表尾为dfTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->tag = 1;fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.hp = (Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.hp->tag = 0;fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.hp->atom = 'c';fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.tp = (Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      //存放表尾dfTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->tag = 1;fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->ptr.hp = (Glist)malloc(sizeof(GNode));fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->ptr.hp->tag = 0;fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->ptr.hp->atom = 'd';fTh办公区 - 实用经验教程分享!

      C->ptr.tp->ptr.hp->ptr.tp->ptr.tp->ptr.tp = NULL;fTh办公区 - 实用经验教程分享!

      return C;fTh办公区 - 实用经验教程分享!

    }fTh办公区 - 实用经验教程分享!

    //求广义表的深度,递归调用fTh办公区 - 实用经验教程分享!

    int GlistDepth(Glist C){fTh办公区 - 实用经验教程分享!

      if (!C)   {fTh办公区 - 实用经验教程分享!

        return 1;fTh办公区 - 实用经验教程分享!

      }fTh办公区 - 实用经验教程分享!

      if (C->tag == 0)   {fTh办公区 - 实用经验教程分享!

        return 0;fTh办公区 - 实用经验教程分享!

      }fTh办公区 - 实用经验教程分享!

      int max = 0;fTh办公区 - 实用经验教程分享!

      for (Glist pp=C; pp; pp=pp->ptr.tp)   {fTh办公区 - 实用经验教程分享!

        int dep = GlistDepth(pp->ptr.hp);fTh办公区 - 实用经验教程分享!

        if (demax)     {fTh办公区 - 实用经验教程分享!

          max = dep;fTh办公区 - 实用经验教程分享!

        }fTh办公区 - 实用经验教程分享!

      }fTh办公区 - 实用经验教程分享!

      return max 1;fTh办公区 - 实用经验教程分享!

    }fTh办公区 - 实用经验教程分享!

    int main(int argc, const char *argv[]){fTh办公区 - 实用经验教程分享!

      Glist C = creatGlist(C);fTh办公区 - 实用经验教程分享!

      printf("%d", GlistDepth(C));fTh办公区 - 实用经验教程分享!

      return 0;fTh办公区 - 实用经验教程分享!

    }fTh办公区 - 实用经验教程分享!

    运行结果:fTh办公区 - 实用经验教程分享!

    2fTh办公区 - 实用经验教程分享!

  • 注意事项

    • 注意语法编写

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!fTh办公区 - 实用经验教程分享!


    标签: C语言编程

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号