2013-05-19 109 views
1

我正在递归地向列表中添加一个元素,编写一个插入函数。问题是当我运行程序并尝试插入时,它只是插入一次,然后在第二次中断时并有一个错误。 任何建议,感谢名单链接列表插入函数递归C++

辅助函数:

void List::insertHelper(Node* list, int number) 
     { 
      if(list->next != NULL) 
      { 
       insertHelper(list->next, number); 
      } 
      else 
      { 
       list->next = new Node; 
       list->next->data = number; 
      } 

     } 

此功能时,我所说的递归一个:

void List::insert(int d) 
    { 
     if(head == NULL) 
     { 
      head = new Node; 
      head->data = d; 
     } 
     else 
     { 
     insertHelper(head, d); 
     } 

    } 
+0

有什么*编译*?在这段代码中没有'Insert'函数,但是它从List :: insert中调用,也没有叫Node的类/结构,也没有叫做'head'的全局变量。请发布* real *代码。 – WhozCraig

+0

插入函数是insertHelper。 thx – Mido

+1

我的心理调试器告诉我'Node'的构造函数永远不会将'Node :: next'设置为NULL,而且这段代码的其余部分也不会。你的'Node :: Node()'构造函数应该接受一个数据元素并且初始化'data'成员和'next',比如Node :: Node(int data):data(data),next(NULL) {}' – WhozCraig

回答

1

您的问题是缺乏如下:

list->next->next = NULL; 

在insertHelper的else部分。至于“建议”部分,如果可以帮助,请避免递归处理列表。你(未来)的同事不会理解它。

+0

是的,你说得对,谢谢! – Mido

1
void List::insertHelper(Node* list, int number) 
     { 
      if(list->next != NULL) 
      { 
       insertHelper(list->next, number); 
      } 
      else 
      { 
       list->next = new Node; 
       list->next->data = number; 
       list->next->next=NULL; // You are missing this line.... becuase of this.. new nodes next remains as dangling pointer instead of null.. 
      } 

     } 
+0

+1(虽然它实际上是一个*不确定的指针*,不是一个悬挂的指针,dangler是一个有效的指针,然后释放/释放,然后无效)。另外,一个体面的构造函数可以更好地解决这个问题,因为它可以确保Node的所有实例都有一个初始化的指针。不只是这里创建的那个。 – WhozCraig

1

每次插入新节点时,都必须将该新节点的下一个值设置为NULL。否则,每次调用insertHelper时都会得到一些垃圾指针值。

这里是修改后的代码。

void List::insertHelper(Node* list, int number) 
    { 
     if(list->next != NULL) 
     { 
      insertHelper(list->next, number); 
     } 
     else 
     { 
      list->next = new Node; 
      list->next->data = number; 
      list->next->next = NULL; //MODIFIED LINE 
     } 

    } 

void List::insert(int d) 
    { 
     if(head == NULL) 
     { 
      head = new Node; 
      head->data = d; 
      head->next = NULL; //MODIFIED LINE 
     } 
     else 
     { 
      insertHelper(head, d); 
     } 

    } 

这应该有希望工作。

+0

是的,它是固定的,谢谢你的回答 – Mido