人生第一道链表题:删除指定数字 2021-11-26写

#include<stdio.h>
struct Node
{
    int date;
    struct Node* next;
};
int main()
{
    struct Node*list=NULL;
    struct Node*tail=NULL;

    int m=0,n=0,i=0,del;
    scanf("%d",&n);
    //接受数字
    /*****************************接收功能**********************************/
    for(i=0;i<n;i++)
    {
        scanf("%d",&m);
        struct Node*pd=(struct Node*)malloc(sizeof(struct Node));//创建一个动态内存存储
        pd->date=m;//将m存入第一个动态内存的date中
        pd->next=NULL;//然后创建的新的动态内存的节点中指针域指向为空
        if(list==NULL)//如果指向第一个指针的头指针的指针域没有指向任何一个节点
        {

            list=pd;//将第一个节点给头指针
            tail=pd;//将第一个节点给尾指针,用于连接下一个节点
        }
        else
        {
            tail->next=pd;//将新创建的节点的地址给tail的next 用于连接两个节点
            tail=pd;//再将新节点的地址给尾指针重复上述操作
        }
    }
    scanf("%d",&del);//输入要删除的数字;
    /******************************删除功能***************************/
    struct Node* cur=NULL;//用于查找的指针
    struct Node* prov=NULL;//记录前一个节点的指针
    cur=list;//将头指针指向的第一个节点给上cur
    while(cur)//如果cur->next==NULL认为已经遍历完所有数组,结束循环
    {
        if(del==cur->date)//如果要删除的数字等于cur->date
        {
            struct Node*pd=cur;//用于释放的指针,先指向第一个元素的地址,  与cur同步进行遍历
            if(cur==list)//如果要删除的元素在第一个节点的位置
            {
                list=list->next;//将头指针指向第二个节点的位置
                cur=list;//再将list赋值给cur,使得cur重新指向第二个
            }
            else//如果在第二个或者后面的位置
            {
                prov->next=cur->next;//怕想不明白,要记得自己结合着图来走,例如:要删除第二个吧,将第二个元素cur->next的地址赋值给保留上一个节点的指针,既将第三个节点的位置放到第一个节点的next中,使之第一个与第三个进行连接
                cur=cur->next;       //自我指向下一个节点的位置,将pd留下,每次判断的时候又会重新将pd与cur同步


            }
            free(pd);//将pd释放,每一次循环判断都会重新将pd赋值为cur也就是新一轮的第一个节点的位置
            n--;
        }
        else//如果要删除的节点不等于cur->data,那么往后遍历
        {
            prov=cur;//记录上一个节点的位置
            cur=cur->next;//cur去找下一个节点的元素
        }
    }
    /*******************************输出功能**************************/
    cur=list;
    while(cur)
    {
        printf("%d ",cur->date);//输出每个节点的data的数值;
        cur=cur->next;//遍历数组
    }
    /*******************************释放功能***************************/
    cur=list;
    struct Node* sf=NULL;
    while(cur)
    {
        sf=cur;//释放指针指向cur第一个节点
        cur=cur->next;//向下遍历
        free(sf);//释放指针;
    }
    list=NULL;//头指针的释放
    return 0;
}

总结:第一次书写,消耗了近一个点的时间才完成,其中遇到忘了的会重新回去翻看视频,并重新书写,整理思路,希望以后可以坚持下去,将每条代码加上自己的理解,希望可以对自己以后复盘的时候有所帮助,以上2021-11-26日晚20:00完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值