Работа со списками - Lisp (229429)

Узнай цену своей работы

Формулировка задачи:

Организовать список, который будет содержать подсписки: имена столбцов и все остальные - значения строк. Требуется реализовать функции добавления,вставки и удаления. Добавление в конец; Вставка в указанную позицию; Удаление по номеру.
Листинг программы
  1. (list '(name1 name2)
  2. '(1 2)
  3. '(3 4))
Нужно,чтобы список имел вид "таблицы"(рисунок приложен). Не очень понятно, как это реализовывается. Что касается удаления по номеру:
Листинг программы
  1. (defun del (n l)
  2. (cond
  3. ((null l) nil)
  4. ( (not(atom (car l))) ( cons (del n (car l)) (del (- n (length (car l))) (cdr l))) )
  5. ((<= n 1) (del (- n 1) (cdr l)) )
  6. (t (cons (car l) (del (- n 1) (cdr l))))
  7. )
  8. )

Решение задачи: «Работа со списками»

textual
Листинг программы
  1. (defun ins-after-row (matr row n)
  2.   (cond ((= n 0) (cons (car matr) (cons row (cdr matr))))
  3.         (t (cons (car matr) (ins-after-row (cdr matr) row (- n 1))))))
  4.  
  5. ==> ins-after-row
  6.  
  7. (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)
  8.  
  9. ==> ((name-1 name-2 name-3) (1 2 3) (4 5 6) (x y z) (7 8 9) (a b c))
  10.  
  11. (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)
  12.  
  13. ==> ((name-1 name-2 name-3) (1 2 3) (x y z) (4 5 6) (7 8 9) (a b c))
  14.  
  15. (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)
  16.  
  17. ==> ((name-1 name-2 name-3) (x y z) (1 2 3) (4 5 6) (7 8 9) (a b c))

Объяснение кода листинга программы

Функция ins-after-row принимает три аргумента:

  1. matr - список, в который нужно вставить новый элемент.
  2. row - элемент, который нужно вставить.
  3. n - номер элемента, после которого нужно вставить row. Если n равно 0, то функция возвращает новый список, в котором row добавлена в начало matr. Если n больше 0, то функция рекурсивно вызывает саму себя, пока не достигнет n равным 0, и добавляет row после соответствующего элемента. Вот примеры вызовов функции ins-after-row:
  4. (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)).
  5. (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)).
  6. (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)).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут