#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
struct student
{
    int num;
    int score;
    struct student *link;
};
struct student *createlist(int n)//创建链表
{
    int i;
    struct student *dshead, *dslink, *dsnew;
    dshead = (struct student*)malloc(sizeof(struct student));
    dsnew = dslink = dshead;
    dshead->num = 0;
    dshead->score = 0;
    dshead->link = NULL;
    for (i = 0; i < n; i++)
    {
        dsnew = (struct student*)malloc(sizeof(struct student));
        dslink->link = dsnew;
        scanf("%d %d", &dsnew->num, &dsnew->score);
        dsnew->link = NULL;
        dslink = dsnew;
    }
    return dshead;
}
struct student *merge(struct student *dshead1, struct student *dshead2)//合并链条
{
    struct student *dslink = dshead1;
    while (dslink->link != NULL)
    {
        dslink = dslink->link;
    }
    dslink->link = dshead2->link;
    return dshead1;
}
void output(struct student *dshead2)//输出链条
{
    struct student *dsnow;
    dsnow = dshead2->link;
    do
    {
        printf("%d %d\n", dsnow->num, dsnow->score);
        dsnow = dsnow->link;
    } while (dsnow != NULL);
}
int main()
{
    int n, m;
    scanf("%d %d",&n,&m);
    struct student *dshead1 = createlist(n);
    struct student *dshead2 = createlist(m);
    struct student *p0,*p1;//p1记录当前位置,p0前一位置
    dshead1 = merge(dshead1, dshead2);//合并后的链条头
    p0 = dshead1;
    p1 = dshead1->link;
    int min,k = 0;
    struct student *dslink,*dsnew;
    for (int i = 1; i <= m + n; i++)//每次选出最小的序号
    {
        p1 = dshead1->link;
        min = p1->num;
        while (p1 != NULL)//找出剩下的最小值
        {
            if (p1->num < min)
            {
                min = p1->num;
            }
            p1 = p1->link;
        }
        k++;//用来区分是否是第一次,只有第一次需要对链头连接第二链
        p0 = dshead1;
        p1 = dshead1->link;
        while (p1->num != min)//找到最小值对应的位置,拼接在新的链条后面
        {
            p0 = p1;
            p1 = p1->link;
        }
        p0->link = p1->link;
        if (k == 1)
        {
            dshead2->link = p1;
            dslink = p1;
            dslink->link = NULL;
        }
        else
        {
            dslink->link = p1;
            dslink = dslink->link;
            dslink->link = NULL;
        }
    }
    output(dshead2);
    system("pause");
    return 0;
}

点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

laolin2333 7年前 回复TA
dsnew = dslink = dshead;然后return dshead;真的没问题吗?