我几乎完成了剩下的任务,现在只需要一个打印方法来打印获得的结构。
我想知道如何编写一个循环来遍历这样的结构:
[""][ ][ ]--> [""][ ][/]
| |
["A"][/][/] [""][ ][ ]--> [""][ ][/]
| |
["B"][/][/] ["C"][/][/]
这是以下结构:
(a (b c))
或者
[""][ ][ ]--> [""][ ][ ]--> [""][ ][/]
| | |
["A"][/][/] ["B"][/][/] ["C"][/][/]
这是为了:
(美国广播公司)
它的代码是:
struct conscell {
char symbol;
struct conscell *first;
struct conscell *rest;
};
所以,你看到的第一个空格是符号字符,下一个是 conscell 指针“first”,最后一个是 conscell 指针“rest”。
想象一下,该结构是内部构建的(到目前为止已完成分配)。
所以现在,在遍历结构之后,我应该打印出适当的列表,带括号。对于上面的示例,它将是
(a (bc))
我完成了这个方法:用当前节点数据(符号)、左节点(第一个)和右节点(休息)进行树遍历。只需要找到放置括号的位置即可获得正确的输出。现在我得到:
美国广播公司
打印方法:
// 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 */
}
如果有人可以帮助我,我将不胜感激。