Создать новый список из двух других, чтобы он содержал равные элементы из двух других списков - 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 для успешного завершения программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д