剑指offer-25-合并两个排序的链表(新手)(C语言)

C语言实现“合并两个排序的链表”

实现目标:
输入:
1 3 5
2 4 6
输出:
1 2 3 4 5 6

代码(编译器: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;
    int* q;
    int* r;
    printf("输入两个同序的数组\n");
    p = (int*)malloc(0); int pp = 0;
    //原数组1及其元素个数
    q = (int*)malloc(0); int qq = 0;
    //原数组2及其元素个数
    r = (int*)malloc(0);
    //输出数组
    int n = 0;
    //临时存储元素
    int i = 0;
    //赋值时的下标
    while (scanf("%d", &n))
    {
        *(p + i) = n;
        pp++;
        i++;
        char ch = 0;
        if ((ch = getchar()) == '\n')
            break;
    }
    i = 0;
    while (scanf("%d", &n))
    {
        *(q + i) = n;
        qq++;
        i++;
        char ch = 0;
        if ((ch = getchar()) == '\n')
            break;
    }
    int flag1 = 0;
    int flag2 = 0;
    //判断两个数组的升降序
    //升序1,降序-1
    if (*(p + 0) > *(p + 1)) 
        flag1 = -1;
    else flag1 = 1;
    for (int j = 0; j < pp - 1; j++)
        assert(*(p + j) * flag1 < *(p + j + 1) * flag1);
    if (*(q + 0) > *(q + 1))
        flag2 = -1;
    else flag2 = 1;
    for (int j = 0; j < qq - 1; j++)
        assert(*(q + j) * flag2 < *(q + j + 1) * flag2);
    assert(flag1 == flag2);
    //判断是否同序
    int flag = flag1;
    int j = 0;
    //数组一的即时下标
    int k = 0;
    //数组二的即时下标
    int l = 0;
    //输出数组的下标
    for (; j < pp; j++)
        for (; k < qq; k++)
            if (*(p + j) * flag > *(q + k) * flag)
            {
                *(r + l) = *(q + k);
                l++;
            }
            else
            {
                *(r + l) = *(p + j);
                l++;
                break;
            }
    //因为最后一个元素和空白比较,所以没有赋值,这里补充赋值
    if (*(p + pp - 1) * flag < *(q + qq - 1) * flag)
        *(r + l) = *(q + qq - 1);
    else
        *(r + l) = *(p + pp - 1);
    l++;
    for (int m = 0; m < l; m++)
        printf("%d\t", *(r + m));
    return 0;
}

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

2、ungetc()函数
这里因为输入的是整形,而scanf()函数在接受整形时会自动跳过非1个(是1个!1个!!)非整形字符(除了空格’ ‘可以全部忽略),所以不需要使用ungetc()函数,如果是字符char类型,使用该函数可以实现输入abc依旧可以得到输出,而不限于a b c

瑕疵:
1、无法同时实现任意类型的倒序
2、无法不同类型混合使用

#C语言##剑指offer#
全部评论
楼主厉害啊
点赞 回复 分享
发布于 2022-10-11 21:59 山西

相关推荐

07-18 18:44
已编辑
中山职业技术学院 Java
投递文远知行等公司9个岗位
点赞 评论 收藏
分享
07-02 10:39
门头沟学院 Java
Steven267:说点真实的,都要秋招了,还没有实习,早干嘛去了,本来学历就差,现在知道急了,而且你这个简历完全可以写成一页,劣势太大了,建议转测试
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-15 12:20
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务