剑指offer-22-链表中倒数第K个字节(新手)(C语言)
C语言实现“链表中倒数第K个字节”
实现目标:
输入:
1 2 3 4 5
3
输出:
4 5
实现输入一个数组后再输入一个数,并打印这个数以及其后所指向的元素
代码(编译器vs2022)
整形输入(非整形同理,只需将相关的int和%d修改即可)
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
int main(int argc, char** argv)
{
int* p;
p = (int*)malloc(0);
int n = 0;
//存储当前指向的元素
int i = 0;
//数组的下标
while (scanf("%d",&n))
{
*(p + i) = n;
i++;
char ch = 0;
if ((ch = getchar()) == '\n')
break;
}
int k = 0;
scanf("%d",&k);
assert(k < i);
//此处i的值等与元素个数,k的值则是下标,所以不等
for (; k < i; k++)
printf("%d ",*(p + k));
return 0;
}其他问题:
1、#define _CRT_SECURE_NO_WARNINGS
这是因为在vs2022中一些原本C语言的函数例如scanf()会被任务存在风险,在最开始加人该语句使得程序得以运行,当然,如果不加这句话也可以运行,可以使用自带的函数,例如scanf_s(),这种写法可以保证在该编译器中得以无风险运行,但是相同代码无法保证在其他编译器中运行。
另外,不止vs2022,其他的编译器可能也存在相关问题
2、malloc()函数
因为不确定输入的个数,所以这里使用malloc()函数是为了减少空间浪费,内部输入多少都行
3、ungetc()函数
这里因为输入的是整形,而scanf()函数在接受整形时会自动跳过非1个(是1个!1个!!)非整形字符(除了空格’ ‘可以全部忽略),所以不需要使用ungetc()函数,如果是字符char类型,使用该函数可以实现输入abc依旧可以得到输出,而不限于a b c
4、assert()函数
相较if语句可以更直观地体现问题的存在,方便在测试与运行的时候发现并解决问题
瑕疵:
1、无法同时实现任意类型的倒序
2、无法不同类型混合使用
查看17道真题和解析
传音控股公司福利 356人发布