这个链表实现有什么问题?

时间:2011-08-13 18:14:32

标签: c linked-list

在我的脑袋上摔了一段时间后,我正在寻求帮助。也许我在做一些非常愚蠢的事情。以下是linkedlist的基本实现。但是,它似乎不起作用。有人可以看看吗?

编辑:不工作我的意思是它在add函数的else部分进入无限循环。

#include <iostream>

struct node
{
    int data;
    node* link;
};

void add(struct node** list, int i)
{
    //populate a node
    node* tempNode = (node*) malloc(sizeof(node));
    tempNode->data = i; //**This does not seem to initialize data**
    tempNode->link = NULL; //**Same here**

    //check if the list is empty
    if(*list == NULL)
    {
        //create the node
        *list = tempNode;
    }
    else
    {
        while((*list)->link != NULL); //Enters in to an endless loop here because the link is not initialized
        (*list)->link = tempNode;
    }

}

void print(node** list)
{
    node* itr = *list;
    while(itr != NULL)
    {
        std::cout << itr->data << "\n";
        itr = itr->link;
    }
}

int main()
{
    node* linkedList = NULL;
    node** t = &linkedList;
    add(&linkedList, 10);
    add(&linkedList, 20);
    add(&linkedList, 30);
    add(&linkedList, 40);
    print(&linkedList);

}

4 个答案:

答案 0 :(得分:2)

您的add功能错误(else分支)。由于(*list)->link未被更改,将永远循环。试试这个。

void add(struct node** list, int i)
{
    /* .... */
    if(*list == NULL)
        *list = tempNode;
    else {
        struct node *p = *list;
        /* Search for tail. */
        while(p->link)
            p = p->link;

        /* Since p->link is NULL, it's the tail. */
        p->link = tempNode;
    }
}

这会插入O(n); user786653在评论中有一个很好的建议。

答案 1 :(得分:1)

  

while((* list) - &gt; link!= NULL); //在此输入无限循环,因为链接未初始化

嗯,你不应该试图使用未初始化的值;确保它首先被初始化。

但很明显,任何非null值都会出现问题:在循环内部没有办法让值更改,因此它将永远保持非null。也许你应该重新思考逻辑?这部分代码应该做什么,为什么?

(我故意不直接回答,所以你可以做自己的想法 - 这是一项重要的技能。)

答案 2 :(得分:0)

add()

中试试
    else
    {
        struct node *n = *list;
        while (n->link != NULL)
            n = n->link;
        n->link = tempNode;
    }

答案 3 :(得分:0)

这是一个工作版本。我不确定,但是阅读这篇文章并将其与你的文章进行比较可能会教你不仅仅是阅读差异分析。

#include <iostream>

struct node {
  int data;
  node* link;
};

void add(struct node** list, int i)
{
  // populate a node
  node* tempNode = (node *)malloc(sizeof(node));
  tempNode->data = i;
  tempNode->link = NULL;

  //check if the list is empty
  if(*list == NULL)
    *list = tempNode; //create the node
  else {
    while((*list)->link != NULL)
      list = &(*list)->link;
    (*list)->link = tempNode;
  }
}

void print(node** list)
{
  node* itr = *list;
  while(itr != NULL) {
    std::cout << itr->data << "\n";
    itr = itr->link;
  }
}

int main()
{
  node* linkedList = NULL;
  add(&linkedList, 10);
  add(&linkedList, 20);
  add(&linkedList, 30);
  add(&linkedList, 40);
  print(&linkedList);
}