deleteNode函数错误

时间:2013-02-23 02:00:12

标签: c

这是我的删除节点功能,任何人都可以帮我看看它有什么问题吗?我似乎遇到了很多麻烦,因为我不了解它的某些部分。

  1. 如何使用指向头部的指针? struct lnode ** head,我知道这是一个指向head指针的指针。但是我不确定我是否正确使用它。

  2. 代码的第二部分,我不确定在删除函数调用的节点后是否正确连接两个节点。

    void deleteNode (struct lnode** head, struct lnode* node) {
            if((*head) == node){
               struct lnode* temp = (*head) -> next;
               free(node);
               free(node->word);
               *head = temp;
            }
            else{
             struct lnode *nextNode = node->next;
             struct lnode *prevNode;
             while((*head) != NULL){
                if((*head)->next = node){
                    prevNode = *head;
                    break;
                }
                else
                    *head = (*head) ->  next;
            }
            prevNode->next = nextNode;
            free(node);
            free(node->word);
        }
    }
    

1 个答案:

答案 0 :(得分:1)

请尝试使用此修改过的程序。在原始计划中,存在以下问题。

如果要删除的节点与head匹配,那么您将节点释放两次。当您尝试释放已经释放的内存时,这会产生异常。

if条件中的比较需要if((*head)->next == node)而不是if((*head)->next = node)

释放内存的顺序很重要。因此,在释放node->word之前应释放node

void deleteNode (struct lnode** head, struct lnode* node) {
     struct lnode *prevNode = *head;
    if((*head) == node){
       struct lnode* temp = (*head) -> next;
       *head = temp;
    }
    else{
     struct lnode *nextNode = node->next;
     while((*head) != NULL){
        if((*head)->next == node){
            prevNode = *head;
            break;
        }
        else
            *head = (*head) ->  next;
    }
    prevNode->next = nextNode;
    free(node->word);
    free(node);
}
}