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 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?