链表不能正确打印?

时间:2013-03-25 23:42:31

标签: c++ class linked-list

    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再次重新打印,它就像列表一样消失了。我两次检查代码,但无法弄清问题是什么。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

您的代码存在的问题是,在您打印堆栈后,您没有将pointerFunc2重置为head

正确重置,或在打印功能中使用局部变量。

以下是您的功能的更正版本:

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;
}

答案 1 :(得分:2)

问题是当您第一次使用此

打印堆栈时

pointerFunc2 = pointerFunc2-&GT; next_number;

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

答案 2 :(得分:1)

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

stack_struct *pointerFunc2;

当您在函数或类之外声明变量时,它将变为全局变量。全局变量在函数调用中存活,并保留上次设置的值。为了本地化,需要在 printStack内声明一个变量,初始化到堆栈的头部,然后在退出函数时丢弃。关于pointerFunc也是如此。

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