deleteNode函数错误
这是我的删除节点函数,任何人都可以帮我看看它有什么问题吗?我似乎遇到了很多麻烦,因为我不了解它的某些部分。deleteNode函数错误
指向头的指针是否会假设被使用? struct lnode **头,我知道这是一个指向头指针的指针。但是我不确定我是否正确使用它。
-
代码的第二部分,我不确定在删除函数调用的那个后,我是否正确连接了这两个节点。
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); } }
请与该修改的程序试试。在原始计划中,存在以下问题。
如果要删除的节点与head匹配,那么您将节点释放两次。当您尝试释放已经释放的内存时,这会产生异常。
在if
条件的比较是if((*head)->next == node)
代替if((*head)->next = node)
的释放内存是重要的顺序所需的。因此在释放node
之前应该释放node->word
。
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-23 02:13:30
我的荣幸:)你是否按照预期的方式工作? – Ganesh 2013-02-23 02:15:23
此代码修改传入的头部。除非头部被删除,否则不应该修改。在循环初始化'struct lnode * prevNode = * head;'并在循环迭代中使用'prevNode = prevNode-> next;' – user1952500 2013-02-23 02:21:03
写入'free(node); free(node-> word);'因为第二个调用正在访问一个现在释放的内存块。您必须将这些呼叫排序为“free(节点 - >单词);*(节点);'。 – 2014-05-05 03:33:00