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
啊……链表操作都快忘光了,趁这个机会好好再复习一遍。
void Create(Stu *head, int n);//尾插法建表
void Connect(Stu *a, Stu *b);//连接两个链表
void Sort(Stu *head,int n);//链表元素排序
void Print(Stu *head);//打印链表
#include <stdio.h>
#include <stdlib.h>
struct stu
{
int no;
int score;
};
typedef struct node{
struct stu data;
struct node *next;
}Stu;
void Create(Stu *head, int n);//尾插法建表
void Connect(Stu *a, Stu *b);//连接两个链表
void Sort(Stu *head,int n);//链表元素排序
void Print(Stu *head);//打印链表
int main()
{
Stu *a, *b;
int N, M;
scanf("%d %d", &N, &M);
a = (Stu *)malloc(sizeof(Stu));
b = (Stu *)malloc(sizeof(Stu));
Create(a, N);
//Print(a);
Create(b, M);
// Print(b);
Connect(a, b);
//Print(a);
Sort(a, N+M);
Print(a);
return 0;
}
void Create(Stu *head, int n)
{
Stu *p, *r;
int no, score;
r = head;
while(n)
{
scanf("%d %d", &no, &score);
p = (Stu *)malloc(sizeof(Stu));
p->data.no = no;
p->data.score = score;
p->next = NULL;
r->next = p;
r = r->next;
n--;
}
r->next = NULL;
}
void Connect(Stu *a, Stu *b)
{
Stu *r;
r = a;
while(r->next)
r = r->next;
r->next = b->next; //此时 b 元素接到 a 后面
}
void Sort(Stu *head, int n)
{
Stu *p;
struct stu tmp;
int i, j, flag;
for(i=n-1; i>=1; i--)
{
p = head->next;
flag = 0;
for(j=0; j<i; j++, p = p->next) //每趟固定最大学号元素
{
if(p->data.no > p->next->data.no)
{
tmp = p->data;
p->data = p->next->data;
p->next->data = tmp;
flag = 1;
}
}
if(flag == 0)
break;
}
}
void Print(Stu *head)
{
Stu *p = head->next;
while(p)
{
printf("%d %d\n", p->data.no, p->data.score);
p = p->next;
}
}