Cписки и очереди, их реализация? По заданию нужно реализовать очередь с приоритетом в виде списка. Возникла проблема при выводе элементов. header file#include
#include
using namespace std;
struct Node
{
string str;
Node *next;
Node *prev;
int priority;
};
class List
{
Node *head;
Node *tail;
Node *temp;
public:
void show();
void add(int x, string str);
void delet();
Node *found(int priority);
List();
~List();
};
.cpp file#include "List.h"
void List::show()//в этой функции постоянно вылетает исключение
{
Node *tmp = head;
while (tmp!=NULL)
{
cout <str<next == NULL)
{
break;
}
else
{
tmp = tmp->next;
}
}
}
void List::add(int x, string str2)
{
Node *temp = new Node;
temp->priority = x;
temp->str = str2;
if (head != NULL)
{
temp->prev = tail;
tail->next = temp;
tail = temp;
}
else
{
temp->prev = NULL;
head = tail = temp;
}
}
void List::delet()
{
tail = tail->prev;
}
//Node * List::found(int priority)
//{
// if (temp->priority == priority)
// return temp;
// else
// return temp = temp->next;
//}
List::List()
{
head = NULL;
tail = NULL;
}
List::~List()
{
}

21 Авг 2019 в 06:59
293 +2
0
Ответы
1

Проблема возникает из-за того, что переменная temp не инициализирована в функции show(). Она должна быть инициализирована как temp = head; перед циклом while.

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

Если вы хотите использовать функцию found(int priority), ее стоит доработать, чтобы она искала узел с заданным приоритетом и возвращала его.

Более полная реализация добавления элемента с учетом приоритета и вывода элементов может выглядеть следующим образом:

void List::add(int x, string str2)
{
Node *temp = new Node;
temp->priority = x;
temp->str = str2;
if (head == NULL) {
// Если список пустой, создаем новый узел и делаем его головой и хвостом
head = tail = temp;
} else if (x > head->priority) {
// Если новый элемент имеет больший приоритет, добавляем его в начало списка
temp->next = head;
head->prev = temp;
head = temp;
} else {
Node *current = head;
while (current->next != NULL && current->next->priority >= x) {
current = current->next;
}
temp->next = current->next;
if (current->next != NULL) {
current->next->prev = temp;
} else {
tail = temp;
}
temp->prev = current;
current->next = temp;
}
}
void List::show()
{
Node *tmp = head;
while (tmp != NULL) {
cout << tmp->str << " ";
tmp = tmp->next;
}
cout << endl;
}

Это пример реализации, который учитывает добавление элементов с учетом приоритета и правильный вывод элементов очереди. Не забудьте также добавить логику для корректного удаления элементов и освобождения памяти в деструкторе.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир