开天辟地的卷毛 2022-09-29 00:52 采纳率: 85.4%
浏览 45
已结题

C语言链表删除功能,删除的节点再次插入链表的问题


//设计双链表的数据节点类型 
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>



typedef struct node
{
    int data;
    struct node *next;
    struct node *prev;
}DN,*PDN;
//struct node -----DN
//struct node *----PDN

//新建空的带头节点的双向头节点链表 
PDN doublelist_init() 
{
    //申请头节点内存 
    PDN phead=(PDN*)malloc(sizeof(DN));
    if(phead==NULL)
    {
        printf("malloc fail\n");
        return false;
    }
    phead->next=phead;
    phead->prev=phead;
    return phead;
}

bool is_empty(PDN phead)
{
    if(phead->prev==NULL && phead->next==NULL)
       return true;
    else
       return false;
}

//向后遍历 
show_head(PDN phead)
{
    if(phead==NULL)
    {
        printf("malloc fail\n");
        return false;
    }
    if(is_empty(phead))
       return;
       
    PDN p=phead->next;
    while(p!=phead)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
    printf("\n");
    
    return;
}

//向前遍历 
show_tail(PDN phead)
{
    if(phead==NULL)
    {
        printf("malloc fail\n");
        return false;
    }
    PDN p=phead->prev;
    while(p!=phead)
    {
        printf("%d\t",p->data);
        p=p->prev; 
    }
    printf("\n");
    
    return;
}

//把d作为数据域,构造新节点,然后把新节点插入到phead指向的头节点
//插入成功返回true,失败返回false 
bool insert_node_head(PDN phead,int d)
{
    //把d作为数据域,构造新节点 
    //申请新节点内存空间 
    PDN pnew=(PDN*)malloc(sizeof(DN));
    if(pnew==NULL)
    {
        printf("malloc fail\n");
        return false;
    }
    pnew->data=d;
    pnew->prev=NULL;
    pnew->next=NULL;
    
    if(phead==NULL||pnew==NULL)
    {
        printf("malloc fail\n");
        return;
    }
    
    pnew->next=phead->next;
    pnew->prev=phead;
    phead->next->prev=pnew;
    phead->next=pnew;
    
    return true;
}
//把d作为数据域,构造新节点,然后把新节点插入到phead指向的头节点前面(整条链表的末尾) 
//插入成功返回true,失败返回false 
bool insert_node_tail(PDN phead,int d)
{
    PDN pnew=(PDN*)malloc(sizeof(DN));
    /*PDN p = phead->prev; //聪和佳的写法*/
    if(pnew==NULL)
    {
        printf("malloc fail\n");
        return false;
    }
    pnew->data=d;
    pnew->prev=NULL;
    pnew->next=NULL;
    
    //聪和佳的写法
    //pnew->prev = p;
    //pnew->next = phead;
    //phead->prev = pnew;
    //p->next = pnew;
    pnew->prev=phead->prev;
    pnew->next=phead;
    phead->prev->next=pnew;
    phead->prev=pnew;
    
    return true;
}

int delete(PDN phead,int d,PDN pdata)
{
    /*int flag = 0;*/
    if(is_empty(phead))
       return false ;
       
    PDN pdel = phead->next;
    PDN pdata_del = NULL;
    while(pdel!=phead)
    {
       if(pdel->data==d)
       {
           PDN pdata_del = pdel;
           pdel->prev->next=pdel->next;
           pdel->next->prev=pdel->prev;
           
           /*flag=1*/;
           break;
       }
       pdel=pdel->next;
    }
    //if (flag == 0)
    //    return false;
    //else
    //    return pdata_del;
    return pdata_del;
}

int main()
{
    //创建空的带头节点的双向循环链表 
    PDN phead=doublelist_init();
    PDN pdata = NULL;
    
    //向链表头部中插入节点
    printf("this is doublelist after insert node from head\n");
    printf("show head and tail:\n");
    insert_node_head(phead,1);
    insert_node_head(phead,2);
    insert_node_head(phead,3);
    insert_node_head(phead,4);
    show_head(phead);
    show_tail(phead);
    
    //向链表尾部中插入节点 
    printf("this is doublelist after insert node from tail");
    printf("show head and tail:\n");
    insert_node_tail(phead,1);
    insert_node_tail(phead,2);
    insert_node_tail(phead,3);
    insert_node_tail(phead,5);
    show_head(phead);
    show_tail(phead);
    
    //删除链表的数据
    printf("this is doulelist after delete tail\n");
    printf("show head and tail:\n");
    if(pdata=delete(phead,5,&pdata))
          printf("delete success\n");
    else
        printf("delete fail\n"); 
    show_head(phead);
    show_tail(phead);
}

如何将删除功能中,以删除的链表节点(没有清除数据),重新插入想插入的链表节点位置,该节点也返回给主函数

  • 写回答

2条回答 默认 最新

  • 莪是男神 2022-09-29 11:55
    关注

    你是想删除节点后,还可以添加被删除的节点嘛?你可以再创建一个链表,作为回收站一样的功能。

    • 当删除节点时,就是把被删除的节点放到新链表中,同时当前链表删除此节点
    • 当恢复节点时,就是从新链表中取出元素并删除然后放到当前链表
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月7日
  • 已采纳回答 9月29日
  • 创建了问题 9月29日

悬赏问题

  • ¥15 状态机/汽车转向灯/Sateflow
  • ¥15 这个有点复杂 有没有人看看
  • ¥15 用python如何确定子孙元素在父元素中的位置
  • ¥15 obj文件滤除异常高程
  • ¥15 用mathematicas或者matlab计算三重积分
  • ¥15 Loop unrolling的runtime计算
  • ¥100 NVMe-oF的Target端,开启attr_offload后,测试失败。
  • ¥100 有偿照片马赛克去掉,保留原始数据
  • ¥15 c# winform http报错,如何解决?
  • ¥15 统计软件及应用-r软件