You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双向链表元素增删异常:仅首元素可删除其余失效求排查

双向链表删除功能故障排查

你的双向链表仅能删除头节点(示例中的300),其他元素删除失败的核心原因有两个:

问题1:删除最后一个节点时触发空指针访问

在delete函数中,当要删除的是链表最后一个节点时,执行iter->next = iter->next->next;后,iter->next会变为NULL,此时后续的iter->next->prev=iter;会尝试访问空指针的成员,直接导致程序崩溃,后续代码无法执行,看起来像是删除失败。

问题2:删除头节点后未重置新头节点的prev指针

当删除头节点时,新的头节点的prev指针仍指向已被释放的旧头节点,会产生野指针,可能引发后续操作的异常。

修复后的delete函数代码

node * delete(node *r, int x){    
    node *temp;    
    node *iter = r;     
    if(r->x == x){    
        temp = r;    
        r = r->next;    
        if(r != NULL) // 重置新头节点的prev为NULL
            r->prev = NULL;    
        free(temp);    
        return r;    
    }    
    while(iter->next != NULL && iter->next->x != x){    
        iter = iter->next;    
    }    
    if(iter->next==NULL){    
        printf("Number was not found \n");    
        return r;    
    }    
    temp = iter->next;    
    iter->next = iter->next->next;       
    if(iter->next != NULL) // 判断非空后再修改prev指针
        iter->next->prev=iter;    
    free(temp);    
    return r;    
}

修复后的运行逻辑

  • 删除头节点时,会将新头节点的prev置为NULL,避免野指针
  • 删除中间或末尾节点时,先判断iter->next是否为NULL,仅在非空时修改prev指针,避免空指针访问

测试你的main函数,修复后将能正常删除所有存在的元素,输出如下:

300 350 400 450 500 
Number was not found 
350 400 450 500 
350 400 450 
400 450 

内容的提问来源于stack exchange,提问作者sabina aliyeva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:34:43