剑指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语言#
