(define (delete x xs)
(if (or (null? xs) (< x (car xs)))
xs
(if (= x (car xs))
(cdr xs)
(cons (car xs) (delete x (cdr xs)))))))
では、(delete 4 '(1 4 4 7))は (1 4 7)になってしまう。
(delete 4 '(1 4 4 7))が (1 7)になるように
deleteを定義し直せ。
(4が何回続こうが、
(delete 4 '(1 4 ... 4 7))は (1 7)にならなければいけない。)
(define schedule '((1300 "Lunch") (1800 "Dinner"))) (set! schedule (insert '(1600 "Tea") schedule))とすると、scheduleが
((1300 "Lunch") (1600 "Tea")(1800 "Dinner"))になる。
(define (add1 xs)
(if (null? xs)
'()
(cons (+ 1 (car xs)) (add1 (cdr xs)))))
(define (add1! xs)
(if (null? xs)
'()
(begin (set-car! xs (+ (car xs) 1))
(add1! (cdr xs)))))
(define (append xs ys)
(if (null? xs)
ys
(cons (car xs) (append (cdr xs) ys))))
(define (append! xs ys)
(if (null? (cdr xs))
(set-cdr! xs ys)
(append! (cdr xs) ys)))
とそれぞれ同等の関数を C言語で定義せよ。
ただし、
テストとして次のような一連の文を実行するプログラムを作成して、
動作を確かめよ。
List list1, list2;
printf("Please Input List 1: ");
list1 = read_list(); /* リストその 1の入力 */
printf("Please Input List 2: ");
list2 = read_list(); /* リストその 2の入力 */
printf("(add1 list1) => \t");
print_list(add1(list1)); /* add1のテストの結果出力 */
putchar('\n');
add1EX(list1);
printf("(append list1 list2) => \t");
print_list(append(list1, list2)); /* add1!と appendのテストの結果出力 */
putchar('\n');
appendEX(list1, list2); /* append!のテストの結果出力 */
printf("list1 => \t");
print_list(list1);
putchar('\n');
さらに余裕のある人は次のボーナス問題を(できるだけたくさん) 解いてください。
問は数人で相談して解いても良いが、実行例は必ず各自で作成すること。 問の答と実行例がまったく同一のレポートは不正レポートと見なす。