acm编程训练 单向链表 C语言程序设计教程(第三版)课后习题11.8

acm编程训练 单向链表 C语言程序设计教程(第三版)课后习题11.8
Description
已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。
Input
第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成
Output
按照学号升序排列的数据
Sample Input
2 3
5 100
6 89
3 82
4 95
2 10
Sample Output
2 10
3 82
4 95
5 100
6 89
测试代码一号:

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int cj;
    int xh;
    struct node *next;
}ND;
ND *fun_order(ND *head_a,int n);
int main()
{
    int  a, b,i;
    ND *head_a = NULL, *head_b = NULL, *tail_a, *tail_b, *p_a, *p_b;
    scanf("%d%d", &a, &b);
    /* creat the first dot of struct a*/
    p_a = (ND *)malloc(sizeof(ND));
    scanf("%d%d", &p_a->xh, &p_a->cj);
    p_a->next = head_a;
    head_a = p_a;
    tail_a = p_a;
    /*scanf the lift data of a*/
    for (i = 1; i < a; i++)
    {
        p_a = (ND *)malloc(sizeof(ND));
        scanf("%d%d", &p_a->xh, &p_a->cj);
        p_a->next = NULL;
        tail_a->next = p_a;
        tail_a = p_a;
    }
    /* creat the first dot of struct b*/
    p_b = (ND *)malloc(sizeof(ND));
    scanf("%d%d", &p_b->xh, &p_b->cj);
    p_b->next = head_b;
    head_b = p_b;
    tail_b = p_b;
    /*scanf the lift data of b*/
    for (i = 1; i < b; i++)
    {
        p_b = (ND *)malloc(sizeof(ND));
        scanf("%d%d", &p_b->xh, &p_b->cj);
        p_b->next = NULL;
        tail_b->next = p_b;
        tail_b = p_b;
    }
    /*conect the two struct a and b*/
    tail_a->next = head_b;
    /*order the line of bar int the an increase order by xh*/
    head_a=fun_order(head_a, a + b);
    for (p_a = head_a,i=0;i<a+b;i++,p_a=p_a->next)
        printf("%d %d\n", p_a->xh, p_a->cj);
    return 0;
}
ND *fun_order(ND *head_a,int n)
{
    ND  *p=head_a,*t,*last;
    int i, j;
    for (i = 0 ; i < n; i++)
    {
        p = head_a;
        if (p == head_a)
        {
            if (p->xh > p->next->xh)
            {
                head_a = p->next;
                t = p->next->next;
                p->next->next = p;
                p->next = t;
            }
            else p = p->next;
        }
        for (last=head_a;  p->next->next!=NULL;last=last->next)
        {
            if (p->xh > p->next->xh)
            {
                last->next = p->next;
                t = p->next->next;
                p->next->next = p;
                p -> next = t;
            }
            else p = p->next;
        }
        if (p->xh > p->next->xh)
        {
            last->next = p->next;
            p->next->next = p;
            p->next = NULL;
        }
    }
    return head_a;
}

运行结果:
这里写图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值