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