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