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

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

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

Описать процедуру, которая формирует список L, включив в него по одному разу элементы, которые входят в список L1, но не входят в список L2;

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
typedef struct list_t
{
   int value;
   struct list_t* next;
}  TList;
 
//-----------------------------------------------------------------------------
TList* Push(TList** list, int value)
{
   TList* node = (TList*) malloc(sizeof(TList));
   node->value = value;
   node->next = *list;
 
   *list = node;
 
   return *list;
}
//-----------------------------------------------------------------------------
void Clear(TList** list)
{
   TList* node;
 
   while (*list)
   {
      node = *list;
      *list = (*list)->next;
      free(node);
   }
}
//-----------------------------------------------------------------------------
TList* Find(TList* list, int value)
{
   for (; list && (list->value != value); list = list->next) { ; }
 
   return list;
}
//-----------------------------------------------------------------------------
void Print(TList* list)
{
   for (; list; list = list->next)
   {
      printf("%d ", list->value);
   }
   printf("\n");
}
//-----------------------------------------------------------------------------
int Random(int min, int max)
{
   return (rand() % (max - min) + min);
}
//-----------------------------------------------------------------------------
TList* GetGenList(size_t count, int min, int max)
{
   TList* list = NULL;
 
   while (count--)
   {
      Push(&list, Random(min, max));
   }
 
   return list;
}
//-----------------------------------------------------------------------------
TList* GetUniqueFirst(TList* first, TList* second)
{
   TList* list = NULL;
 
   for (; first; first = first->next)
   {
      if (!Find(list, first->value) && !Find(second, first->value))
      {
         Push(&list, first->value);
      }
   }
 
   return list;
}
//-----------------------------------------------------------------------------
 
int main()
{
   srand(time(NULL));
 
   TList* l1 = GetGenList(10, 3, 10);
   TList* l2 = GetGenList(10, 0, 7);
 
   TList* l = GetUniqueFirst(l1, l2);
 
   printf("L1: "); Print(l1);
   printf("L2: "); Print(l2);
   printf("L : "); Print(l);
 
   Clear(&l);
   Clear(&l2);
   Clear(&l1);
 
   system("pause");
 
   return 0;
}

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

В данном коде используется структура данных TList, представляющая односвязный список. Создаются функции для работы с этим списком: добавление элемента в список (Push), очистка списка (Clear), поиск элемента в списке (Find), вывод списка на экран (Print). Также есть функция генерации случайного числа в заданном диапазоне (Random), функция создания списка из заданного количества случайных чисел в заданном диапазоне (GetGenList) и функция получения уникальных элементов из двух списков (GetUniqueFirst). В функции main создаются два списка l1 и l2, заполняются случайными числами и выводятся на экран. Затем создается список l, в который добавляются уникальные элементы из l1 и l2. После вывода списка l на экран, все списки очищаются и программа завершается.

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


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

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

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