mayashah Ответов: 2

Столкнувшись с проблемой очереди связанных списков


- привет !! я сталкиваюсь с небольшой проблемой здесь, в моем коде, в основном я реализую связанный список, используя технику очереди + используя шаблоны, но проблема в том, что когда я реализую типы float и string, он показывает мне идеальный ответ, но он не работает для типа "int", я пишу функции enqueue и dequeue здесь для очистки !!

Что я уже пробовал:

#include <iostream>
#include <string>
using namespace std;

template <typename Type>
struct Node
{
	Type info;
	Node<Type> *Next;
};
template <typename Type>
void Queue<Type>::Enqueue(Type x)
{
	Node<Type> *temp;
	temp = new Node<Type>;
	temp->info = x;
	temp->Next = NULL;
	if (front == NULL)
	{
		front = temp;
	}
	else
	{
		rear->Next = temp;
	}

	rear = temp;

}


template <typename Type>
void Queue<Type>::Dequeue()
{
	Node<Type> *temp;
	temp = new Node<Type>;

	if (front == NULL)
	{
		cout << " Queue is Empty. " << endl;
	}
	else
	{
		temp = front;
		front = front->Next;
		cout << endl << temp->info << " was dequeued." << endl;
		delete temp;
	}
}


int main()
{

	cout << "============== Int Queue ==============" << endl;
	Queue<int>intqueue;
	intqueue.Enqueue(20);
	intqueue.Enqueue(30);
	intqueue.Enqueue(40);
	intqueue.Print();
	intqueue.Dequeue();
	intqueue.Print();}

Richard MacCutchan

Есть какие-нибудь подсказки, в чем проблема?

[no name]

Пора доставать отладчик, не так ли?

mayashah

в основном выход, кажется, не соответствует тому, что требуется !!

mayashah

он будет запущен следующим образом, как мы все хотели бы видеть !!!
20
30
40
//функция dequeue под названием 20 удалена !!!
30
40 !!!

2 Ответов

Рейтинг:
2

Jochen Arndt

Я отвечу, добавив комментарии к вашему коду:

template <typename Type>
void Queue<Type>::Dequeue()
{
    Node<Type> *temp;
    // The instance created here is never deleted: Memory leak.
    // Just remove this line.
    temp = new Node<Type>;

    if (front == NULL)
    {
        cout << " Queue is Empty. " << endl;
    }
    else
    {
        // You are removing the front here.
        // So 20 from your example session is removed.
        // If you want to remove the last item you should use rear instead:
        //  temp = rear;
        //  rear = rear->Prev;
        //  rear->Next = NULL;
        temp = front;
        front = front->Next;
        cout << endl << temp->info << " was dequeued." << endl;
        delete temp;
    }
}


nv3

Наверное, ему нужна очередь, а не стопка, Йохен.

Jochen Arndt

Возможно, вы правы. Непонятно, чего он ожидает.

По крайней мере, я нашел утечку памяти, которая оправдывает публикацию ответа.

mayashah

на самом деле да я хочу очередь а не стек !! что было бы лучше, чем

Jochen Arndt

Но тогда ввод 20, 30, 40 и снятие очереди должны дать 30, 40.
Ты еще что-нибудь нашел?
Я еще не скомпилировал код, но он должен дать вышеприведенный вывод.

mayashah

да это должно меня тоже смущать в этом материале он не дает такого выхода как все хотели видеть !!

Рейтинг:
0

nv3

Если бы вы использовали отладчик, то быстро поняли бы, в чем дело. Вы действительно должны познакомиться, чтобы использовать его.

Что я вижу в вашем коде, так это то, что вы не обновляетесь front и rear вследствие. Например: что делает rear указать на пустую очередь? Вероятно, ноль, я полагаю. Так что же происходит в Enqueue когда вы вставляете первый элемент? Вы используете read указатель (который равен нулю) и do:

rear->Next = temp;

что приведет к неопределенным результатам. Аналогично в Dequeue: Что происходит, когда вы удаляете последний элемент? В таком случае front и rear должно быть установлено значение NULL. Я не вижу этого в вашем коде. Итак, вы опять провоцируете неопределенное поведение.