原题链接:[编程入门]链表合并
我还是个新手,链表尤其头疼,自己写出这个题解而且一遍过我真的太开心了
注意事项:
理清思路,一步一步来
参考代码:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复