原题链接:[编程入门]链表合并
我还是个新手,链表尤其头疼,自己写出这个题解而且一遍过我真的太开心了
注意事项:
理清思路,一步一步来
参考代码:
#include<stdio.h> #include <malloc.h> typedef struct Node{ int num; int score; struct Node *next; }LNode,*Llist; Llist Initlist(int n); //初始化链表 Llist Copylist(LNode * heada,LNode * headb,int n,int m); //将两个链表合并(将b的头节点复制到a的尾节点后面) Llist Sortlist(LNode * heada,int n); //冒泡排序,实现学号的从小到大排列 void Output(LNode * heada,int n); //输出 int main(){ int n,m; scanf("%d %d",&n,&m); LNode * heada = (LNode *)malloc(sizeof(LNode)); //链表a的头节点 LNode * headb = (LNode *)malloc(sizeof(LNode)); //链表b的头节点 heada = Initlist(n); headb = Initlist(m); Copylist(heada,headb,n,m); Sortlist(heada,n+m); Output(heada,n+m); return 0; } Llist Initlist(int n){ LNode * p = (Llist)malloc(sizeof(LNode)); p->next = NULL; LNode * head = p; for(int i = 0;i<n;i++){ LNode * tmp = (LNode *)malloc(sizeof(LNode)); tmp->next = NULL; scanf("%d %d",&tmp->num,&tmp->score); p->next = tmp; p = tmp; } return head; } Llist Copylist(LNode * heada,LNode * headb,int n,int m){ LNode * p = heada; int i = 0; while(i<n){ //不断把tmp指针后移到链表a的尾节点,然后将a的尾节点tmp指向b的头节点的next节点 i++; p = p->next; } p->next = headb->next; return heada; } Llist Sortlist(LNode * heada,int n){ //冒泡排序 LNode * tmp = (LNode *)malloc(sizeof(LNode)); for(int i = 0;i<n-1;i++){ LNode * p = heada->next; for(int j = 0;j <n-i-1;j++){ if(p->num>p->next->num){ //p和p的下一个节点的学号进行比较,如果p的学号大,交换数据 tmp->num = p->next->num; tmp->score = p->next->score; p->next->num = p->num; p->next->score = p->score; p->num = tmp->num; p->score = tmp->score; } p = p->next; //p节点后移 } } free(tmp); return heada; } void Output(LNode * heada,int n){ LNode * tmp = (LNode *)malloc(sizeof(LNode)); for(int i = 0;i <n;i++){ tmp = heada->next; //tmp和head同步后移 printf("%d %d\n",tmp->num,tmp->score); heada = tmp; } free(tmp); }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复