Работа со списками - Lisp (229429)
Формулировка задачи:
Организовать список, который будет содержать подсписки: имена столбцов и все остальные - значения строк. Требуется реализовать функции добавления,вставки и удаления.
Добавление в конец;
Вставка в указанную позицию;
Удаление по номеру.
Нужно,чтобы список имел вид "таблицы"(рисунок приложен). Не очень понятно, как это реализовывается.
Что касается удаления по номеру:
(list '(name1 name2) '(1 2) '(3 4))
(defun del (n l)
(cond
((null l) nil)
( (not(atom (car l))) ( cons (del n (car l)) (del (- n (length (car l))) (cdr l))) )
((<= n 1) (del (- n 1) (cdr l)) )
(t (cons (car l) (del (- n 1) (cdr l))))
)
)Решение задачи: «Работа со списками»
textual
Листинг программы
(defun ins-after-row (matr row n) (cond ((= n 0) (cons (car matr) (cons row (cdr matr)))) (t (cons (car matr) (ins-after-row (cdr matr) row (- n 1)))))) ==> ins-after-row (ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 2) ==> ((name-1 name-2 name-3) (1 2 3) (4 5 6) (x y z) (7 8 9) (a b c)) (ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 1) ==> ((name-1 name-2 name-3) (1 2 3) (x y z) (4 5 6) (7 8 9) (a b c)) (ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 0) ==> ((name-1 name-2 name-3) (x y z) (1 2 3) (4 5 6) (7 8 9) (a b c))
Объяснение кода листинга программы
Функция ins-after-row принимает три аргумента:
matr- список, в который нужно вставить новый элемент.row- элемент, который нужно вставить.n- номер элемента, после которого нужно вставитьrow. Еслиnравно 0, то функция возвращает новый список, в которомrowдобавлена в началоmatr. Еслиnбольше 0, то функция рекурсивно вызывает саму себя, пока не достигнетnравным 0, и добавляетrowпосле соответствующего элемента. Вот примеры вызовов функцииins-after-row:(ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 2)В этом примере функцияins-after-rowбудет вызвана с аргументамиmatr = '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)),row = '(x y z)иn = 2. Посколькуnбольше 0, функция рекурсивно вызывает саму себя с аргументамиcdr matr = '(4 5 6)иn = (- n 1) = 1. Затем функция возвращает новый список((name-1 name-2 name-3) (1 2 3) (x y z) (4 5 6) (7 8 9) (a b c)).(ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 1)В этом примере функцияins-after-rowбудет вызвана с аргументамиmatr = '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)),row = '(x y z)иn = 1. Посколькуnбольше 0, функция рекурсивно вызывает саму себя с аргументамиcdr matr = '(4 5 6)иn = (- n 1) = 0. Затем функция возвращает новый список((name-1 name-2 name-3) (x y z) (4 5 6) (7 8 9) (a b c)).(ins-after-row '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)) '(x y z) 0)В этом примере функцияins-after-rowбудет вызвана с аргументамиmatr = '((name-1 name-2 name-3) (1 2 3) (4 5 6) (7 8 9) (a b c)),row = '(x y z)иn = 0. Посколькуnравно 0, функция возвращает новый список((name-1 name-2 name-3) (x y z) (1 2 3) (4 5 6) (7 8 9) (a b c)).