剑指offer-18-删除链表的节点(新手)(C语言)

C语言实现“删除链表的节点”

实现目标:
输入
head:1 1 1 2 2 3
val:2
输出
out:1 1 1 3
实现删除所有输入的某个值

代码(编译器:vs2022)
整形输入(非整形应该同理,只需要将相关Int和%d修改即可,但本人未调试)

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
//存放printf()、scanf()、getchar()
#include <stdlib.h>
//存放malloc()
#include <assert.h>
//存放assert()

int main()
{
    int* head;
    head = (int*)malloc(0);
    int n = 0;
    int i = 0;
    char ch = 0;
    printf("head:");
    while (scanf("%d", &n))
    {
        *(head + i) = n;
        i++;
        if ((ch = getchar()) == '\n')
            break;
    }
    //此时i等于head中元素的个数
    int val = 0;
    //要剔除的节点
    int j = 0;
    int k = 0;
    int l = 0;
    //用于存储输入的元素符合val要求的元素个数
    printf("\nval:");
    scanf("%d", &val);
    for (; j != i; j++)
        if (*(head + j) == val)
        {
            for (k = j; k < i - 1; k++)
                *(head + k) = *(head + k + 1);
            *(head + k) = 0;
            i--;
            //计算剩余的元素个数
            l++;
            j = -1;
            //因为每次循环时j都会+1,所以j = -1使得刚进入循环时j的下标为0
        }
    j = 0;
    assert(l != 0);
    //判断head中是否存在val
    printf("\nout:\t");
    for (; j < i; j++)
        //因为i是元素个数,所以最后一个元素的下标 = i-1
        printf("%d\t", *(head + j));
    printf("\n");
    return 0;
}

其他问题:

1、#define _CRT_SECURE_NO_WARNINGS
这是因为在vs2022中一些原本C语言的函数例如scanf()会被任务存在风险,在最开始加人该语句使得程序得以运行,当然,如果不加这句话也可以运行,可以使用自带的函数,例如scanf_s(),这种写法可以保证在该编译器中得以无风险运行,但是相同代码无法保证在其他编译器中运行。
另外,不止vs2022,其他的编译器可能也存在相关问题

2、malloc()
因为不确定输入的个数,所以这里使用malloc()函数是为了减少空间浪费,内部输入多少都行

瑕疵:

1、无法同时实现任意类型的操作

2、无法不同类型混合使用

3、过于冗长

#剑指offer##C语言#
全部评论
这题我也刷到过
1 回复 分享
发布于 2022-10-04 10:04 山西

相关推荐

04-13 18:10
门头沟学院 Java
想熬夜的小飞象在秋招:被腾讯挂了后爸妈以为我失联了
点赞 评论 收藏
分享
牛客246576843号:建议简历对点优化,想做HR专门列出HR实习,想做运营专门列出运营实习,并且对点写出项目经历以及数据,同时在个人总结上可以多凸出和岗位的匹配度
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务