c – 将新项添加到列表中

此函数获取指向列表中“Dummy”项的指针(第1项)和要添加的结构类型“Node”…

但它进入无限循环……什么是错的???

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;   
    }
}

最佳答案 编辑:

我对此有点不知所措(这是一个缓慢的工作日)所以我重写了使用(IMHO)更清晰的变量名称,更少的冗余变量和添加基本错误处理的功能.下面的示例支持插入,而前一个示例假设简单地附加到列表的末尾,这是不能正确读取问题的结果(如果您很好奇,请参阅编辑).

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总是会被评估为false,除非你想要发生一些不好的事情(最好是一个段错误,最糟糕的是有些接管你的机器),你需要确保你写入适当的内存区域,所以你必须经常检查malloc返回!NULL.

注意:在C中,永远不会转换malloc()调用的返回值,因为这可以掩盖奇怪和危险的行为.在C中,您必须转换结果,因此如果您希望程序编译为有效的C和C,则需要考虑您将要冒犯谁.有关详情,请参见Do I cast the result of malloc?.

点赞