Создать новый список из двух других, чтобы он содержал равные элементы из двух других списков - C (СИ)
Формулировка задачи:
Здравствуйте, подскажите пожалуйста, как можно создать новый список из двух других, чтобы он содержал равные элементы из двух других списков.
Я знаю, как создать список и как в него добавить значения, но не могу понять как правильно нужно сравнить элементы все, чтобы потом их записать в третий
Решение задачи: «Создать новый список из двух других, чтобы он содержал равные элементы из двух других списков»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- /* Элемент списка */
- typedef struct element
- {
- int step, kof;
- struct element *next;
- } elem;
- /* Функция для создания элемента, возвращает указатель на новый элемент */
- elem *create(int step, int kof)
- {
- elem *tmp = (elem*)malloc(sizeof(elem));
- tmp->step = step;
- tmp->kof = kof;
- tmp->next = NULL;
- return tmp;
- }
- /* Рекурсивная чистка списка (передаем самый первый элемент) */
- void delete(elem *tmp)
- {
- if (tmp->next) delete(tmp->next);
- free(tmp);
- }
- /* Хедер списка (для удобства, мы же белые люди) */
- typedef struct list_header
- {
- elem *head, *end;
- int size;
- } list;
- /* Возвращает указатель на элемент списка с нужным индексом */
- elem *item(list *tmp, int index)
- {
- int i;
- if (!tmp || (index < 0 || index >= tmp->size)) return NULL;
- if (index == 0) return tmp->head;
- if (index == tmp->size-1) return tmp->end;
- elem *counter = tmp->head;
- for (i = 1; i <= index; i++) counter = counter->next;
- return counter;
- }
- /* Возвращает кол-во элементов с списке */
- int size_list(list *tmp)
- {
- return tmp->size;
- }
- /* Готовит хедер списка для работы */
- void init_list(list *tmp)
- {
- tmp->head = tmp->end = NULL;
- tmp->size = 0;
- }
- /* Добавление элемента в нужный список */
- void add(list *vect, elem *tmp)
- {
- if (!vect->head) vect->head = vect->end = tmp;
- else
- {
- vect->end->next = tmp;
- vect->end = tmp;
- }
- vect->size++;
- }
- int main(int argc, char *argv[])
- {
- list a, b, c; int n, i;
- init_list(&a); init_list(&b); init_list(&c);
- printf("Input count of elements:");
- scanf("%i", &n);
- /* Заполняем список А */
- printf("List A:\n");
- for (i = 0; i < n; i++)
- {
- int step, kof;
- printf("\nInput %i elem:\nstep:", (i+1));
- scanf("%i", &step);
- printf("kof:");
- scanf("%i", &kof);
- add(&a, create(step, kof));
- }
- /* Заполняем список B */
- printf("---\nList B:\n");
- for (i = 0; i < n; i++)
- {
- int step, kof;
- printf("\nInput %i elem:\nstep:", (i+1));
- scanf("%i", &step);
- printf("kof:");
- scanf("%i", &kof);
- add(&b, create(step, kof));
- }
- /* Сравниваем элементы и заносим одинаковые в список С */
- for (i = 0; i < n; i++)
- {
- elem *tmp_a = item(&a, i), *tmp_b = item(&b, i);
- if (tmp_a->step == tmp_b->step && tmp_a->kof == tmp_b->kof) add(&c, create(tmp_a->step, tmp_a->kof));
- }
- n = size_list(&c);
- /* Выводим список С */
- printf("---\nResult:\n");
- for (i = 0; i < n; i++)
- {
- elem *tmp = item(&c, i);
- printf("%i) step = %i. kof = %i\n", (i+1), tmp->step, tmp->kof);
- }
- delete(a.head); delete(b.head); delete(c.head);
- return 0;
- }
Объяснение кода листинга программы
- Создание нового элемента списка с использованием структурной переменной elem.
- Рекурсивная функция для очистки списка от элементов.
- Создание хедера списка для управления элементами.
- Функция для добавления элемента в список.
- Заполнение списка A с помощью пользовательского ввода.
- Заполнение списка B с помощью пользовательского ввода.
- Сравнение элементов из списков A и B и добавление одинаковых в список C.
- Вывод списка C на экран.
- Очистка памяти от выделенных элементов списка.
- Возвращение значения 0 для успешного завершения программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д