Реализовать Очередь. Циклический список. Удалить указанный элемент и все предшествующие - 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; }
Объяснение кода листинга программы
В данном коде реализована очередь (циклический список) с использованием структур данных.
- Создаются две структуры:
TNode
представляет собой элемент списка, содержащий значение и указатель на следующий элемент;TQueue
представляет собой очередь, содержащую указатели на голову и хвост списка.
- В функции
Push
новый элемент добавляется в начало списка. Если список пуст, то он становится и головой, и хвостом. Если список не пуст, то новый элемент добавляется перед головой списка. - В функции
Pop
удаляется и возвращается первый элемент списка (голова). Если список пуст, то возвращается NULL. - В функции
Find
ищется элемент со значениемvalue
в списке. Если элемент найден, то возвращается указатель на него. Если элемент не найден, то возвращается NULL. - В функции
RemoveBefore
удаляются все элементы списка до указанного значения. Если значение не найдено, то ничего не удаляется. - В функции
Print
выводится содержимое списка в формате[значение, ..., значение]
. - В функции
main
создается экземпляр очереди, заполняется 10 элементами, выводится на экран, затем удаляются элементы до значения 5 и снова выводится на экран. - В конце программы вызывается функция
system(
pause)
, чтобы программа не закрылась сразу, и пользователь мог увидеть результат. - Возвращается код завершения программы
EXIT_SUCCESS
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д