1

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

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

当我找到那个元素时,我想添加它。像搜索name10然后将新名称添加到name11andname12组。任何帮助深表感谢!

(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

)

这是我到目前为止所拥有的,它会找到我想要添加它的位置,但我无法添加到那个位置。

4

1 回答 1

1

在您在那里添加新值之后,您必须在从找到的点返回的途中重建新树。因此,您必须在现在停止的位置上方停止一级: at(name old-value ...)而不是 at name。这意味着您必须测试与 的相等性(car treenode),而不是treenode自身。这样您就可以构建一个的关联组

(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))))))) 
于 2013-07-18T06:55:27.260 回答