Создать новый список из двух других, чтобы он содержал равные элементы из двух других списков - C (СИ)

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

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

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

Решение задачи: «Создать новый список из двух других, чтобы он содержал равные элементы из двух других списков»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* Элемент списка */
  5. typedef struct element
  6. {
  7.     int step, kof;
  8.     struct element *next;
  9. } elem;
  10.  
  11. /* Функция для создания элемента, возвращает указатель на новый элемент */
  12. elem *create(int step, int kof)
  13. {
  14.     elem *tmp = (elem*)malloc(sizeof(elem));
  15.     tmp->step = step;
  16.     tmp->kof = kof;
  17.     tmp->next = NULL;
  18.     return tmp;
  19. }
  20.  
  21. /* Рекурсивная чистка списка (передаем самый первый элемент) */
  22. void delete(elem *tmp)
  23. {
  24.     if (tmp->next) delete(tmp->next);
  25.     free(tmp);
  26. }
  27.  
  28. /* Хедер списка (для удобства, мы же белые люди) */
  29. typedef struct list_header
  30. {
  31.     elem *head, *end;
  32.     int size;
  33. } list;
  34.  
  35. /* Возвращает указатель на элемент списка с нужным индексом */
  36. elem *item(list *tmp, int index)
  37. {
  38.     int i;
  39.     if (!tmp || (index < 0 || index >= tmp->size)) return NULL;
  40.     if (index == 0) return tmp->head;
  41.     if (index == tmp->size-1) return tmp->end;
  42.     elem *counter = tmp->head;
  43.     for (i = 1; i <= index; i++) counter = counter->next;
  44.     return counter;
  45. }
  46.  
  47. /* Возвращает кол-во элементов с списке */
  48. int size_list(list *tmp)
  49. {
  50.     return tmp->size;
  51. }
  52.  
  53. /* Готовит хедер списка для работы */
  54. void init_list(list *tmp)
  55. {
  56.     tmp->head = tmp->end = NULL;
  57.     tmp->size = 0;
  58. }
  59.  
  60. /* Добавление элемента в нужный список */
  61. void add(list *vect, elem *tmp)
  62. {
  63.     if (!vect->head) vect->head = vect->end = tmp;
  64.     else
  65.     {
  66.         vect->end->next = tmp;
  67.         vect->end = tmp;
  68.     }
  69.     vect->size++;
  70. }
  71.  
  72. int main(int argc, char *argv[])
  73. {
  74.     list a, b, c; int n, i;
  75.     init_list(&a); init_list(&b); init_list(&c);
  76.     printf("Input count of elements:");
  77.     scanf("%i", &n);
  78.     /* Заполняем список А */
  79.         printf("List A:\n");
  80.     for (i = 0; i < n; i++)
  81.     {
  82.         int step, kof;
  83.         printf("\nInput %i elem:\nstep:", (i+1));
  84.         scanf("%i", &step);
  85.         printf("kof:");
  86.         scanf("%i", &kof);
  87.         add(&a, create(step, kof));
  88.     }
  89.     /* Заполняем список B */
  90.         printf("---\nList B:\n");
  91.     for (i = 0; i < n; i++)
  92.     {
  93.         int step, kof;
  94.         printf("\nInput %i elem:\nstep:", (i+1));
  95.         scanf("%i", &step);
  96.         printf("kof:");
  97.         scanf("%i", &kof);
  98.         add(&b, create(step, kof));
  99.     }
  100.         /* Сравниваем элементы и заносим одинаковые в список С */
  101.     for (i = 0; i < n; i++)
  102.     {
  103.         elem *tmp_a = item(&a, i), *tmp_b = item(&b, i);
  104.         if (tmp_a->step == tmp_b->step && tmp_a->kof == tmp_b->kof) add(&c, create(tmp_a->step, tmp_a->kof));
  105.     }
  106.     n = size_list(&c);
  107.         /* Выводим список С */
  108.     printf("---\nResult:\n");
  109.     for (i = 0; i < n; i++)
  110.     {
  111.         elem *tmp = item(&c, i);
  112.         printf("%i) step = %i. kof = %i\n", (i+1), tmp->step, tmp->kof);
  113.     }
  114.     delete(a.head); delete(b.head); delete(c.head);
  115.     return 0;
  116. }

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

  1. Создание нового элемента списка с использованием структурной переменной elem.
  2. Рекурсивная функция для очистки списка от элементов.
  3. Создание хедера списка для управления элементами.
  4. Функция для добавления элемента в список.
  5. Заполнение списка A с помощью пользовательского ввода.
  6. Заполнение списка B с помощью пользовательского ввода.
  7. Сравнение элементов из списков A и B и добавление одинаковых в список C.
  8. Вывод списка C на экран.
  9. Очистка памяти от выделенных элементов списка.
  10. Возвращение значения 0 для успешного завершения программы.

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


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

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

10   голосов , оценка 3.9 из 5

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

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

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