如果节点只包含指向其父节点的指针,我如何在 C++ 中打印到节点的路径?

How do i print the path to a node in C++ if the nodes only contain pointers to their parents?

任务是用 c++ 制作一种文件系统,用户可以在其中创建、删除、cd 进入和退出文件夹以及列出子文件夹。每次操作后,程序应打印出当前文件夹或 created/removed 文件夹的路径。我偶然发现了打印路径:

struct dir
{
        std::string name;
        dir* parent;
};
std::string path(dir* a)
{
        if(a->parent==NULL) return "";
        return path(a->parent) +"/"+ a->name;
}

示例:

#include<iostream>
#include<vector>
#include<string>
struct dir
{
        std::string name;
        dir* parent;
};
std::vector<dir> sys;
dir* currentdir;
std::string path(dir* a)
{
        if(a->parent==NULL) return "";
        return path(a->parent) +"/"+ (*a).name;
}
int main()
{
        sys.push_back({"",NULL});
        sys.push_back({"a",&sys[0]});
        sys.push_back({"b",&sys[1]});
        sys.push_back({"c",&sys[2]});
        sys.push_back({"d",&sys[3]});
        sys.push_back({"e",&sys[4]});
        sys.push_back({"f",&sys[5]});
        sys.push_back({"g",&sys[6]});
        sys.push_back({"h",&sys[7]});
        sys.push_back({"i",&sys[8]});
        currentdir = &sys[9];
        std::cout << path(currentdir);
 }

这给出了输出 ////////h/i 而不是 /a/b/c/d/e/f/g/h/i

当您将新元素推入 sys 时,它最终会填满并必须重新分配其元素,此时您保存到 parent 中的所有指针都将变得无效,并且您的程序已经未定义的行为。

一个简单的解决方案是在创建任何元素之前调用 reserve,您需要确保您永远不会超过预留容量,否则您将再次遇到同样的问题。

另一种选择是将索引存储到 sys 数组中。