2014-11-20 49 views
1

假設我已經定義了以下列表:變異數據

(define a (list 1 2)) 
(define b (list a 3)) 

我定義a明確顯示,因爲我想修改裏面b列表。我是否需要重新構建整個數據結構以將項目添加到內部列表中?

編輯:我不想改變內部列表中的元素,我想添加另一個元素到內部列表中。

+0

注:在這種特殊情況下,你可能使用'set-car!'來更新'b'的_car_字段,而不必重構整個數據結構(r5rs)。 – xbug 2014-11-20 19:39:28

+0

我的錯,我在編輯 – mtyurt 2014-11-20 20:12:44

+0

@mtyurt這一切都是一樣的:只要使用'set-car!'和'set-cdr!'玩,並且將想要修改的對和參數值作爲參數傳遞,請參閱我的更新 – 2014-11-20 20:55:29

回答

3

只要您將需要修改的列表中的確切對和相應的值作爲參數傳遞,可以使用set-car!set-cdr!就地修改列表。例如,在內部列表替換元素:

(define a (list 1 2)) 
(define b (list a 3)) 

b 
=> '((1 2) 3) 

(set-car! (cdar b) 'x) 
b 
=> ((1 x) 3) 

如果你想添加另一個元素的內部列表,這樣做:

(set-cdr! (cdar b) '(4)) 
b 
=> ((1 x 4) 3) 
+0

問題是您建議的技術只修改列表的第三個元素。我如何將新元素添加到列表中? – mtyurt 2014-11-20 21:46:56

+1

@murturt你必須找到你想修改的_right pair_。如果它是第二對,那麼通過'(car b)',如果它是第三通道'(cdar b)',通過第四通道'(cddar b)'等等 - 你明白了,但要記住你只能放置那麼多'd',最好寫一個輔助方法來找到內部列表中的最後一個元素,即插入點。如果你理解如何使用'cons'操作 – 2014-11-20 21:53:26

+0

謝謝你構建了一個列表,那麼這將有很大的幫助。我找到了正確的組合,如下所示:'(set-cdr!(list-tail(car b)( - (length(car b))1))'(7))' – mtyurt 2014-11-20 21:55:22