我差不多完成了其余的任务,现在只需要一个打印方法来打印输出的结构。
我想知道如何编写一个循环来遍历这样的结构:
[""][ ][ ]--> [""][ ][/]
| |
["A"][/][/] [""][ ][ ]--> [""][ ][/]
| |
["B"][/][/] ["C"][/][/]
这是结构:
(a (b c))
OR
[""][ ][ ]--> [""][ ][ ]--> [""][ ][/]
| | |
["A"][/][/] ["B"][/][/] ["C"][/][/]
这是为了:
(a b c)
它的代码是:
struct conscell {
char symbol;
struct conscell *first;
struct conscell *rest;
};
所以,你看到的第一个空格是符号字符,下一个是conscell指针“first”,最后一个是conscell指针“rest”。
想象一下,结构是内部构建的(到目前为止完成了分配)。
所以现在,在遍历结构之后,我应该用括号打印出适当的列表。 对于上面的例子,它将是
(a(b c))
我完成了方法:使用当前节点数据(符号),左节点(第一个)和右节点(其余)进行树遍历。只需找到放置括号的位置即可获得正确的输出。 现在我得到:
a b c
打印方法:
// 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 */
}
如果有人可以帮助我,我将非常感激。
答案 0 :(得分:0)
只是递归地做。
如果concsell
访问第一个元素,请访问第一个first != nullptr
。 rest
成员也是如此。因为你所有的元素都具有相同的结构。
你应该只注意,如果你有很多元素,你的堆栈可能会溢出。