c - 使用 Recursion 的层次结构树太大,导致文件搜索崩溃

标签 c linux file ubuntu recursion

我编写了一个搜索特定文件的代码,用户在其中输入起始路径和文件名,然后如果文件存在则程序打印其详细信息,否则打印未找到。

正如我所怀疑的那样,当层次结构树太大时,递归的使用会使代码崩溃,我已经尝试过 400 个目录但它失败了,所以我猜想在 50一个文件夹到另一个文件夹,递归的开销使代码崩溃。

有什么解决办法的建议吗?基本上代码对于低级树层次结构是可以的,但我需要为健康树设计它(500-600 个文件夹一个在另一个文件夹中,以及一个存储在最后一个文件夹中的文件),谢谢

最佳答案

您可以通过存储您看到的目录(而不是立即处理它们)然后在稍后的迭代中返回它们来移除递归(即转换为迭代解决方案)。但是,您可能不会获得完全相同的输出(事物的排序可能不同)。

此方法的工作方式是有一个要处理的目录列表,然后您遍历此列表(边走边添加任何子目录)。

在伪代码/Python 中:

def print_dirs(path, recursive, filename):
   dir_stack = empty stack
   dir_stack.push(path)

   while dir_stack is not empty:
      dir = dir_stack.pop() # returns the head element (and removes it)

      for file in children(dir):

         # ...do stuff with names...

         if recursive and file is a directory:
             dir_stack.push(file) # process the directory later

堆栈可以很容易地实现为单向链表。请注意,如果 path 不是目录,并且这不是递归的,则需要特殊处理。

关于c - 使用 Recursion 的层次结构树太大,导致文件搜索崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11068623/

相关文章:

linux - ssh-add,自动添加私钥

linux - 无法运行使用 gcc 构建的可执行文件

file - SSIS-带有转义字符的平面文件

file - Gnuplot : Size of points

c - ANSI C : converting argv into int

c - Scanf 似乎无法在带有 GDB 的 Eclipse CDT 中以 Debug模式工作

c - 如何从 stdin 读取多行并将其存储在链表中

c - setuid 程序的管道访问权限

Java getenv() 返回 null

c - C中的二进制文件读/写