可以从cons单元构建树的数据结构,如清单列表。

为了实现树形结构,则必须设计功能,将遍历cons 单元,在特定的顺序,例如,前序,顺序和后序的二进制树。

树列表的列表

让我们考虑由cons单元的树状结构,形成列出的清单如下:

((1 2) (3 4) (5 6)).

图解,它可以表示为:

LISP树的功能

虽然多数时候仍需要根据其它特殊需求编写自己的树的功能,LISP提供了一些树的功能,您可以使用。

除了所有列表函数,以下是工作在树结构函数:

函数

描述

copy-treex &optional vecp

它返回cons单元×树的副本。它递归地拷贝两款车和cdr方向。如果x不是一个cons单元,该函数只返回x不变。如果可选vecp参数为true,这个函数将向量(递归),以及cons单元。

tree-equal x y &key :test :test-not :key

它比较两棵树的cons单元。如果x和y是两个cons单元,他们的汽车和cdr是递归比较。如果x和y都不是一个cons单元,它们是由eql比较,或根据指定的测试。:key函数,如果指定,应用到这两个目录树中的元素。

substnew old tree &key :test :test-not :key

它可以代替出现给老项与新项,在树,这是cons单元的一棵树。

nsubstnew old tree &key :test :test-not :key

它的工作原理与subst相同,但它破坏了原来的树。

sublisalist tree &key :test :test-not :key

它的工作原理就像subst,只不过它采用的新旧对关联表alist。树(应用后:key函数,如果有的话)中的每个元素,与alist的车相比;如果它匹配,它被替换为相应的cdr。

nsublisalist tree &key :test :test-not :key

它的工作原理与sublis相同,而是一个破坏性的版本。

示例 1

创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:

(setq lst(list'(1 2) '(34)'(5 6))) (setq mylst (copy-list lst)) (setq tr (copy-tree lst)) (write lst) (terpri) (write mylst) (terpri) (write tr)

当执行代码,它返回以下结果:

((12)(34)(56))((12)(34)(56))((12)(34)(56))

示例 2

创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:

(setq tr'((1 2 (3 4 5) ((7 8) (7 8 9))))) (write tr) (setq trs (subst 7 1 tr)) (terpri) (write trs)

当执行代码,它返回以下结果:

((12(345)((78)(789))))((72(345)((78)(789))))

建立自己的树

让我们尝试建立自己的树,使用LISP列表功能。

首先,让我们创建一个包含一些数据的新节点:

(defun make-tree(item)"it creates a new node with item."(cons(cons itemnil)nil))

接下来让我们添加一个子节点插入到树:它会采取两种树节点,并添加第二棵树作为第一个的子树。

(defun add-child(tree child)(setf(car tree)(append(car tree)child))tree)

接下来让我们添加一个子节点插入到树:这将需要一个树节点,并返回该节点第一个子节点,或nil,如果这个节点没有任何子节点。

(defun first-child(tree)(if(nulltree)nil(cdr(car tree))))

这个函数会返回一个给定节点的下一个同级节点:它需要一个树节点作为参数,并返回一个指向下一个同级节点,或者为nil,如果该节点没有任何。

(defunnext-sibling(tree)(cdr tree))

最后,我们需要一个函数来返回一个节点的信息:

(defun data(tree)(car(car tree)))

示例

本示例使用上述功能:

创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:

(defun make-tree(item)"it creates a new node with item."(cons(cons itemnil)nil))(defun first-child(tree)(if(nulltree)nil(cdr(car tree))))(defunnext-sibling(tree)(cdr tree))(defun data(tree)(car(car tree)))(defun add-child(tree child)(setf(car tree)(append(car tree)child))tree)(setq tr'((1 2 (3 4 5) ((7 8) (7 8 9))))) (setq mytree (make-tree 10)) (write (data mytree)) (terpri) (write (first-child tr)) (terpri) (setq newtree (add-child tr mytree)) (terpri) (write newtree)

当执行代码,它返回以下结果:

10(2(345)((78)(789)))((12(345)((78)(789))(10)))

¥ 我要打赏 纠错/补充 收藏

lisp程序绘制大树_LISP – 树相关推荐

  1. lisp语言绘制路灯_LISP语言在AD道路设计方案中各种应用

    第三章 LISP 语言在 CAD 道路设计中地各种应用 3.1 绘制平面任意函数曲线地 AutoLISP 程序设计 在各个工程设计领域中 , 经常要绘制一些曲线 , 特别是平面曲线 , 如水工结构地溢 ...

  2. lisp绘制法兰_lisp语言画键槽_用LISP语言自定义AutoCAD命令

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 用LISP语言自定义AutoCAD命令 AutoLISP语言作为AutoCAD的二次开发工具,虽然在功能.运行速度和保密性等方面比起ARX等工具要逊色一些 ...

  3. cad渐开线画法lisp程序_CAD插件——绘制圆的渐开线

    机械行业在使用CAD的时候,常常会需要绘制圆的渐开线.在网上找到一个画渐开线的LISP程序,不知道有没有人需要. 什么是圆的渐开线? 把一条没有弹性的细绳绕在一个定圆上,拉开绳子的一端并拉直,使绳子与 ...

  4. lisp地物代码_一种用AutoLISP程序绘制独立地物的方法

    赵龙 摘 要:在地图上无法按照比例表示的一些地物,统称为独立地物.它一般高出于其他建筑物,具有明显的方位意义,对地图定向.判断方位等意义较大.独立地物因无法依真型显示,所以大都用几何符号来表示.在地图 ...

  5. 给Lisp程序员的Python简介

    给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<zzljlu@gmail.com> 这是一篇为Lisp程序员写的Python简介(一些Pyth ...

  6. python lisp_给Lisp程序员的Python简介

    作者:Peter Norvig,译者:jineslong 这是一篇为Lisp程序员写的Python简介(一些Python程序员告诉我,这篇文章对他们学习Lisp也有帮助,尽管这不是我的本意).基本上, ...

  7. lisp和python_给Lisp程序员的Python简介

    作者:Peter Norvig,译者:jineslong 这是一篇为Lisp程序员写的Python简介(一些Python程序员告诉我,这篇文章对他们学习Lisp也有帮助,尽管这不是我的本意).基本上, ...

  8. lisp和python_给 Lisp 程序员的 Python 简介

    这是一篇为Lisp程序员写的Python简介(一些Python程序员告诉 我,这篇文章对他们学习Lisp也有帮助,尽管这不是我的本意).基本上,Python可以看作一个拥有"传统" ...

  9. lisp调用qleader端点_超经典【CAD】 lisp程序集锦、【CAD】快捷键大全(好).doc

    超经典CAD lisp程序集锦 如果您使用 AutoCAD,下面的内容对您一定有帮助.在某些方面能大大提高 您的工作效率.下面的程序均以源程序方式给出,您可以使用.参考.修改它. bg.lsp 表格自 ...

最新文章

  1. datagrid DataFormatString
  2. 华为云桌面客户端_入冬第一场技术盛宴!DevRun开发者沙龙华为云武汉专场举办...
  3. skyline三维模型规格
  4. Duilib技巧:背景图片平铺
  5. change事件判断ajax,jquery中change事件里面if语句失效
  6. 适合初学者快速入门的Numpy实战全集
  7. 指针,c语言关键字,作用域,生命周期,内存数据存储
  8. 美国第一大移动运营商的5G战略:已进入预商用测试
  9. Vue.js(17)之 插槽
  10. 华为手机获取状态栏高度是错误的_你的华为手机状态栏有HD图标吗?这又代表着什么?看完你就懂了...
  11. jQuery教程06-基本筛选选择器
  12. 预测未来的环境,提前做出改变
  13. Android写log到文件模版
  14. 计算机对团队合作的重要性,最新研究表明:计算机+协作完败面对面协作、计算机独立工作...
  15. 推荐一个自己喜欢的pycharm主题
  16. MP1655GG-Z MPS/美国芯源 MOSFET 的开关模式转换器 资源 方案
  17. 未来技术展望(一):混沌工程与ChaosBlade
  18. 南京logo设计,企业标志商标VI设计
  19. Linux配置(购买云服务器)
  20. CSS-Sprite(雪碧图)

热门文章

  1. php emoji 去掉,php如何实现去除emoji
  2. 淘宝、天猫、1688产品详情页API、DESC、SKU信息获取展示
  3. 音视频开发系列(65)-FFMPEG进阶系列01-ffplay命令详解
  4. 天空卫士:以技术创新能力,为信创产业建设赋能
  5. 《社群经济:移动互联时代的生存哲学》读书笔记
  6. 浮点数(3.14+1e10)-1e10 = 0的过程分析
  7. wps右边的标记区域怎么去掉_wpsword视图去掉标记 wps怎么取消标记
  8. 用Python表白,把爱和情书写进程序里
  9. 七种方法计算文本相似度方法
  10. 拉线式位移传感器线性精度和重复精度的区别