原题链接:[编程入门]链表合并
解题思路:
拆分一下需求:分为,创建链表,合并链表,排序链表,打印链表,主函数输入以及调用一共5个功能,分模块进行完成。
参考代码:
#include<bits/stdc++.h> using namespace std; typedef struct LNode { int id; int score; struct LNode *next; } LNode,*PtrNode; //SWAP函数 void swap(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } //创建 PtrNode creat_list(int n) { PtrNode L,p,q; L=(LNode *)malloc(sizeof(LNode)); L->next=NULL; q=L; for(int i=0; i<n; i++) { p=(LNode *)malloc(sizeof(LNode)); cin>>p->id>>p->score; p->next=NULL; q->next=p; q=p; } return L; } //打印 void print_list(PtrNode L) { LNode *p; p=L->next; while(p) { cout<<p->id<<' '<<p->score<<endl; p=p->next; } } //合并 PtrNode merge_list(PtrNode s1,PtrNode s2) { if(s1==NULL||s2==NULL) return NULL; PtrNode temp=s1; while(temp->next!=NULL) { temp=temp->next; } PtrNode foll=s2; temp->next=foll->next; free(foll); return s1; } //=============插入排序==================// void insertSort(PtrNode mylist) { if((mylist -> next == NULL) || (mylist -> next -> next == NULL)) { return; } LNode * head, * p1, * prep1, * p2, * prep2, * temp; head = mylist; prep1 = head -> next; p1 = prep1 -> next; //prep1和p1是否需要手动后移 bool flag; while(p1 != NULL) { flag = true; temp = p1; //由于是单向链表,所以只能从头部开始检索 for(prep2 = head, p2 = prep2 -> next; p2 != p1; prep2 = prep2 -> next, p2 = p2 -> next) { if(p2 -> id > p1 -> id) { p1 = p1 -> next; prep1 -> next = p1; prep2 -> next = temp; temp -> next = p2; flag = false; break; } } //手动后移prep1和p1 if(flag) { prep1 = prep1 -> next; p1 = p1 -> next; } } } int main() { PtrNode L1,L2,L; int n,m; cin>>n>>m; L1=creat_list(n); L2=creat_list(m); L=merge_list(L1,L2); insertSort(L); print_list(L); return 0; }
0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复