从节点到根遍历树,并跟踪路径

时间:2019-05-24 08:47:42

标签: c memory-management tree traversal

我正在构建一个程序来模拟文件系统。它具有虚拟文件和目录,它们表示为树中的节点。 我想将“ pwd”命令的一个版本实现为该树上的函数。 给定当前目录-我需要遍历树直到根,并跟踪完整路径;

我已经尝试了一些方法,但是在内存分配方面我做得不好。 我会寻求任何帮助。 谢谢!

这是树结构,也是我的尝试-

{
    "forecast_cumulative_sum" : [
        {
            "_id" : "18-02",
            "forecast_cumulative_sum" : 16
        },
        {
            "_id" : "18-01",
            "forecast_cumulative_sum" : 9
        }
    ],
    "actual_cumulative_sum" : [
        {
            "_id" : "18-02",
            "actual_cumulative_sum" : 21
        },
        {
            "_id" : "18-01",
            "actual_cumulative_sum" : 4
        }
    ]
}

1 个答案:

答案 0 :(得分:1)

您的程序中有太多malloc个调用。 strcat(newPath, "\0");也是多余的。 strcat将自动添加结尾的NULL字符。

下面给出了一个简化的版本,它将支持最大256个字节的路径长度,并指出较长路径的错误。

char* prepend(char* path, const char* toAdd, int lastWordBeforeRoot)
{
    if (strlen(path) + strlen(add) + 3 > 256)
    {
        // handle error
        return(path);
    }
    if(!lastWordBeforeRoot && strcmp(toAdd, "/") != 0)
    {
        strcat(path,"/");
    }
    strcat(path,toAdd);
    return (path);
}

void pwd() 
{
    NODE* currentFolder = currentLocation;
    char* path = (char*)malloc(256 * sizeof(char));

    while (currentFolder != NULL) 
    {
        if (currentFolder->parent != NULL && strcmp(currentFolder->parent->nameOfTheFile, "/") == 0) 
        {
            path = prepend(path, currentFolder->nameOfTheFile, 1);
        }
        else 
        {
            path = prepend(path, currentFolder->nameOfTheFile, 0);
        }
        currentFolder = currentFolder->parent;
    }
    printf("%s \n", path);
    free(path);
}