残りの割り当てはほぼ完了しており、取得した構造を印刷するための 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 */
}
誰かがこれで私を助けることができれば、私はとても感謝しています.