原题链接:[编程入门]链表合并
解题思路:
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 ); //排序完成后,输出链表 }
别忘点赞哦-.-
0.0分
106 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复