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;

動的メモリ (連結リスト) を使用してスタック型のデータ リストを実装しようとしています。しかし、リストを印刷しようとすると、リストが 1 回しか印刷されず、オプション 6 を使用して再度印刷しようとすると、リストがなくなったようになります。コードを 2 回見直しましたが、何が問題なのかわかりませんでした。助言がありますか?

4

3 に答える 3

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;
}
于 2013-03-25T23:46:07.633 に答える
2

問題は、これで初めてスタックを印刷するときです

pointerFunc2=pointerFunc2->next_number;

pointerFunc2 は、最初の繰り返しの後、最後の要素になります。それが、あなたがそれがなくなったと思う理由です。印刷後に head ノードを指すように pointerFunc2 をリセットする必要があります。したがって、最初に保存してから、リスト全体を繰り返した後、それを復元して、次にスタックを印刷するときにヘッドノードから開始するようにします。

于 2013-03-25T23:46:47.350 に答える
1

2 番目の出力が機能しない理由は、ローカル変数ではなくグローバル変数を使用しているためです。

stack_struct *pointerFunc2;

関数やクラスの外で変数を宣言すると、グローバル変数になります。グローバル変数は関数の呼び出しに耐え、最後に設定された値を保持します。ローカルにするには、変数を内 で宣言printStackし、スタックの先頭に初期化してから、関数の終了時に破棄する必要があります。についても同様ですpointerFunc

および変数は使用されていないため、ソース コードから削除できますprintPointerpointerFunc3

于 2013-03-25T23:46:15.407 に答える