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;
}
运行结果: