我正在尝试以相反的顺序打印tree_nodes
列表:
当前提示示例:/helloFellow/hello/root / >
期望的结果:root/hello/helloFellow / >
有效地做到这一点的方法是什么?
// *prints the prompt (e.g. /bar/baz/ >) in every iteration of the main loop
// *show all directories on the path in correct order
void show_prompt(struct tree_node *cwd) {
struct tree_node *parDir = cwd->parent;
struct tree_node *originalDir = cwd;
while (cwd->parent != NULL) {
printf("/");
printf("%s", cwd->parent->string_buffer);
cwd = cwd->parent;
}
cwd = originalDir;
printf("/ >");
}
答案 0 :(得分:4)
你可以使用递归:
void print_path( struct tree_node * cwd ) {
if ( cwd->parent != NULL )
print_path( cwd->parent );
printf( "%s/", cwd->string_buffer );
}
答案 1 :(得分:0)
正如Kenney所指出的,你可以使用递归。另一个解决方案是修改链接列表以包含两个方向的指针,即列表中的上一个和下一个元素。然后你还保持指向列表头部和尾部的指针。您可以使用两个结构封装它:
struct ListNode {
struct ListNode *prev;
struct ListNode *tail;
};
struct LinkedList {
struct ListNode *head;
struct ListNode *tail;
};
这样做的优点是,这(以及其他操作,如尾部插入)可以非常容易地完成。在不利方面,您还需要为每个节点提供更多内存并跟踪更多指针。
顺便说一句,因为你有效地要求一般来说递归比普通的循环实现更昂贵,因为每次递归调用都需要在函数的堆栈中创建一个新的框架等等。这并不是说你不应该使用它。递归解决方案非常优雅,有时甚至更好,即比其他替代方案更有效/更容易。此外,在许多情况下,编译器对它们进行了很好的优化!