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

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

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

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

10   голосов , оценка 3.9 из 5
Похожие ответы