原题链接:[编程入门]链表合并
#include<stdio.h> #include <stdlib.h> typedef struct CStudent { int m_num; float m_score; struct CStudent* pNext; }STU; STU* CreatLink(int n); void CombineLink(STU* a,STU* b); STU* SortLink(STU* phead); void PrintfLink(STU* phead); void FreeLink(STU* phead); int main() { int N,M; STU* a; STU* b; scanf("%d",&N); scanf("%d",&M); a=CreatLink(N); b=CreatLink(M); CombineLink(a,b); PrintfLink(SortLink(a)); FreeLink(a); return 0; } STU* CreatLink(int n) { STU* phead,*pt,*p; int i; for(i=1;i<=n;i++) { p=(STU*)malloc(sizeof(STU)); scanf("%d",&p->m_num); scanf("%f",&p->m_score); if (i==1) { phead=p; pt=phead; } else { pt->pNext=p; pt=p; } } p->pNext=NULL; return phead; } void CombineLink(STU* a,STU* b) { STU* pend; pend=a; while(pend->pNext!=NULL) pend=pend->pNext; pend->pNext=b; } STU* SortLink(STU* phead) { //1.交换数据域---不用这种 //2.交换结点---选择排序--另创建一个链表 STU* new_phead=NULL,*pend; //新链表的头、尾结点 STU *pbefore,*pmin,*pcur;//保存前结点,最小值的结点,当前结点 while(phead!=NULL) { for(pcur=phead,pmin=phead;pcur->pNext!=NULL;pcur=pcur->pNext) //找出每轮的最小值 { if (pcur->pNext->m_num < pmin->m_num) { pbefore=pcur; pmin=pcur->pNext; } } if (new_phead==NULL) //如果新链表头还是空的 { new_phead=pmin; //头 pend=pmin;//尾,下面用后插法一个个加进来 } else //有了头 { pend->pNext=pmin; pend=pmin; //新的尾巴 } //把最小值从原链表中脱离 if(pmin==phead) //刚好是头 phead=phead->pNext; //原链表头结点前移 else pbefore->pNext=pmin->pNext; //断开 } if(new_phead!=NULL) pend->pNext=NULL; //尾结点指针域为空 phead=new_phead; return phead; } void PrintfLink(STU* phead) { STU* p=phead; //保护链表头; while(p!=NULL) { printf("%d %.0f\n",p->m_num,p->m_score); p=p->pNext; } } void FreeLink(STU* phead) { STU *p; while(phead!=NULL) { p=phead; phead=phead->pNext; free(p); } return; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复