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

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

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

Даны два списка целых чисел. Создать список, элементы которого являются числа, которые входят в первый список и не входят в другой.

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
// Описание узла списка
typedef struct node_t
{
    int value;           // Значение хранимое узлом
    struct node_t* next; // Указатель на следующий узел
}   TList;
 
//-----------------------------------------------------------------------------
// Функция добавления нового значения в вершину списка
TList* PushFront(TList** list, int value)
{
    // Создаём новый узел и присваиваем ему значение
    TList* node = malloc(sizeof(TList));
    node->value = value;
    // Т.к. добавление происходит в вершину списка,
    // то новый узел должен указывать на имеющийся
    node->next = *list;
 
    // Вершиной списка теперь является новый узел
    *list = node;
 
    return *list;
}
//-----------------------------------------------------------------------------
// Функция генерирования случайного числа в диапазоне
int Random(int min, int max)
{
    return rand() % (max - min + 1) + min;
}
//-----------------------------------------------------------------------------
// Функция генерирует список на заданное количество
// элементов в заданном диапазоне
TList* GetRandomList(size_t count, int min, int max)
{
    TList* list = NULL;
 
    // Заданное количество раз выполняем добавление в список
    // случайны чисел из диапазона 
    while (count--)
    {
        PushFront(&list, Random(min, max));
    }
 
    return list;
}
//-----------------------------------------------------------------------------
// Функция выполняет разность двух списков, т.е. формирует новый
// из элементов входящих в первый но не входящий во второй
TList* GetDifferenceList(const TList* first, const TList* second)
{
    TList* result = NULL;
 
    const TList* tmp;
 
    // Пробегаемся по первому списку 
    for (; first; first = first->next)
    {
        // Ищем во втором списке одинаковый элемент
        for (tmp = second; tmp && first->value != tmp->value; tmp = tmp->next) { ; }
 
        // Если элемент во втором списке не был найден, то добавляем
        // его в результирующий список
        if (tmp == NULL)
        {
            PushFront(&result, first->value);
        }
    }
 
    return result;
}
//-----------------------------------------------------------------------------
void PrintList(const TList* list)
{
    // Перебираем все элементы списка и выводим их на экран
    for (; list; list = list->next)
    {
        printf("%d, ", list->value);
    }
    printf("\b\b \n");
}
//-----------------------------------------------------------------------------
 
int main()
{
    srand(time(NULL));
 
    TList* first = GetRandomList(5, 1, 10);
    TList* second = GetRandomList(5, 5, 15);
 
    printf("first:  ");
    PrintList(first);
 
    printf("second: ");
    PrintList(second);
 
    TList* result = GetDifferenceList(first, second);
    
    printf("result: ");
    PrintList(result);
 
    return 0;
}

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

Код представляет собой набор функций и переменных для работы со связанным списком (Linked List) в языке C.

  1. Типизация:
    • В данном коде используются следующие типы данных:
      • int - для хранения целочисленных значений в узлах списка.
      • TList - для описания структуры узла списка.
      • size_t - для представления размера списков, используется в функции GetRandomList и GetDifferenceList.
      • const - используется для обозначения константных переменных и указателей, которые не должны быть изменены.
  2. Вершина списка:
    • Вершина списка представляется указателем *list.
  3. Функции работы со списком:
    • Функция PushFront добавляет новый узел со значением в вершину списка.
    • Функция GetRandomList генерирует список заданного размера в заданном диапазоне.
    • Функция GetDifferenceList выполняет разность двух списков, т.е. формирует новый список из элементов входящих в первый, но не входящих во второй.
    • Функция PrintList перебирает все элементы списка и выводит их на экран.
  4. Главная функция:
    • В функции main создаются два списка first и second с помощью функции GetRandomList.
    • Затем списки выводятся на экран с помощью функции PrintList.
    • После этого выполняется операция разности списков first и second и результат выводится на экран с помощью функции PrintList.
  5. Использование:
    • Данный код может быть использован для решения задачи по созданию списка, элементы которого являются числами, которые входят в первый список и не входят во второй.

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


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

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

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