搜索并添加到Scheme中的列表

时间:2013-07-18 04:05:45

标签: list search scheme add

我想在列表中搜索一个元素,就像这个(它是一个列表列表)

(name1 (name2 (name3 name4) (name5 (name6))) (name7 (name8 name9)) (name10 (name11 name12)) (name13))

当我发现要添加的元素时。 与搜索name10一样,然后为name11name12组添加新名称。 非常感谢任何帮助!

(define (adder name2badded indexname treenode)
  (display treenode)
  (newline)
      (cond
        ((null? treenode)#f) ;"Tree is null"))
        ((pair? treenode)
           (if (adder name2badded indexname (car treenode))
             (display "Gotcha!")
           (adder name2badded indexname (cdr treenode))
       )
    ) ;END pair?
    (else
      (eq? indexname treenode)
    );END else
  );END Cond

)

这是我到目前为止,它会找到我想添加它的地方,但我无法添加到那个地方。

1 个答案:

答案 0 :(得分:1)

在您添加新值后,必须在找回点的路上重建新树。因此,您必须在当前停止的位置停留一级:(name old-value ...)而不是name。这意味着您必须使用(car treenode)测试是否相等,而不是treenode本身。这样,您就可以将 new 关联组构建为

(cons (car treenode) (cons val2add (cdr treenode)))

你需要改变递归结构以使用这个新的更新的关联组而不是旧的关联组,在你回来的路上重建整个树:

(define (add-into val2add name tree)
  (if (pair? tree)
    (if (eqv? name (car tree))
      (cons name (cons val2add (cdr tree)))      ; found!
      (cons (add-into val2add name (car tree))   ; it's in CAR or in CDR,
            (add-into val2add name (cdr tree)))) ;   or maybe in both?
    tree))

但如果您的树实际上是一个关联列表并且您被允许使用手术例程,那么您可以使用

(define (add-into! val2add name als) 
  (cond ((assv name als) => 
           (lambda (a)
            (set-cdr! a (cons val2add (cdr a)))))))