Удалить каждый третий элемент из списка - C (СИ)

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

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

Написать прогу создания и обработки списка(беда), каждый элемент которого ссылается на предыдущий и следующий элементы списка. Удалить каждый третий элемент из списка. Область данных элементов списка выбрать самостоятельно.

Решение задачи: «Удалить каждый третий элемент из списка»

textual
Листинг программы
#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.

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


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

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

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