Удалить каждый третий элемент из списка - C (СИ)
Формулировка задачи:
Решение задачи: «Удалить каждый третий элемент из списка»
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct node_t
{
int value;
struct node_t* next;
struct node_t* prev;
} TNode;
//-----------------------------------------------------------------------------
TNode* Push(TNode** list, int value)
{
TNode* node = malloc(sizeof(TNode));
node->value = value;
node->next = *list;
node->prev = NULL;
if (*list)
{
(*list)->prev = node;
}
*list = node;
return *list;
}
//-----------------------------------------------------------------------------
void RemoveNode(TNode* node)
{
if (node->prev)
{
node->prev->next = node->next;
}
if (node->next)
{
node->next->prev = node->prev;
}
free(node);
}
//-----------------------------------------------------------------------------
TNode* RemoveEvery(TNode** list, size_t number)
{
size_t counter = 0;
TNode* node = *list;
TNode* tmp;
while (node)
{
if (++counter == number)
{
counter = 0;
tmp = node;
node = node->next;
RemoveNode(tmp);
}
else
{
node = node->next;
}
}
if (number == 1)
{
*list = NULL;
}
return *list;
}
//-----------------------------------------------------------------------------
TNode* GetList(size_t count)
{
TNode* list = NULL;
while (count--)
{
Push(&list, rand() % 90 + 10);
}
return list;
}
//-----------------------------------------------------------------------------
void Print(const TNode* list)
{
for (; list; list = list->next)
{
printf("%d, ", list->value);
}
printf("\b\b \n");
}
//-----------------------------------------------------------------------------
int main()
{
srand(time(NULL));
TNode* list = GetList(10);
Print(list);
RemoveEvery(&list, 3);
Print(list);
return 0;
}
Объяснение кода листинга программы
В данном коде используется структура данных очередь (или лист) - TNode, которая представляет собой связный список.
Код начинается с объявления структуры TNode и функций работы со связанным списком: Push (добавление элемента в список), RemoveNode (удаление элемента из списка), GetList (генерация случайного списка заданного размера), Print (вывод списка на экран).
Функция RemoveEvery удаляет каждый третий элемент из списка. Это достигается путем прохода по списку с шагом в три элемента (при помощи переменной counter). При достижении шага в три, удаляется текущий элемент (node), а его место занимает следующий (node->next). После удаления элемента, значение счетчика сбрасывается в ноль, чтобы перейти к следующему шагу. Если значение счетчика равно размеру шага (number), то текущий элемент пропускается, и счетчик сбрасывается в ноль. Если текущий элемент не является третьим элементом, то его пропускают, и переходят к следующему элементу списка.
Функция GetList генерирует случайный список заданного размера. Она использует функцию rand() для генерации случайных чисел в диапазоне от 10 до 99 (включительно). Каждое сгенерированное число добавляется в список с помощью функции Push.
Функция Print выводит список на экран. Она проходит по списку, начиная с первого элемента, и выводит значение каждого элемента, отделяя их запятыми. После вывода последнего элемента, выводится символ новой строки.
В функции main создается список из 10 случайных чисел с помощью функции GetList. Затем список выводится на экран с помощью функции Print. После этого каждый третий элемент удаляется из списка с помощью функции RemoveEvery. Наконец, список снова выводится на экран с помощью функции Print.