Очередь. Основные функции для работы с очередями(взять и положить) - 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; } }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Объявляются структуры btree и QUEUE, а также переменная типа quest
- Определяется функция isqueueempty, которая проверяет, пуста ли очередь
- Определяется функция push_back, которая добавляет элемент в конец очереди
- Определяется функция pop_front, которая удаляет и возвращает первый элемент очереди
- Определяется функция build_tree, которая создает дерево из последовательности символов
- Код предполагает, что ввод данных осуществляется из файла, открытого для чтения
- В функции build_tree используется оператор switch для анализа входных данных
- В случае, если входной символ равен ')', создается новый узел дерева и вызывается рекурсивная функция для обработки левой и правой ветвей
- В случае, если входной символ равен '0', возвращается NULL, что, вероятно, означает, что дерево пусто
- В случае, если входной символ равен ',', вызывается функция build_tree без передачи аргумента
- В случае, если входной символ не соответствует ни одному из перечисленных выше, он присваивается узлу дерева
- В конце функции build_tree возвращается результат работы рекурсивных вызовов
- Код предполагает, что функция build_tree вызывается с открытым файлом, содержащим данные для построения дерева
- Код предполагает, что функция pop_front вызывается для очереди, созданной с помощью функции build_tree
- Код предполагает, что функция isqueueempty вызывается перед вызовом функции pop_front для проверки пустоты очереди
- Код предполагает, что функция build_tree вызывается для создания дерева из последовательности символов
- Код предполагает, что функция build_tree вызывается с файлом, открытым для чтения
- Код предполагает, что функция pop_front вызывается для очереди, созданной с помощью функции build_tree
- Код предполагает, что функция isqueueempty вызывается перед вызовом функции pop_front для проверки пустоты очереди
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д