Удалить каждый третий элемент из списка - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д