HMHMHT 2023-01-22 22:35 采纳率: 66.7%
浏览 58
已结题

C双向链表删除中间节点无法打印

C数据结构双向链表节点删除问题。
出现错误的模块是中间节点(至少3个)的删除,该节点后续无法打印(我根据返回值查到的错误可能是栈溢出

//tmp指向  前驱的后继指向 删除的后继  删除后继的前驱指向删除的前驱
//空表无删除 
//只有一个置为NULL 
//删首节点 不需要前驱节点的操作
//删尾结点 不需要后驱节点的操作 
void Delete_list(Node **phead , int num)//后者为待删除节点对应键值 
{
    Node *tmp  = (Node *) malloc (sizeof(Node));
    Node *p = *phead;
    int flag;
    
    if(!p)
    printf("此表为空");
    else
    {
        if(!( p -> next))//单一节点判断 
        {
            if(p -> data = num)
            {
                flag = 1;
                *phead = NULL;
            }
         }
         //非单一节点 
         else
         {
             if((*phead)-> data == num)
             {
                 flag =1;
                 tmp = (*phead);
                 (*phead) = (*phead)->next;//运算符 * 取地址的优先级很低 因此使用尽量加括号 
                 (*phead)->prior=NULL; 
                 free(tmp);
                 
              } 
              else
              {
                  while(p->next)
                  {
                      
                      if(p -> data == num)
                      {
                          flag =1;
                          tmp = p;
                          printf("%d %d",p->prior->data,p->next->data);
                          Node *test1,*test2;
                          
                          tmp -> prior-> next = tmp->next;
                          tmp -> next-> prior = tmp->prior;
                          
                        test1= tmp -> prior-> next;//4
                          test2 =tmp -> next-> prior;//2
                          printf("\n%d %d",test1->data,test2->next->data);
                                                
                          free(tmp);
                          break;
                    }
                    p = p -> next;    
                 }
                 if(p->data == num)
                 
                 {
                     flag = 1;
                    tmp = p;
                    p -> prior -> next = NULL;
                    free(tmp);  
                 }
              }
             
          } 
     } 
    
}

img

双链表我将删除节点的前后节点重新相连为何断链了,但是test测试又表明实际相连,我想请问一下这是哪里出现问题了?

  • 写回答

3条回答 默认 最新

  • qzjhjxj 2023-01-23 12:23
    关注

    题主想的复杂了,修改完善如下,供参考:

    void Delete_list(Node** phead, int num)
    {
        Node* p = *phead;
        if (!p)
            printf("此表为空");
        else{
            while (p) //while (p->next)
            {
                if (p->data == num)
                {
                    if (p == (*phead)){   //链表第一个结点
                        (*phead) = p->next;
                        if(p->next)
                            p->next->prior = NULL;
                    }
                    else if (!p->next){   //链表最末尾结点
                        p->prior->next = NULL;
                    }
                    else{
                        p->prior->next = p->next;
                        p->next->prior = p->prior;
                    }
                    free(p);
                    break;
                }
                p = p->next;
            }
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月24日
  • 已采纳回答 3月16日
  • 创建了问题 1月22日

悬赏问题

  • ¥20 电脑拓展屏桌面被莫名遮挡
  • ¥20 ensp,用局域网解决
  • ¥15 Python语言实验
  • ¥15 我每周要在投影仪优酷上自动连续播放112场电影,我每一周遥控操作一次投影仪,并使得电影永远不重复播放,请问怎样操作好呢?有那么多电影看吗?
  • ¥20 电脑重启停留在grub界面,引导出错需修复
  • ¥15 matlab透明图叠加
  • ¥50 基于stm32l4系列 使用blunrg-ms的ble gatt 创建 hid 服务失败
  • ¥150 计算DC/DC变换器平均模型中的参数mu
  • ¥25 C语言代码,大家帮帮我
  • ¥50 关于#html5#的问题:H5页面用户手机返回的时候跳转到指定页面例如(语言-javascript)