我正在尝试创建一个稀疏(链接)结构,每个节点指向其所有子节点(总共5个)。 直到现在,我只创建了第一个节点(称为" root")。我试图遍历链接结构,希望程序将返回' root'。 它给了我一个分段错误。
主要班级
Item n;
newDirectory();
printf("Folder root has been created.");
printf("Enter the name of the directory you want to traverse: ");
scanf("%s", n.name);
browseItem(n);
我创建的结构
typedef struct Directory{
//name of the file
char name[16];
//file content
char value[80];
_Bool isLeaf;
//if folder status = 1, if txt status = 2, if empty status = 0
int status;
struct Directory *firstchild;
struct Directory *secondchild;
struct Directory *thirdchild;
struct Directory *fourthchild;
struct Directory *fifthchild;
}Item;
类结构所在的函数我也包括
//points to the first node: node "root"
Item *head;
//creates the first (head) node: "root"
void newDirectory(){
head = (Item *)malloc(sizeof(Item));
if(head == NULL){
printf("Unable to allocate memory.");
}else{
strcpy(head->name,"root");
head->status = 1;
head->firstchild = NULL;
head->secondchild = NULL;
head->thirdchild = NULL;
head->fourthchild= NULL;
head->fifthchild = NULL;
}
}
void browseItem(Item n) {
//how do I find the location of n
Item *tmp;
tmp = (Item *)malloc(sizeof(Item));
if(head == NULL){
printf("List is empty!");
}else{
tmp = **location of n**;
while(tmp!=NULL){
printf("%s", tmp->name);
tmp = tmp->firstchild;
tmp = tmp->secondchild;
tmp = tmp->thirdchild;
tmp = tmp->fourthchild;
tmp = tmp->fifthchild;
}
}
}
我的问题是如何首先搜索n的位置,以便这样做 程序开始从该节点遍历。如果我有 来自root的节点越多,孩子们也会被遍历吗?
非常感谢!
答案 0 :(得分:2)
Segfault通常是由错误传输的数据引起的。您的代码和逻辑存在一些问题。让我尽力回答你的所有问题:
首先,您的链表不是真正的链表,而是一棵树。链表将指向下一个节点。这是一个单链表,双链表将指向下一个节点和前一个节点。它们都是一样的,除了一棵树只有更多的孩子,而一个链表只有一个孩子,一个双向链表也有一个指向父(或前一个元素)的指针。
你的第二个问题似乎是,我如何找到root?
“我试图遍历链接结构,希望程序返回'root'。”
目前,您的代码如下:root--> child 1, child 2, child 3
(这是一棵树)。如果您希望代码成为链接列表,则必须是root--> child1 --> child2 --> child3
...依此类推。但是,您的链接列表是一个单独链接列表,这意味着您只能前进而不是后退。如果你想回到root,它将是null<--root--> <--child1--> <--child 2 --> <-- ... -->
,依此类推(你必须有一个指针,指向前一个节点,就像一个双向链表)。
那么关于我如何找到n的问题呢?
//如何找到n
的位置
只有以root身份开始,才能执行此操作,并以此方式遍历链接列表。使用链表进行此操作的最简单方法是:
Item tmp = head->child1;
while (tmp != null)
{
if (tmp -> name == n)
{
print "Found n!" + tmp->name
break;
}
tmp = tmp -> nextChild;
}
这段代码只是一个伪代码,使它看起来更简单。
如果它是树,那么使用必须使用广度优先算法或深度优先算法来找到n。如果您的代码试图模仿文件结构,则应使用树,而不是链表。