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日

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持