eachy 发表于 2005-8-31 14:48:36

[LISP函数-表]:表中指定位置插入新元素或删除指定位置元素


;; ! ****************************************************************************
;; !xd-Insitem          作者: eachy [www.xdcad.net]                           
;; ! ****************************************************************************
;; ! 功能   : 表中指定位置插入新元素或删除指定位置元素                        
;; ! 参数   :                                                                  
;; !            'l'       -表                                                
;; !         'item'    -索引值或索引值表                                    
;; !         'element' -插入的元素或对应索引值表数量的插入元素表,nil 时为删除
;; !                  指定位置元素                                             
;; ! 返回值   : 成功返回新表,否则返回原表                                       
;; !                                                                           
;; ! 注意   : 1 插入/删除位置为相对原表的位置,从 0 计数                     
;; !                                                                           
;; ! e-mail   : eachy@21cn.com                                                   
;; !                                                                           
;; ! Web      : www.xdcad.net                                                   
;; ! ****************************************************************************
;; eq .
;; _$ (ea:insitem '(1 2 3 4 5 6) 2 0)
;;(1 2 3 0 4 5 6)
;;_$ (ea:insitem '(1 2 3 4 5 6) '(1 4)'(0))
;;(1 2 0 3 4 5 nil 6)
;;_$ (ea:insitem '(1 2 3 4 5 6) '(1 4)'(0 0))
;;(1 2 0 3 4 5 0 6)
;;_$ (ea:insitem '(1 2 3 4 5 6) '(1 4)nil)
;;(1 3 4 6)
;;_$ (ea:insitem '(1 2 3 4 5 6) 4nil)
;;(1 2 3 4 6)
(defun xd-Insitem (l item element / n ll i pos l1)
(setq n 0 l1 l)
(if (= (type item) 'INT)
    (setq item (list item))
)
(if (and element
           (/= (type element) 'LIST)
      )
    (setq element (list element))
)
(if element
    (while l
      (setq i (car l))
      (if ll
        (if (setq pos (vl-position n item))
          (setq ll (append (list (nth pos element) i) ll))
          (setq ll (cons i ll))
        )
        (setq ll (cons i ll))
      )
      (setq n (1+ n)
          l (cdr l)
      )
    )
    (while l
      (setq i (car l))
      (if (not (vl-position n item))
        (setq ll (cons i ll))
      )
      (setq n (1+ n)
          l (cdr l)
      )
    )
)
(if ll
    (reverse ll)
    l1
)
)

狂刀 发表于 2005-9-1 01:24:23

表中指定位置插入新元素或删除指定位置元素
;; _$ (ea:insitem '(1 2 3 4 5 6) 2 0)
;;(1 2 3 0 4 5 6)
位数有误,应为(1 2 0 3 4 5 6)
或表述为,“指定位置之后插入新元素或删除指定位置元素”
;| (xl-subi lst ilst nlst)---------作者: 狂刀 [www.xdcad.net]
功能   : 表中指定位置插入新元素或删除指定位置元素
参数   : lst = 表 ;
         ilst = 索引值或索引值表;
         nlst = 插入的元素或对应索引值表数量的插入元素表,nil 时为删除;
返回值   : 成功返回新表,否则返回原表;
注意   : 1 插入/删除位置为相对原表的位置,从 0 计数;
实 例  :
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 0) ) ;;->(1 0 2 3 4 0 5 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 nil)) ;;->(1 0 2 3 4 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) '(0 )) ;;->(1 0 2 3 4 6)
(xl-subi '(1 2 3 4 5 6) '(1 4) nil);;->(1 3 4 6)
(xl-subi '(1 2 3 4 5 6)2 0);;->(1 2 0 3 4 5 6)
(xl-subi '(1 2 3 4 5 6) 2 nil);;->(1 2 4 5 6)
|;
(defun xl-subi (lst ilst nlst / i a) ;; by 狂刀.2005.8
(if (/= 'LIST (type ilst))(setq ilst (list ilst)))
(if (/= 'LIST (type nlst))(setq nlst (list nlst)))
(apply 'append (mapcar '(lambda(x)
                          (setq i (if i (1+ i) 0))
                          (if (= (car ilst) i)
                          (progn
                              (setq ilst (cdr ilst)
                                  a    (car nlst)
                                  nlst (cdr nlst))
                              (if a (list a x)nil)
                             )
                          (list x)
                           )
                          )
                     lst)
)
)

Dallas_whu 发表于 2005-11-3 12:57:35

两位的都很精彩,不要一味在概念理解偏差上纠缠!

q3_2006 发表于 2013-6-17 07:26:48

先收了再消化!

yoyoho 发表于 2013-6-22 11:45:57

感谢eachy 及 狂刀 分享函数!

GTJ116600 发表于 2013-6-28 09:11:44

感谢两位大侠提供精彩函数,呵呵,不过一时半刻还真消化不了呀

wowan1314 发表于 2013-7-20 14:05:09

本帖最后由 wowan1314 于 2013-7-20 14:12 编辑

我也来凑热闹!;============{ 在指定位置删除或插入元素 }===============
;nil表示要删除。如果有值为要插入的元素---by wowan1314
;(t11 '(1 2 3 4 5 6) 2 0);;->(1 2 0 3 4 5 6)
;(t11 '(1 2 3 4 5 6) 2 nil);;->(1 2 4 5 6)
;2013年7月20日 星期六
(defun t11 (lst pos mod / qlst a hlst)
    (setq a -1)
    (setq hlst (vl-member-if-not
            '(lambda(x)
                (setq a (1+ a))
                (if (= a pos) nil
                  (setq qlst (cons x qlst))
                )
            )
            lst
      )
    )
    (if mod
      (apply 'append (list (reverse(cons mod qlst)) hlst))
      (apply 'append (list (reverse qlst) (cdr hlst)))
    )
)

zhangq_cai1 发表于 2013-7-20 15:10:01

来看看,收藏了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·····

lianghui2018 发表于 2014-3-23 22:23:15

谢谢老师的分享

kkt123 发表于 2015-2-12 10:36:24

来看看,收藏了;P

小菜 发表于 2021-3-31 11:20:16

本帖最后由 小菜 于 2021-3-31 12:58 编辑

楼主的函数确实有误,如:(ea:insitem '(1 2 3 4 5 6) 0 0)
狂刀的也有问题 (xl-subi '(1 2 3 4 5 6)6 0)


pxt2015 发表于 2021-4-3 19:22:21

小菜 发表于 2021-3-31 11:20
楼主的函数确实有误,如:(ea:insitem '(1 2 3 4 5 6) 0 0)
狂刀的也有问题 (xl-subi '(1 2 3 4 5 6)6 0 ...

确实有bug,可惜Eachy和狂刀潜水太深,都快成为传说中的大神了。
这个板块也是冷清清的。

weizx2000 发表于 2021-4-10 18:08:43

谢谢分享谢谢分享
页: [1]
查看完整版本: [LISP函数-表]:表中指定位置插入新元素或删除指定位置元素