单链表的删除

复制代码
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
typedef struct list biao;
struct list 
{
    int data;
    biao* next;

}list1;
void dataprint(biao* point)
{
    biao* list1 = point;
    while (list1 != NULL)
    {
        printf("%d->", list1->data);
        list1 = list1->next;
    }
    printf("NULL\n");
}
void frontset(biao** point1, int x)
{
  
    biao* point2 = (biao*)malloc(sizeof(biao));
    if (point2 == NULL)
    {
        printf("error about point2");
        return;
    }
    point2->data = x;
    point2->next =*point1;
    *point1 = point2;
}
void backset(biao**point1,int x)
{
    if (*point1 != NULL)
    {
        biao* point2 = *point1;
        while ((point2)->next != NULL)
        {
            point2 = (point2)->next;
        }
        biao* point3 = (biao*)malloc(sizeof(list));
        if (point3 == NULL)
        {
            printf("error of point3");
            return;
        }

        point2->next = point3;

        point3->next = NULL;
        point3->data = x;
    }
    else
    {
        biao*point4 = (biao*)malloc(sizeof(biao));
        point4->data = x;
        point4->next = NULL;
        *point1 = point4;
    }
}
void backlose(biao** point1)
{
    if ((*point1)->next != NULL)
    {
        biao* point2 = NULL;
        biao* point3 = *point1;
        while (point3->next != NULL)
        {
            point2 = point3;
            point3 = point3->next;
        }
        free(point3);
        point3 = NULL;
        (point2)->next = NULL;
    }
    else if((*point1)->next==NULL) {
        free(*point1);
        *point1 = NULL;
    }
    else//perror只能报系统函数的错误
    {
        assert(*point1);
    }
}
void frontlose(biao** point1)
{
    if (*point1 == NULL)
    {
        assert(*point1);
    }
    else if ((*point1)->next == NULL)
    {
        free(*point1);
        point1 = NULL;
    }
    else
    {
        biao *point2 = (*point1)->next;
        free(*point1);
        *point1 = point2;

    }
}
int main()
{
    biao *good = NULL;
    frontset(&good, 1);
    frontset(&good, 2);
    frontset(&good, 3);
    frontset(&good, 4);
    backset(&good, 0);
    //backlose(&good);
    frontlose(&good);
    dataprint(good);
    
    return 0;
}

backlose函数解析:

1.首先整理一下尾删的思路:让倒数第二项的next指向NULL,并释放倒数第一项的空间。前者提示我们的二级指针操作需要在倒数第二项,而后者提醒我们要分出指针去释放倒数第一项的空间

2.两个指针的分配思路:慢半拍和远一点

1.慢半拍思路(样例),即将最后一项的next指向NULL作为判断条件,而定义的两个指针,一个最终指向倒数第一项,一个最终指向倒数第二项,而我们可以控制第二个指针在每次循环中的值都是第一个指针在上一个循环中的值,所以可以写出以上函数

2.远一点思路:不需要两个指针,只需要将判断条件改为point1->next->next!=NULL即可,得到的直接就是倒数第二个表块的指针,可以先通过next来释放倒数第一个的表块,然后再修改自身指针值

3.分类讨论思想:如果只有一项就会发现如果采用旧循环则一次都进不去,所以要直接判断直接释放,而本来一项都没有就要删除是错误的,所以可以直接报错(注意:perror只能用于函数的使用错误,而assert可以用于所有的报错)

frontlose函数解析:

1.首先梳理一下函数的主体思想:释放第一位的空间并将头指针指向第二位,逻辑与backlose函数大同小异所以不再赘述。

相关推荐
破浪前行·吴10 分钟前
数据结构概述
数据结构·学习
小欣加油1 小时前
leetcode2078 两栋颜色不同且距离最远的房子
数据结构·c++·算法·leetcode·职场和发展
我真不是小鱼1 小时前
cpp刷题打卡记录30——轮转数组 & 螺旋矩阵 & 搜索二维矩阵II
数据结构·c++·算法·leetcode
码完就睡5 小时前
数据结构——栈和队列的相互模拟
数据结构
iiiiyu5 小时前
常用API(SimpleDateFormat类 & Calendar类 & JDK8日期 时间 日期时间 & JDK8日期(时区) )
java·大数据·开发语言·数据结构·编程语言
故事和你915 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
꧁细听勿语情꧂6 小时前
数据结构概念和算法、时间复杂度、空间复杂度引入
c语言·开发语言·数据结构·算法
Felven7 小时前
B. The 67th 6-7 Integer Problem
数据结构·算法
研☆香7 小时前
聊一聊如何分析js中的数据结构
开发语言·javascript·数据结构
会编程的土豆8 小时前
【复习】二分查找
数据结构·c++·算法