Реализовать Очередь. Циклический список. Удалить указанный элемент и все предшествующие - C (СИ)

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

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

Реализовать Очередь. Циклический список. Удалить указанный элемент и все предшествующие. Помогите пожалуйста, очень срочно надо. Спасибо заранее.

Решение задачи: «Реализовать Очередь. Циклический список. Удалить указанный элемент и все предшествующие»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
typedef struct node_t
{
   int value;
   struct node_t* next;
}  TNode;
 
typedef struct queue_t
{
   TNode* head;
   TNode* tail;
}  TQueue;
 
//-----------------------------------------------------------------------------
TQueue* Push(TQueue* list, int value)
{
   TNode* node = (TNode*) malloc(sizeof(TNode));
   node->value = value;
 
   if (list->head && list->tail)
   {
      node->next = list->head;
      list->tail->next = node;
      list->tail = node;
   }
   else
   {
      node->next = node;
      list->head = list->tail = node;
   }
 
   return list;
}
//-----------------------------------------------------------------------------
TQueue* Pop(TQueue* list)
{
   TNode* node = list->head;
 
   if (node)
   {
      if (list->head == list->tail)
      {
         list->head = list->tail = NULL;
      }
      else
      {
         list->head = node->next;
         list->tail->next = list->head;
      }
 
      free(node);
   }
 
   return list;
}
//-----------------------------------------------------------------------------
TNode* Find(TQueue* list, int value)
{
   TNode* node = list->head;
 
   if (node)
   {
      while ((node != list->tail) && (node->value != value))
      {
         node = node->next;
      }
   }
 
   return (node && (node->value == value)) ? node : NULL;
}
//-----------------------------------------------------------------------------
TQueue* RemoveBefore(TQueue* list, int value)
{
   TNode* node = Find(list, value);
 
   if (node)
   {
      while (node != list->head)
      {
         Pop(list);
      }
      Pop(list);
   }
 
   return list;
}
//-----------------------------------------------------------------------------
void Print(const TQueue* list)
{
   TNode* node = list->head;
 
   printf("[");
   if (node)
   {
      while (node != list->tail)
      {
         printf("%d, ", node->value);
         node = node->next;
      }
      printf("%d", node->value);
   }
   printf("]\n");
}
//-----------------------------------------------------------------------------
 
int main()
{
   TQueue list = {NULL, NULL};
   size_t i;
 
   for (i = 0; i < 10; ++i)
   {
      Push(&list, i + 1);
   }
 
   Print(&list);
 
   RemoveBefore(&list, 5);
 
   Print(&list);
 
   system("pause");
 
   return EXIT_SUCCESS;
}

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

В данном коде реализована очередь (циклический список) с использованием структур данных.

  1. Создаются две структуры:
    • TNode представляет собой элемент списка, содержащий значение и указатель на следующий элемент;
    • TQueue представляет собой очередь, содержащую указатели на голову и хвост списка.
  2. В функции Push новый элемент добавляется в начало списка. Если список пуст, то он становится и головой, и хвостом. Если список не пуст, то новый элемент добавляется перед головой списка.
  3. В функции Pop удаляется и возвращается первый элемент списка (голова). Если список пуст, то возвращается NULL.
  4. В функции Find ищется элемент со значением value в списке. Если элемент найден, то возвращается указатель на него. Если элемент не найден, то возвращается NULL.
  5. В функции RemoveBefore удаляются все элементы списка до указанного значения. Если значение не найдено, то ничего не удаляется.
  6. В функции Print выводится содержимое списка в формате [значение, ..., значение].
  7. В функции main создается экземпляр очереди, заполняется 10 элементами, выводится на экран, затем удаляются элементы до значения 5 и снова выводится на экран.
  8. В конце программы вызывается функция system(pause), чтобы программа не закрылась сразу, и пользователь мог увидеть результат.
  9. Возвращается код завершения программы EXIT_SUCCESS.

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


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

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

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