浏览链接列表

时间:2016-12-22 11:57:29

标签: c pointers linked-list

我正在尝试创建一个稀疏(链接)结构,每个节点指向其所有子节点(总共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的节点越多,孩子们也会被遍历吗?

非常感谢!

1 个答案:

答案 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。如果您的代码试图模仿文件结构,则应使用树,而不是链表。