Метод setNext () в классе узла не работает - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть программа, которая создает очередь стеков, и у каждого стека есть несколько узлов с одной связью, в которых есть объекты класса «функции», который я создал. Однако всякий раз, когда я пытаюсь вызвать мой код очереди, возникает ошибка.

При первом появлении ошибки отслеживается такой вызов:

Executive.cpp : q.enqueue(*thisStack); myQueue.cpp [enqueue method] : m_back->setNext(newNode); SLNode.h [setNext method]: setNext(SLNode<T>* nextSLNode) {next = nextSLNode;}

Я не уверен, что создает ошибку сегмента. Я запустил тест, и новый узел, созданный в enqueue, содержит все необходимые данные, поэтому я знаю, что он не пустой. По какой-то причине кажется, что все работает правильно, пока не достигнет метода setNext, и я не могу понять, почему он не будет запускать код.

ОДНОЗНАЧНЫЕ УЗЛЫ

#ifndef SLNODE_H
#define SLNODE_H

#include <iostream>

template <typename T>
class SLNode // A node in a singly linked list
{
private:
    T item;
    SLNode<T>* next; // we can only go "forward" along our chain
public:
    SLNode(T anItem) : item(anItem), next(nullptr) {}
    SLNode(T anItem, SLNode<T>* nextSLNode) : item(anItem),                    
        next(nextSLNode) {}
    T getItem() const { return item; }
    SLNode<T>* getNext() const { return next; }
    void setItem(T newItem) { item = newItem; }
    void setNext(SLNode<T>* nextSLNode) { next = nextSLNode; }
};

#endif

ЗАГОЛОВОК ОЧЕРЕДИ

#ifndef MYQUEUE_H
#define MYQUEUE_H

#include "SLNode.h"
#include "QueueInterface.h"
#include "myQueue.h"
#include "function.h"

#include <string>
#include <iostream>

template<typename ItemType>
class myQueue: public QueueInterface<ItemType>
{
public:
    myQueue();

    bool isQueueFull(SLNode<ItemType>* node);

    bool isEmpty() const;
    void enqueue(const ItemType& newEntry); // throw     (PrecondViolatedExcep) = 0;
    void dequeue (); // throw (PrecondViolatedExcep) = 0;
    ItemType peekFront() const; // throw (PrecondViolatedExcep) = 0;

private:
    SLNode<ItemType>* m_front;
    SLNode<ItemType>* m_back;

};

#include "myQueue.cpp"
#endif // MYQUEUE_H

СПОСОБ СПРАВКИ

template<typename ItemType>
void myQueue<ItemType>::enqueue (const ItemType& newEntry)
{
    //create new node of ItemType and fill with given entry
    SLNode<ItemType>* newNode = new SLNode<ItemType>(newEntry);
    std::cout << "new queue node created\n";

    /*ItemType tester = m_back->getItem();
    std::cout << "new node functions properly\n";
    std::cout << tester.getProcessName() << std::endl;*/

    if(isQueueFull(newNode) == true)
    { throw PrecondViolatedExcep("Queue/Memory full."); }
    else
    {
        std::cout << "inside else statement\n";
        //point back to new node
        m_back->setNext(newNode);
        std::cout << "last node pointing to new node\n";
        //set back to new node
        m_back = newNode;
        std::cout << "new node is now back\n";
    }

}

РАБОТА

:~/EECS268/Lab_05$ ./Lab_05 example.txt
start begun 
load : 'y' ,0
process added to stack.
read : 'n' ,0
process added to stack.
play : 'n' ,0
process added to stack.
0 : 'S' ,0
new queue node created
inside else statement
Segmentation fault (core dumped)
...