解题思路:
1.先设计个结点,包括学号,成绩,后继指针;
2.输入a,b,程序中为n,m;

3.分别创建长度为n的链表,和长度为m的链表;

4.把两个链表连为一个,用选择排序法排序;

5.输出,边输出,边释放结点
讲的不好,代码时间有点长了,说实话,我都看了好长时间,佩服当初的自己

参考代码:

#include <stdio.h>
#include <malloc.h>

typedef struct student {
    double    number;
    double    gread;

    struct student * next;
}*node, Node;                   //结点

node creat( int n );         //创建链表函数

void output( node l );        //输出函数

void order( node l1, node l2 );   //排序函数


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->next = NULL;                         //next指针域赋空
    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).gread );  //输入学号,成绩

        p->next = q->next;           //采用后差法插入节点
        q->next = p;
        q    = p;
    }

    return(h);   //返回头结点
}
/*-------------------------------------------------------------*/

void output( node l )      //输出链表每个结点的信息
{
    l = l->next;
    node q; //用于释放结点
    while ( l != NULL )
    {
        printf( "%.0f %0.f\n", l->number, l->gread );
        q=l;
        l = l->next;
        free(q);  //释放结点
    }
}

/*-------------------------------------------------------------*/
void order( node l1, node l2 )   //排序
{
    node q;           //定义指针q
    q    = l1;           //q指向表a的头结点
    l2    = l2->next;        //表b的头结点下移

    while ( q->next != NULL )    //让q指向表a的最后一个结点
    {
        q = q->next;
    }
    q->next = l2;          //表a的最后一个结点的next指向表b的(首结点)完成连接

    q = l1->next;     //再次把q指向表a的头结点

    node min;       //定义指向最小学号结点的指针

 
    int    t;      //保存最小学号的变量
    int    n, g;   //交换学号,成绩的中间变量
    node    p;     //定义指针p,用于中间遍历求最小学号

    while ( q != NULL )  //开始遍历,选择排序最外层
    {
        p = q;         //p等于查找的第一个结点q

        t    = p->number;     //让t等于开始查找的第一个结点的学号
        min    = p;           //最小学号结点指正指向p
        while ( p != NULL )   //从结点p向后遍历
        {
            if ( p->number < t )
            {
                t    = p->number;    //记录最小学号
                min    = p;          //记录最小学号结点
            } 

            p = p->next;    //遍历p的下一个结点
        }

        n        = q->number;        //n等于第一个结点的学号
        q->number    = min->number;  //最小学号结点的学号与第一个结点的学号交换
        min->number    = n;

        g        = q->gread;        //同理把成绩也交换了
        q->gread    = min->gread;    /*整个排序思路就是选择排序*/
        min->gread    = g;

        q = q->next;   //第一遍排序完后q后移,也就是选择排序开始排第二遍时的第一个数      
    }

    output( l1 );    //排序完成后,输出链表
}

别忘点赞哦-.-

点赞(52)
 

0.0分

106 人评分

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

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

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

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

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

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

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

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

评论列表 共有 34 条评论

s99q 3年前 回复TA
@葡萄 返回寻址地址
Ibelieveit! 4年前 回复TA
@葡萄 返回一个头节点的地址
chenleo 4年前 回复TA
@手残 看注释
chenleo 4年前 回复TA
@葡萄 创建链表啊
葡萄 4年前 回复TA
node creat( int n )
函数返回值为什么是node类型啊,大佬们解释下!
手残 5年前 回复TA
if ( p->number < t )没看懂这句
     t=p->number  自己跟自己比较大小?
pingfan443 5年前 回复TA
int Sort_LinkList(LinkList *head)//排序 
 {
 	LinkList *min,*p,*q;
 	int i,j,t;
 	q=head->next;
 	while(q!=NULL)
 	{
 		p=q;
 		t=p->num;
 		min=p;
 		while(p!=NULL)
 		{
 			if(p->num<t)
 			{
 				t=p->num;
 				min=p;
			 }
			 p=p->next;
		 }
		i=q->num;
		q->num=min->num;
		min->num=i;
		j=q->scorre;
		q->scorre=min->scorre;
		min->scorre=j;
		 q=q->next;
	 }
	 
 }//自己卡在了这里  大神的思路真腻害
pingfan443 5年前 回复TA
@pingfan443 # include<stdio.h> # include<stdlib.h> # define LEN sizeof(struct student) typedef int elemtype; typedef struct student { 	int  num; 	int scorre; 	struct student *next; }LinkList; LinkList *Creat_LinkList(int x) { 	 	int i; 	LinkList *head,*tail,*p; 	head=(LinkList *)malloc(LEN); 	if(head==NULL) 	return head; 	head->next=NULL; 	tail=head; 	p=(LinkList *)malloc(LEN); 		scanf("%d%d",&p->num,&p->scorre); 	for(i=0;i<x;i++) 	{ 		tail->next=p; 		tail=p; 		if(i<x-1) 		{ 				p=(LinkList *)malloc(LEN); 		scanf("%d%d",&p->num,&p->scorre); 		} 	} 	tail->next=NULL; 	return head; 		 }  LinkList *Merrge_LinkList(LinkList *a,LinkList *b)  {  	LinkList *head;  	head=a;  	while(a->next!=NULL)  	a=a->next;  	a->next=b->next;//一直没整明白  是自己写的头节点  没有连接到首节点   	return head;  }  int Sort_LinkList(LinkList *head)//排序   {  	LinkList *min,*p,*q;  	int i,j,t;  	q=head->next;  	while(q!=NULL)  	{  		p=q;  		t=p->num;  		min=p;  		while(p!=NULL)  		{  			if(p->num<t)  			{  				t=p->num;  				min=p; 			 } 			 p=p->next; 		 } 		i=q->num; 		q->num=min->num; 		min->num=i; 		j=q->scorre; 		q->scorre=min->scorre; 		min->scorre=j; 		 q=q->next; 	 } 	   }  int main()  {  	int N,M;  	  	scanf("%d%d",&N,&M);  	LinkList *A,*B,*C;  	A=Creat_LinkList(N);  	B=Creat_LinkList(M);  	C=Merrge_LinkList(A,B);  	Sort_LinkList(C);  	print_LinkList(C);  //	print_LinkList(B);  	return 0;  }  int print_LinkList(LinkList *p)  {  	p=p->next;  	while(p!=NULL)  	{  		printf("%d %d\n",p->num,p->scorre);  		p=p->next; 	 } 	   }
pingfan443 5年前 回复TA
自己写的链表合并最后不知道怎么排序 借鉴了大神的思路  腻害腻害
小雨 5年前 回复TA
creat尾插那里p->next直接等于NULL也是可以的吧,毕竟q总指向最后结点,你那样写让人误以为是头插法