这是我的删除节点功能,任何人都可以帮我看看它有什么问题吗?我似乎遇到了很多麻烦,因为我不了解它的某些部分。
如何使用指向头部的指针? struct lnode ** head,我知道这是一个指向head指针的指针。但是我不确定我是否正确使用它。
代码的第二部分,我不确定在删除函数调用的节点后是否正确连接两个节点。
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);
}
}
答案 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);
}
}