【问题标题】:C LinkedList adding node to endC链表将节点添加到末尾
【发布时间】:2013-04-01 01:41:04
【问题描述】:

我正在尝试创建一个可以将信息添加到链接列表的程序。似乎一旦我添加了 2 个以上的节点,之前添加的节点就会被覆盖。在完成这项工作时我缺少什么吗?

我从这个函数开始,它要么添加到列表的前面,要么如果已经有一个节点添加到前面,它会调用函数 addToBack

ListHeadPtr Front(ListHeadPtr theList, list * toBeAdded){

  printf("Received in addToFront\n");

  if(theList == NULL){
    theList = toBeAdded;
    return(theList);
  }

  else{
    theList = addToBack(theList,toBeAdded);
    /*toBeAdded->next = theList;
    theList = toBeAdded;*/
    return (theList);
  }

}

  ListHeadPtr back(ListHeadPtr theList, item * toBeAdded){

  if(theList == NULL){
    theList = addToFront(theList,toBeAdded);
    return(theList);
  }

  else{
    list *current;
    current = theList;
    while (current->next!=NULL){
      current = current->next;
    }
    current->next = toBeAdded;
    return(current);
  }

}

item(toBeAdded 由这个函数定义

item *createItem(int time){

  item *itemPtr = (list *) malloc(sizeof(item));

  if(NULL == itemPtr)
    {
        printf("Unable to create item\n");
        return (NULL);
    }

  itemPtr->waitTime = time;
  itemPtr->next = NULL;

  return (itemPtr);
}

【问题讨论】:

  • 您是否尝试过使用调试器单步执行?
  • @MitchWheat 不知道该怎么做。我对 C 还是很陌生。
  • 学习使用调试器非常有用,但在许多情况下,阅读代码并查看它是否符合您的要求会更快。看我的回答......(还)不需要调试器。

标签: c pointers insert linked-list


【解决方案1】:

在您的 [addTo]Back 函数中

return(current);

应该返回列表的头部。您正在做的是将列表截断为最后两个元素。

避免此类错误的一种方法是准确使用您的语义。 addToBack 定义返回什么?调用者希望它返回列表,并添加节点。函数之前应该有一个文档注释,说明它的作用和返回的内容。该注释可以指导您编写代码......如果最后只有一个语句返回列表,而不是多个返回,那么代码会更好。那么这个错误不可能发生。

【讨论】:

  • 非常感谢!那已经解决了。我遇到了另一个问题,由于某种原因,while 循环可能会卡住并且无法退出?
  • 如果在列表中创建循环,while 循环会卡住。让 addToFront 调用 addToBack 和 v.v.是可疑的......两个函数都不应该调用另一个。如果列表为空,addToBack 应该只返回节点,或者找到列表的末尾并附加节点,addToFront 应该只使节点的下一个 ptr 指向列表,然后返回节点。
  • 感谢您的意见,我会检查的。
  • 为了避免函数相互调用,我在 main 中实现了这个检查:if(line==NULL) line2 = addToFront(line,toBeAdded); else line = addToBack(line,toBeAdded); 然而,现在它曾经不是无限循环,现在是。
  • @user2225940 好吧,我解释了 addToFront 和 addToBack 应该做什么。 Main 应该调用一个或另一个,具体取决于您是将列表视为堆栈 (addToFront) 还是队列 (addToBack) ...它不应该以列表是否为空为条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2014-02-02
  • 2013-11-13
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多