2014-11-20 1 views
1

Предположим, я определены следующие списки:мутирует данные в комплексном списке

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

Я определил a явно показать, потому что я хочу, чтобы изменить список внутри b. Нужно ли мне перестроить целую структуру данных с нуля, чтобы добавить элемент во внутренний список?

Редактировать: Я не пытаюсь изменить элемент во внутреннем списке, я хочу добавить еще один элемент во внутренний список.

+0

примечание: в данном конкретном случае, вы можете используйте 'set-car!' для обновления поля _car_ 'b' без необходимости восстановления всей структуры данных (r5rs). – xbug

+0

Неплохо, я редактирую вопрос – mtyurt

+0

@mtyurt это одно и то же: просто играйте с 'set-car!' И 'set-cdr!' И передавайте в качестве параметров пару, которую вы хотите изменить, и значение, см. мое обновление –

ответ

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

+1

@mtyurt вам нужно найти _right pair_, который вы хотите изменить. Если это вторая пара, то передайте '(автомобиль b)', если это третий проход '(cdar b)', для четвертого прохода '(cddar b)' и т. Д. - вы получите эту идею, но имейте в виду, что вы можете разместить только столько 'd', лучше написать вспомогательный метод, чтобы найти последний элемент во внутреннем списке, который является точкой вставки. Это поможет _a lot_, если вы поймете, как создается список с использованием операций 'cons' –

+0

. Я нашел правильную комбинацию следующим образом: '(set-cdr! (List-tail (car b) (- (длина (автомобиль b)) 1)) '(7))' – mtyurt

 Смежные вопросы

  • Нет связанных вопросов^_^