0

我几乎完成了剩下的任务,现在只需要一个打印方法来打印获得的结构。

我想知道如何编写一个循环来遍历这样的结构:

[""][ ][ ]-->  [""][ ][/]
     |              |              
   ["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 */
}

如果有人可以帮助我,我将不胜感激。

4

1 回答 1

0

只需递归执行即可。

访问第一个concsell,如果first != nullptr访问第一个元素。会员也是一样rest。而且由于您的所有元素都具有相同的结构,因此您就完成了。

您只应该注意,如果您有很多元素,您的堆栈可能会溢出。

于 2012-10-22T07:26:04.833 回答