Очередь. Основные функции для работы с очередями(взять и положить) - C (СИ)

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

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

Привет. Реализовал несколько функций для очереди. Появилась проблема. Если положить элемент, а затем его вытащить( очередь опустошится), а затем опять положить, то указатель на head(начало очереди) станет NULL, а в tail(ляжет элемент). А я хочу, чтобы если у меня один элемент в очереди, то указатели head и tail оба указывали на него. Подскажите, пожалуйста где ошибка(не обращайте там внимание на тип информационных полей, это мне для лабораторной надо).
struct btree {
    char elem;
    btree *left, *right;
};// объявление бинарного дерева
struct QUEUE
{
    btree *elem;
    QUEUE *next;
};// список
struct quest {
    QUEUE *head = NULL, *tail = NULL;
};// очередь
 
void push_back(btree *tree, quest *X)// положить в конец
{
 
    if (X->tail != NULL)// не пустая
    {
        QUEUE *temp = new QUEUE;
        temp->elem = tree;
        temp->next = NULL;
        X->tail->next = temp;
        X->tail = temp;
    }
    else
    {
        X->tail = new QUEUE;
        X->tail->elem = tree;
        X->tail->next = NULL;
        X->head = X->tail;
    }
}
 
btree *pop_front(quest *X)// взять с начала
{
    if (X->head != NULL)
    {
        QUEUE *temp = X->head;
        btree *a = X->head->elem;
        X->head = X->head->next;
        delete temp;
        return a;
    if (isqueueempty(X)==1)
    {
        X->head = X->tail;
    }
 
    }
    else
        return NULL;
}

Решение задачи: «Очередь. Основные функции для работы с очередями(взять и положить)»

textual
Листинг программы
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace::std;
struct btree {
    char elem;
    btree *left, *right;
};
struct QUEUE
{
    btree *elem;
    QUEUE *next;
};
struct quest {
    QUEUE *head = NULL, *tail = NULL;
};
 
int isqueueempty(quest *X)// пустая ли очередь
{
    if (X->head == NULL)
        return 1;
    else return 0;
}
// проверка на пустоту
void push_back(btree *tree, quest *X)// положить в конец
{
 
    if (X->head != NULL)// не пустая
    {
        QUEUE *temp = new QUEUE;
        temp->elem = tree;
        temp->next = NULL;
        X->tail->next = temp;
        X->tail = temp;
    }
    else
    {
        X->tail = new QUEUE;
        X->tail->elem = tree;
        X->tail->next = NULL;
        X->head = X->tail;
    }
}
// положить в конец
btree *pop_front(quest *X)// взять с начала
{
    if (X->head != NULL)
    {
        QUEUE *temp = X->head;
        btree *a = X->head->elem;
        X->head = X->head->next;
        delete temp;
        return a;
    if (isqueueempty(X)==1)
    {
        X->head = X->tail;
    }
 
    }
    else
        return NULL;
}
// взять с начала
btree *build_tree(FILE*input)
{
    char sym;
    btree *d;
        fscanf_s(input,"%c", &sym);
        switch (sym)
        {
        case'(': 
        {
            d = new btree;
            fscanf_s(input, "%c", &sym);
            d->elem = sym;
            d->left = build_tree(input);
            d->right = build_tree(input);
            fscanf_s(input, "%c", &sym);
            return d;
        }
        case'0':
            return NULL;
        case',':
            build_tree(input); 
            break;
        }
}

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

  1. Включаются необходимые заголовочные файлы
  2. Объявляются структуры btree и QUEUE, а также переменная типа quest
  3. Определяется функция isqueueempty, которая проверяет, пуста ли очередь
  4. Определяется функция push_back, которая добавляет элемент в конец очереди
  5. Определяется функция pop_front, которая удаляет и возвращает первый элемент очереди
  6. Определяется функция build_tree, которая создает дерево из последовательности символов
  7. Код предполагает, что ввод данных осуществляется из файла, открытого для чтения
  8. В функции build_tree используется оператор switch для анализа входных данных
  9. В случае, если входной символ равен ')', создается новый узел дерева и вызывается рекурсивная функция для обработки левой и правой ветвей
  10. В случае, если входной символ равен '0', возвращается NULL, что, вероятно, означает, что дерево пусто
  11. В случае, если входной символ равен ',', вызывается функция build_tree без передачи аргумента
  12. В случае, если входной символ не соответствует ни одному из перечисленных выше, он присваивается узлу дерева
  13. В конце функции build_tree возвращается результат работы рекурсивных вызовов
  14. Код предполагает, что функция build_tree вызывается с открытым файлом, содержащим данные для построения дерева
  15. Код предполагает, что функция pop_front вызывается для очереди, созданной с помощью функции build_tree
  16. Код предполагает, что функция isqueueempty вызывается перед вызовом функции pop_front для проверки пустоты очереди
  17. Код предполагает, что функция build_tree вызывается для создания дерева из последовательности символов
  18. Код предполагает, что функция build_tree вызывается с файлом, открытым для чтения
  19. Код предполагает, что функция pop_front вызывается для очереди, созданной с помощью функции build_tree
  20. Код предполагает, что функция isqueueempty вызывается перед вызовом функции pop_front для проверки пустоты очереди

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


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

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

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