LinkedList / Stack / Queue - Помощь при снятии очереди - PullRequest
0 голосов
/ 27 июля 2011

Мне пришлось написать связанный список, затем превратить его в динамический стек, а затем превратить его в динамическую очередь.Что ж, похоже, все работает, кроме «удаления из очереди», когда программы заканчивают работу, возникает ошибка: «Произошло необработанное исключение win32 в LinkedList_Stack_BNS11.exe [4972]».

Я только предполагаю, что это исключение из очереди, потому что, когда я прохожу и / или запускаю программу, она работает до этой части, так что, возможно, я неправильно указала один из указателей или что-то в этом роде?

Вывод:

Запрос 5 элементов .... // Finsihes

Значения в очереди были (Снятие очереди):

0

1

2

// Правильный номер в очереди, но ...

// Программа выдает эту ошибку прямо здесь.Когда он должен закончиться и закрыться.

Если я включил слишком много кода, дайте мне знать, и я срублю его до просто «Снятие очереди» (которая находится в самой середине всех вещей ниже)

Заранее спасибо за помощь !!Я просто не вижу, что я сделал не так.Думая, что это может быть связано с тем, куда указывает «голова»?Idk.

Заголовочный файл:

class NumberList
{
private:
    //
    struct ListNode
    {
        int value;  // Value in this node
        struct ListNode *next; // Pointer to the next node
    };

    ListNode *head; // List head pointer
    ListNode *rear;

public:
    //Constructor
    NumberList()
    { head = NULL; rear = NULL; }

    //Destructor
    ~NumberList();

    //Stack operations
    bool isEmpty();

    //Queue operations
    void enqueue(int);
    void dequeue(int &);
};
#endif

List_Stack_Queue.cpp:

bool NumberList::isEmpty()
{
    bool status;

    if(!head)
        status = true;
    else
        status = false;

    return status;
}

     void NumberList::enqueue(int num)
    {
        ListNode *newNode; // Point to a new node

        // Allocate a new node and store num there.
        newNode = new ListNode;
        newNode->value = num;

        //If there are no nodes in the list
        // make newNode the first node.
        if(isEmpty())
        {
            head = newNode;
            rear = head;
            //newNode->next = NULL;
        }
        else
        {
            rear->next = newNode;
            rear = rear->next;
            //newNode->next = head;
            //head = newNode;
        }
    }

    void NumberList::dequeue(int &num)
    {
        ListNode *temp;

        if(isEmpty())
            cout << "The queue is empty.\n";
        else
        {
            num = head->value;
            temp = head;
            head = head->next;
            delete temp;
        }
    }

MAIN:

const int MAX_VALUES = 3;

// Create a DynIntQueue object.
NumberList iQueue;

// Enqueue a series of numbers.
cout << "Enqueuing " << MAX_VALUES << " items...\n";
for (int x = 0; x < MAX_VALUES; x++)
    iQueue.enqueue(x);

cout << endl;

//Dequeue and retrieve all numbers in the queue
cout << "The values in the queue were (Dequeuing):\n";
while(!iQueue.isEmpty())
{
    int value;
    iQueue.dequeue(value);
    cout << value << endl;
} 
return 0;

1 Ответ

2 голосов
/ 27 июля 2011

Следующий элемент последнего узла должен быть установлен на NULL в связанном списке.Итак,

void NumberList::enqueue(int num)
{
    // ...
    if(isEmpty())
    {
        head = newNode;
        head->next = NULL;
        rear = head;
    }
    else
    {
        rear->next = newNode;
        rear = rear->next;
        rear->next = NULL;     // Pointing the next node element to null.
    }
}

Мне кажется, что-то не так с Numberlist::isEmpty(); функцией-членом.Как вы решаете, список пуст или нет?Покажите определение этого.

...