0

残りの割り当てはほぼ完了しており、取得した構造を印刷するための print メソッドが必要です。

次のような構造をトラバースするループを作成する方法を知りたいです。

[""][ ][ ]-->  [""][ ][/]
     |              |              
   ["A"][/][/]     [""][ ][ ]-->  [""][ ][/]     
                        |              |                 
                      ["B"][/][/]    ["C"][/][/]

それは次の構造です。

(a (b c))

また

[""][ ][ ]-->  [""][ ][ ]--> [""][ ][/]
     |              |             |  
   ["A"][/][/]    ["B"][/][/]   ["C"][/][/] 

これがためのものです:

(abc)

そのコードは次のとおりです。

struct conscell {
char symbol;
struct conscell *first;
struct conscell *rest;

};

したがって、最初に表示されるスペースは記号文字であり、次はコンセル ポインター "first" であり、最後はコンセル ポインター "rest" です。

構造が内部的に構築されていると想像してください (割り当てはこれまでに行われています)。

したがって、構造をたどった後、適切なリストを括弧付きで出力する必要があります。上記の例では、次のようになります。

(a (bc))

私は方法で終わりました:現在のノードデータ(シンボル)、左ノード(最初)、右ノード(残り)でツリートラバーサルを行いました。正しい出力を得るには、ブラケットを配置する場所を見つける必要があります。今私は得る:

abc

を印刷方法:

// List is a pointer to struct conscell 
// myList will be the pointer referring to our first conscell structure  
void printList(List myList){
List current, pre;


if (myList == NULL)
    return;

current = myList;

while (current != NULL) {

    if (current->first == NULL) {
        printf("%c", current->symbol);
        current = current->rest;
    }
    else {
        /* Find the inorder predecessor of current */
        pre = current->first;
        while (pre->rest != NULL && pre->rest != current)
            pre = pre->rest;

        /* Make current as right child of its inorder predecessor */
        if (pre->rest == NULL) {
            pre->rest = current;
            current = current->first;
        }
            /* Revert the changes made in if part to restore the original 
              tree i.e., fix the right child of predecssor */
        else {
            pre->rest = NULL;
            printf("%c ", current->symbol);
            current = current->rest;
        } /* End of if condition pre->right == NULL */
    } /* End of if condition current->left == NULL*/

} /* End of while */
}

誰かがこれで私を助けることができれば、私はとても感謝しています.

4

1 に答える 1

0

再帰的に行うだけです。

最初の要素にアクセスするconcsell場合は、最初の にアクセスします。first != nullptrメンバーも同じrest。そして、すべての要素が同じ構造を持っているので、完了です。

多くの要素がある場合、スタックがオーバーフローする可能性があることに注意してください。

于 2012-10-22T07:26:04.833 に答える