-3

这是我的删除节点功能,谁能帮我看看它有什么问题?我似乎遇到了很多麻烦,因为我不明白其中的某些部分。

  1. 指向头部的指针应该如何使用?struct lnode** 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);
        }
    }
    
4

1 回答 1

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);
}
}
于 2013-02-23T02:08:59.233 回答