题目链接[编程入门]链表合并 - C语言网 (dotcpp.com)
#include <stdio.h>
#include <malloc.h>
typedef struct student {
double number;
double grade;
struct student * next;
}*node, Node; //结点
node creat( int); //创建链表函数
void output(node); //输出函数
void order( node, node); //排序函数
void swap (node,node);
int main(){
int n, m; //a ,b
node head1, head2; //指向头节点的指针
scanf( "%d%d", &n, &m );
head1 = creat( n ); //创建链表a
head2 = creat( m ); //创建链表b
order( head1, head2 ); //排序
return(0);
}
node creat( int n ){
node h; //头结点指针
h = (node) malloc( sizeof(Node) ); //创建头结点,h为指向头节点的指针
h->next = NULL; //头节点指向NULL代表空链表
node q = h; //q为尾指针,指向头节点,代表链表为空
node p;
for ( int i = 0; i < n; i++ ){ //创建n个结点
p = (node) malloc( sizeof(Node) ); //申请节点空间
scanf( "%lf%lf", &(*p).number, &(*p).grade ); //输入学号,成绩
//采用后差法插入节点
q->next=p; //前一个尾结点指向当前结点
p->next=NULL; //当前结点指向NULL
q = p; //尾指针指向当前结点
}
return h; //返回头结点
}
void output( node l ) //输出链表每个结点的信息
{
l = l->next;
node q; //用于释放结点
while ( l != NULL )
{
printf( "%.0f %0.f\n", l->number, l->grade );
q=l;
l = l->next;
free(q); //释放结点
}
}
//交换函数
void swap(node n, node m){
double t;
t=(*n).number;
(*n).number=(*m).number;
(*m).number=t;
t=(*n).grade;
(*n).grade=(*m).grade;
(*m).grade=t;
}
//冒泡排序
void order (node l1, node l2){
int x;
node temp0=l1,temp1,temp2;
while (temp0->next!=NULL){
temp0=temp0->next;
}
temp0->next=l2->next;
free(l2);
while (1){
x=1;
temp1=l1->next; temp2=temp1->next;
while (temp2 != NULL){
if (temp1->number > temp2->number){
swap(temp1,temp2);
x=0;
}
temp1=temp1->next;
temp2=temp2->next;
}
if (x) break;
}
output(l1);
}