Упражнение по классам и связанным спискам на C ++ - PullRequest
0 голосов
/ 07 мая 2020

Итак, у меня есть код, над которым я работаю, практически все готово (за исключением некоторых ненужных частей в коде, который я должен удалить). Это упражнение на C ++, касающееся стеков и связанных списков. Программа в значительной степени работает так, как должна, за исключением одного крохотного бита. В случае 4 моего оператора switch, когда программа должна распечатать связанный список, она завершит программу после этого, вместо того, чтобы вернуться в меню для выбора пользователем. Я все перепробовал и проверил, но все равно работает. Если бы кто-нибудь мог помочь мне определить, почему программа закрывается, я был бы признателен.

основной файл

#include <iostream>
#include "Stacks.h"
using namespace std;

int main()
{
    //crear un menú para el usuario que vea las opciones para el stack
    Stack myStack;
    myStack.initializeStack();
    char answer;
    int x = 0;
    bool exit = false;

    while(!exit)
    {
        cout << "\nChoose option from menu: " << endl;
        cout << "1) Enter value into stack (push) " << endl;
        cout << "2) Remove last value from stack (pop) " << endl;
        cout << "3) See value at top of stack (top) " << endl;
        cout << "4) Print full stack " << endl;
        cout << "5) Exit program " << endl;
        cout << "Option: ";
        cin >> answer;

        switch(answer)
        {
            case '1':
                int item;
                cout << "\nEnter value to add to stack: ";
                cin >> item;
                myStack.push(item);
                break;

            case '2':
                myStack.pop();  
                break;

            case '3':
                x = myStack.top();
                if (!myStack.isEmptyStack())
                    cout << "\tTop value at stack: " << x << endl;
                break;

            case '4':
                myStack.printStack();
                exit = false;
                break;

            case '5':
                exit = true;
                break;

            default:
                cout << "Incorrect instruction" << endl;
                break;
        }
    }
}

заголовочный файл

#include <iostream>
using namespace std;

struct nodeType
{
    int info;
    nodeType *link;
};


class Stack
{
    public:
        void initializeStack();
        bool isEmptyStack();
        bool isFullStack();
        void push(int);
        void pop();
        int top();
        void printStack();
        Stack();

    private:
        nodeType *stackTop;
        nodeType *list;
};

файл реализации

#include <iostream>
#include "Stacks.h"
using namespace std;

void Stack::initializeStack()
{
    stackTop = NULL;
}

bool Stack::isEmptyStack() //verifica si el stack está vacío o no
{
    return (stackTop == NULL);
}

bool Stack::isFullStack() 
{
    return false; //lista encadenada no tiene límite
}

void Stack::push(int newItem) //añade un nodo al stack y le asigna el top
{
    nodeType *q;

    q = new nodeType;
    q->info = newItem;
    q->link = stackTop; //creaste un nodo nuevo y le pusiste el valor que enviaste
    //se pone stackTop en vez de Null para que la lista se pueda conectar

    stackTop = q; //pusiste el Top en el nodo
}

void Stack::pop() //remueve el top del stack
{
    if(!isEmptyStack())
        stackTop = stackTop->link; //mueves el top al nodo de abajo
    else
        cout << "\t<ERROR> Stack is empty. " << endl;
}

int Stack::top() //devuelve el top del stack
{
    if(!isEmptyStack())
        return stackTop->info;
    else
        cout << "\t<ERROR> Stack is empty." << endl;
}

void Stack::printStack()
{
    //imprime el top y de ahí va bajando
    if(isEmptyStack())
        cout << "<ERROR> Stack is empty." << endl;
    else
    {
        nodeType *curr;

        curr = stackTop;

        while(curr->info != 0)
        {
            cout << curr->info << "<-";
            curr = curr->link;
        }
    }

}

1 Ответ

0 голосов
/ 07 мая 2020

Кажется, что вы отлично справляетесь с выходом из l oop, но я думаю, что ваша проблема на самом деле заключается в том, что ваша программа вылетает при запуске функции printStack. Как вы можете видеть из вашего кода, нижний элемент в вашем стеке (первый вытолкнутый элемент) будет иметь значение link, равное NULL, поскольку нет предыдущих элементов, с которыми он мог бы связываться (а stackTop инициализируется как NULL). Это проблема, потому что на следующей итерации while l oop, curr будет узлом NULL, а затем вы пытаетесь получить доступ к его свойству info (которое создаст неопределенное поведение, скорее всего, в форма ошибки времени выполнения / ошибки сегментации).

Вы должны изменить свою функцию printStack на что-то вроде этого, чтобы гарантировать, что вы выйдете из l oop после достижения узла NULL:

void Stack::printStack()
{
    //imprime el top y de ahí va bajando
    if(isEmptyStack())
        cout << "<ERROR> Stack is empty." << endl;
    else
    {
        nodeType *curr;

        curr = stackTop;

        while(curr) // check if curr is not NULL and break when it is
        {
            cout << curr->info << "<-";
            curr = curr->link; // if curr->link is NULL, then curr will be NULL in the next iteration
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...