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