[""][ ][/] | -6ren">
gpt4 book ai didi

c - 遍历C中的已知结构

转载 作者:行者123 更新时间:2023-11-30 17:57:05 24 4
gpt4 key购买 nike

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

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

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

这是以下结构:

(a (b c))

或者

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

如果有人可以帮助我,我将非常感激。

最佳答案

只需递归地执行即可。

访问第一个concsell,如果first != nullptr访问第一个元素。对于 rest 成员来说也是如此。由于所有元素都具有相同的结构,因此您已经完成了。

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

关于c - 遍历C中的已知结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13006538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com