-1

キーボードからの入力データで構築されたバイナリ ツリーをトラバースしようとしています。二分木にデータが正常に挿入されました。私は switch ステートメントを持っています。'case 3' は、非再帰的な Inorder トラバーサル アルゴリズムを使用してバイナリ ツリーをトラバース (および出力) する必要があります。ただし、「ケース 3」が呼び出されると、EXC_BAD_ACCESS エラーが発生しますが、これはまったく意味がありません。誰かがこれで私を助けてくれたら、私はもっとうれしいです.

(RootPtr は、グローバルに定義されたバイナリ ツリーの最上位のレベル 0 ノードです。GetNodeS は、基本的に StackPtr 型ポインタの初期化関数 (malloc を使用) です。)

よろしくお願いします。

関連するコードは次のとおりです。

これらは構造体定義です。

Typedef struct treeItem
{
    int data;
    struct treeItem *left;
    struct treeItem *right;

}Tree , *TreePtr;

typedef struct stackItem
{
    TreePtr t;
    struct stackItem *next;

}Stack , *StackPtr;

これらはプッシュ機能とポップ機能です。

void PushS (TreePtr TreePointer)
{
    StackPtr TemPtr;
    GetNodeS(&TemPtr);

    (*TemPtr).t = TreePointer;
    (*TemPtr).next = S;
    S = TemPtr;
}

void PopS(TreePtr TreePointer)
{
    StackPtr TemPtr;
    GetNodeS(&TemPtr);

    if (S != NULL)
    {
        TreePointer = (*S).t;
        TemPtr = S;
        S = (*S).next;

        FreeNodeS(TemPtr);
    }    
    else
        printf("\nEmpty stack!");

}

これがトラバース機能で、

void iterative (TreePtr TemPtr)
{
    DONE = 0;
    TemPtr = RootPtr;
    S = NULL;

    if(items==0)
    {
        printf("\nTree is empty.\n\n");
        DONE = 1;
    }
    else
    {
        printf("\nIterative nonrecursive inorder traversal:");

        while (DONE == 0)
        {
            if(TemPtr != NULL)
            {
                PushS(TemPtr);
                TemPtr = (*TemPtr).left;
            }
            else
                if(S != NULL)
                {
                    PopS(TemPtr);
                    printf(" %d", (*TemPtr).data); //the line I get the ERROR
                    TemPtr = (*TemPtr).right;
                }
                else
                {
                    DONE = 1;
                }
        }
    }
}

これは、反復トラバース関数を呼び出そうとする switch ケースです。

     case 3:
            TreePtr TemPtr;
            GetNode(&TemPtr);

            iterative(TemPtr);

            break;
4

1 に答える 1

1

エラーが発生した行で null ポインターを逆参照しています。これが EXC_BAD_ACCESS エラーの原因です。

if(TemPtr != NULL)
{
    ...
}
else // TemPtr must be NULL here

PopS(TemPtr);TempPtr値渡しなので変わらない。

それからここに:

printf(" %d", (*TemPtr).data);

*TemPtrNULL ポインター逆参照です。

于 2016-01-11T13:51:54.850 に答える