1. 注意:申请的内存需要释放,否则会造成内存泄漏
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. typedef struct _node {
  5. int value_number;
  6. int value_score;
  7. struct _node* next;
  8. }Node;
  9. typedef struct _list {
  10. Node* head;
  11. }List;
  12. void add(List* pList, int number, int score);
  13. void attach(List* pLista, List* pListb);
  14. void insertionSort(List* pLista);
  15. void freeList(List* pList);
  16. int main()
  17. {
  18. List lista,listb;
  19. int N, M;
  20. int number, score;
  21. lista.head = NULL;
  22. listb.head = NULL;
  23. scanf("%d%d", &N, &M);
  24. for (int i = 0; i < N; i++) {
  25. scanf("%d%d", &number, &score);
  26. add(&lista, number, score);
  27. }
  28. for (int i = 0; i < M; i++) {
  29. scanf("%d%d", &number, &score);
  30. add(&listb, number, score);
  31. }
  32. attach(&lista, &listb);
  33. insertionSort(&lista);
  34. Node* q = lista.head;
  35. while (q) {
  36. printf("%d %d\n", q->value_number, q->value_score);
  37. q = q->next;
  38. }
  39. //释放已分配的内存
  40. freeList(&lista);
  41. freeList(&listb);
  42. return 0;
  43. }
  44. void add(List* pList, int number, int score)
  45. {
  46. Node* p = (Node*)malloc(sizeof(Node));
  47. p->value_number = number;
  48. p->value_score = score;
  49. Node* last = pList->head;
  50. if (last) {
  51. while (last->next) {
  52. last = last->next;
  53. }
  54. last->next = p;
  55. }
  56. else {
  57. pList->head = p;
  58. }
  59. }
  60. void attach(List* pLista, List* pListb)
  61. {
  62. if (pLista->head) {
  63. Node* p = pLista->head;
  64. while (p->next) {
  65. p = p->next;//将指针指向最后一个
  66. }
  67. p->next = pListb->head;
  68. }
  69. else {
  70. pLista->head = pLista->head;
  71. }
  72. pListb->head = NULL;
  73. }
  74. void insertionSort(List* pLista)
  75. {
  76. Node* sorted = NULL;// 初始化已排序链表为空
  77. Node* curr = pLista->head;// 初始化当前节点为原链表头节点
  78. while (curr) {// 遍历原链表的每个节点
  79. Node* nextNode = curr->next;// 保存当前节点的下一个节点
  80. // 如果已排序链表为空或当前节点小于已排序链表的头节点
  81. if (sorted == NULL || curr->value_number < sorted->value_number) {
  82. curr->next = sorted; // 将当前节点插入到已排序链表的头部
  83. sorted = curr;
  84. }
  85. else {
  86. // 找到已排序链表中第一个大于或等于当前节点的位置
  87. Node* temp = sorted;
  88. while (temp->next && temp->next->value_number < curr->value_number) {
  89. temp = temp->next;
  90. }
  91. curr->next = temp->next;// 将当前节点插入到合适的位置
  92. temp->next = curr;
  93. }
  94. curr = nextNode; // 更新当前节点为下一个节点
  95. }
  96. pLista->head = sorted;// 更新原链表的头节点为排序后的链表头节点
  97. }
  98. void freeList(List* pList) {
  99. Node* curr = pList->head;
  100. while (curr) {
  101. Node* temp = curr;
  102. curr = curr->next;
  103. free(temp);
  104. }
  105. pList->head = NULL;
  106. }
点赞(0)
 

10 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论