C语言链表删除节点的优化与修正
// 链表删除已有节点\nvoid linklist_del(linklist *head,int n)\n{\n linklist *pos;\n for(pos=head;pos!=NULL;pos=pos->next)\n {\n if(pos->next->data==n)break;\n \n if(pos->next==NULL)return; \n } \n linklist *p=pos->next;\n pos->next=p->next;\n p->next==NULL;\n}\n\n上述代码的不妥之处在于以下几点:\n\n1. 在找到要删除的节点后,没有判断pos->next是否为空。如果要删除的节点是最后一个节点,pos->next将为NULL,此时直接调用pos->next->data会导致空指针错误。\n\n2. 在删除节点后,没有释放被删除节点的内存空间。这样会导致内存泄漏。\n\n3. 删除节点时,使用了双等号"=="而不是赋值符号"=",导致将NULL赋值给p->next,而不是将p->next置为NULL。\n\n修正后的代码如下:\n\nc\nvoid linklist_del(linklist *head, int n)\n{\n linklist *pos;\n for (pos = head; pos != NULL; pos = pos->next)\n {\n if (pos->next != NULL && pos->next->data == n)\n {\n linklist *p = pos->next;\n pos->next = p->next;\n free(p);\n break;\n }\n }\n}\n
原文地址: https://www.cveoy.top/t/topic/qgY6 著作权归作者所有。请勿转载和采集!