2013-06-04 68 views
4

这个函数获得一个指向该列表的“虚拟”项(第一项)和struct输入“节点”添加...Ç - 添加新项列表

但它进入一个无限循环...最新错误?

void listAdd(Node* dummy, Node tmpNode) { 

    Node* toAdd = (Node*)malloc(sizeof(Node)); 
    *toAdd = tmpNode; 
    Node *tmp1,*tmp2; 
    tmp1 = dummy; 
    tmp2 = (*dummy).next; 

    while (tmp1 != NULL){ 

      if (((*tmp1).info.id < (*toAdd).info.id && (*tmp2).info.id > (*toAdd).info.id) || (tmp2==NULL)) { 
        (*toAdd).next = (*tmp1).next; 
        (*tmp1).next = toAdd; 
        return; 
      } 

      tmp1 = (*tmp1).next; 
      tmp2 = (*tmp2).next; 
    } 
} 
+1

你为什么遍历整个列表来添加'tmpNode'到列表中?通常,当你有一个链表,并且你想添加一个节点时,你可以在前面添加它。这样更有效率。顺便说一下,“虚拟”不是一个好名字。像“头”这样的东西会更好。 –

+7

可读性提升:'(* tmp1).info'为'tmp1-> info'等。 – 2013-06-04 12:31:00

+0

Thenx为您的答案。我通过它的ID字段将节点添加到他的位置 - 它需要按这种方式排序。 – user2451694

回答

2

编辑: 我得到这个(这是在工作中缓慢的一天)抬出了一点,所以我重写功能使用(恕我直言)更清晰的变量名,减少多余的变量,并添加了基本错误处理。下面的例子支持插入,而前面的例子假设简单地追加到列表的末尾,这是不正确地阅读问题的结果(如果您好奇,请参阅编辑)。

void listAdd(Node* currentNode, Node toAdd) 
{ 
    Node * newNode = malloc(sizeof(Node)); 
    if(!newNode){ 
     //ERROR HANDLING 
    } 
    * newNode = toAdd; 
    newNode->next = NULL; 
    while (currentNode) 
    { 
     if(!currentNode->next) 
     //We've got to the end of the list without finding a place to insert the node. 
     //NULL pointer always evaluates to false in C regardless of the underlying value. 
     { 
      currentNode->next = newNode; 
      return; 
     } 
     //Test each member of the list to find out whether to insert or skip. 
     if((newNode->info.id > currentNode->info.id) && (newNode->info.id <= currentNode->next->info.id)){ 
      newNode->next = currentNode->next; 
      currentNode->next = newNode; 
      return; 
     } 
     else currentNode = currentNode->next; 
    } 
} 

如前文中已经提到的那样。解引用指向结构成员的指针使用相当漂亮的->表示法,它具有相当好的图像。还要注意的是,NULL总会被评估为假,除非你想要发生一些不好的事情(最好是段错误,最坏的情况是有些接管你的机器),你需要确保你写入正确的内存区域,所以您必须始终检查malloc返回!NULL

note:在C中,永远不会投出malloc()调用的返回值,因为这可以掩盖奇怪和危险的行为。在C++中,你需要必须转换结果,所以如果你希望程序编译为有效的C和C++,你需要考虑你要冒犯谁。详细信息请参见Do I cast the result of malloc?

+2

更好地将'tmp2 == NULL'上的测试移至'if'的开头,并将其与您的修补程序分开处理。如果元素被插入到中间,那么他对'toAdd-> next'的赋值是正确的。我其实不确定你的修复。请注意'tmp2 == tmp1-> next'。 –

+0

@BryanOlivier好点。我没有考虑在列表中间添加,只是结束。现在就解决这个问题。 – ldrumm

+0

thenx为你的答案 - 但代码假设将项目添加到列表的middel中,所以“toAdd”的“下一个”字段假设为他下面项目的“下一个”字段。如果我的评论不够清楚,请告诉我。 – user2451694