原题链接:[编程入门]链表合并
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复