2
    struct stack_struct
    {
        int number;
        struct stack_struct *next_number;
    };

    stack_struct *mainStruct;

    class stack_class
    {
    private:

        struct stack_struct *head;

    public:
        stack_class();
        //~stack_class();
        void pushNumber(int number);
        void popANumber();
        void findNumber();
        void clearStack();
        void sizeFinder();
        void printStack();

    };

    stack_struct *pointerFunc,*pointerFunc2,*pointerFunc3,*printPointer;

    stack_class::stack_class()
    {
        head=NULL;
    }

    void stack_class::pushNumber(int numberFunc)
    {

        if(head==NULL)
        {
            head = new stack_struct;
            head->number = numberFunc;
            head->next_number = NULL;
            pointerFunc2=head;
        }
        else
        {
            pointerFunc = new stack_struct;
            pointerFunc->number=numberFunc;
            pointerFunc->next_number=NULL;
            head->next_number=pointerFunc;
            head=pointerFunc;
        }
    }

    void stack_class::printStack()
    {

                while(pointerFunc2)
                {
                    cout<<pointerFunc2->number<<endl;
                    pointerFunc2=pointerFunc2->next_number;
                }

    }

    int optionChosen;

    int main()
    {
        stack_class mainClassStack;
        do
        {

            cin>>optionChosen;

            switch(optionChosen)
            {
            case 1:
            {
                int pushInt;
                cout<<"\n\nEnter Number: ";
                cin >> pushInt;
                mainClassStack.pushNumber(pushInt);
                break;
            }
            case 2:
            {
                break;
            }
            case 3:
            {
                break;
            }
            case 4:
            {
                break;
            }
            case 5:
            {
                break;
            }
            case 6://print
            {
                mainClassStack.printStack();

                break;
            }
            default:
            {
                break;
            }
            }
        }while(optionChosen!=7);

        return 0;

我正在尝试使用动态内存(链表)实现堆栈类型的数据列表。但是当我尝试打印列表时,它只打印一次列表,如果我尝试使用选项 6 再次重新打印,它就像列表消失了。我检查了两次代码,但无法弄清楚问题所在。有什么建议么?

4

3 回答 3

2

问题是当你第一次用这个打印堆栈时

pointerFunc2=pointerFunc2->next_number;

pointerFunc2 成为第一次迭代后的最后一个元素。所以这就是你认为它消失的原因。您应该在打印后重置​​ pointerFunc2 以指向头节点。所以先保存它,然后在遍历整个列表后恢复它,这样下次打印堆栈时,您将从头节点开始。

于 2013-03-25T23:46:47.350 回答
2

您的代码的问题在于,在您打印堆栈后,您并没有重置pointerFunc2head.

要么正确重置它,要么在打印函数中使用局部变量。

这是您的函数的更正版本:

void stack_class::printStack()
{
    while (pointerFunc2)
    {
        cout << pointerFunc2->number << endl;
        pointerFunc2 = pointerFunc2->next_number;
    }

    // reset pointerFunc2 so the next iteration
    // can start at the head and print again.
    pointerFunc2 = head;
}
于 2013-03-25T23:46:07.633 回答
1

第二次打印不起作用的原因是您使用的是全局变量而不是本地变量:

stack_struct *pointerFunc2;

当你在函数或类之外声明一个变量时,它就变成了全局变量。全局变量在函数调用中仍然存在,并保留最后设置到其中的值。为了成为局部变量,需要在内部 printStack声明一个变量,初始化到堆栈的头部,然后在退出函数时将其丢弃。关于pointerFunc.

和变量未使用printPointerpointerFunc3可以从源代码中删除。

于 2013-03-25T23:46:15.407 回答