当前位置:   article > 正文

两个链表的合并_双向链表合并

双向链表合并
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct student {
  4. int num; // 学号
  5. int score; // 成绩
  6. struct student* next;
  7. } Student;
  8. // 创建新结点
  9. Student* createNode(int num, int score) {
  10. Student* node = (Student*)malloc(sizeof(Student));
  11. node->num = num;
  12. node->score = score;
  13. node->next = NULL;
  14. return node;
  15. }
  16. // 合并并按学号升序排序两个链表
  17. Student* mergeLinkedList( Student* a, Student* b ) {
  18. Student *p = a, *q = b, *prev = NULL, *head = NULL;
  19. while( p != NULL && q != NULL ) {
  20. if( p->num <= q->num ) {
  21. if( prev == NULL ) head = p;
  22. else prev->next = p;
  23. prev = p;
  24. p = p->next;
  25. }
  26. else {
  27. if( prev == NULL ) head = q;
  28. else prev->next = q;
  29. prev = q;
  30. q = q->next;
  31. }
  32. }
  33. if( p == NULL ) prev->next = q;
  34. else prev->next = p;
  35. return head;
  36. }
  37. // 输出链表中的所有结点
  38. void printLinkedList(Student* L) {
  39. printf("num\t score\n");
  40. while (L != NULL) {
  41. printf("%d\t %d\n", L->num, L->score);
  42. L = L->next;
  43. }
  44. }
  45. int main() {
  46. Student *headA = NULL, *headB = NULL, *headC = NULL; // 三个单向链表
  47. // 分别读入两个链表 a 和 b
  48. int n, i, x, y;
  49. printf("Input the number of students in list a: ");
  50. scanf("%d", &n);
  51. for (i = 0; i < n; ++i) {
  52. printf("Input the num and score of the %dth student: ", i + 1);
  53. scanf("%d%d", &x, &y);
  54. Student* node = createNode(x, y);
  55. node->next = headA;
  56. headA = node;
  57. }
  58. printf("Input the number of students in list b: ");
  59. scanf("%d", &n);
  60. for (i = 0; i < n; ++i) {
  61. printf("Input the num and score of the %dth student: ", i + 1);
  62. scanf("%d%d", &x, &y);
  63. Student* node = createNode(x, y);
  64. node->next = headB;
  65. headB = node;
  66. }
  67. // 将两个链表合并
  68. headC = mergeLinkedList(headA, headB);
  69. // 输出新链表
  70. printf("The merged list:\n");
  71. printLinkedList(headC);
  72. return 0;
  73. }
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct student {
  4. int num; // 学号
  5. int score; // 成绩
  6. struct student* next;
  7. } Student;
  8. typedef struct {
  9. Student* head;
  10. } LinkedList;
  11. // 初始化单向链表
  12. void initLinkedList(LinkedList* L) {
  13. L->head = NULL;
  14. }
  15. // 创建新结点
  16. Student* createNode(int num, int score) {
  17. Student* node = (Student*)malloc(sizeof(Student));
  18. node->num = num;
  19. node->score = score;
  20. node->next = NULL;
  21. return node;
  22. }
  23. // 按学号升序插入结点
  24. void insertNode(LinkedList* L, Student* node) {
  25. if (L->head == NULL || node->num < L->head->num) {
  26. node->next = L->head;
  27. L->head = node;
  28. } else {
  29. Student* p = L->head;
  30. while (p->next != NULL && p->next->num <= node->num) {
  31. p = p->next;
  32. }
  33. node->next = p->next;
  34. p->next = node;
  35. }
  36. }
  37. // 输出链表中的所有结点
  38. void printLinkedList(LinkedList* L) {
  39. Student* p = L->head;
  40. printf("num\t score\n");
  41. while (p != NULL) {
  42. printf("%d\t %d\n", p->num, p->score);
  43. p = p->next;
  44. }
  45. }
  46. int main() {
  47. LinkedList a, b, c; // 三个单向链表
  48. initLinkedList(&a);
  49. initLinkedList(&b);
  50. initLinkedList(&c);
  51. // 分别读入两个链表 a 和 b
  52. int n, i, x, y;
  53. printf("Input the number of students in list a: ");
  54. scanf("%d", &n);
  55. for (i = 0; i < n; ++i) {
  56. printf("Input the num and score of the %dth student: ", i + 1);
  57. scanf("%d%d", &x, &y);
  58. Student* node = createNode(x, y);
  59. insertNode(&a, node);
  60. }
  61. printf("Input the number of students in list b: ");
  62. scanf("%d", &n);
  63. for (i = 0; i < n; ++i) {
  64. printf("Input the num and score of the %dth student: ", i + 1);
  65. scanf("%d%d", &x, &y);
  66. Student* node = createNode(x, y);
  67. insertNode(&b, node);
  68. }
  69. // 将两个链表合并
  70. Student *pa = a.head, *pb = b.head;
  71. while (pa != NULL && pb != NULL) {
  72. if (pa->num <= pb->num) {
  73. Student* node = createNode(pa->num, pa->score);
  74. insertNode(&c, node);
  75. pa = pa->next;
  76. } else {
  77. Student* node = createNode(pb->num, pb->score);
  78. insertNode(&c, node);
  79. pb = pb->next;
  80. }
  81. }
  82. while (pa != NULL) {
  83. Student* node = createNode(pa->num, pa->score);
  84. insertNode(&c, node);
  85. pa = pa->next;
  86. }
  87. while (pb != NULL) {
  88. Student* node = createNode(pb->num, pb->score);
  89. insertNode(&c, node);
  90. pb = pb->next;
  91. }
  92. // 输出新链表
  93. printf("The merged list:\n");
  94. printLinkedList(&c);
  95. return 0;
  96. }

这个使用了结构体,时间会超限

  1. #include <stdio.h>
  2. typedef struct {
  3. int num; // 学号
  4. int score; // 成绩
  5. } Student;
  6. // 归并排序算法
  7. void mergeSort(Student* a, int lo, int hi) {
  8. if (lo >= hi) return;
  9. int mid = (lo + hi) / 2;
  10. mergeSort(a, lo, mid);
  11. mergeSort(a, mid + 1, hi);
  12. int i = lo, j = mid + 1, k = 0;
  13. Student temp[hi - lo + 1];
  14. while (i <= mid && j <= hi) {
  15. if (a[i].num <= a[j].num) {
  16. temp[k++] = a[i++];
  17. } else {
  18. temp[k++] = a[j++];
  19. }
  20. }
  21. while (i <= mid) {
  22. temp[k++] = a[i++];
  23. }
  24. while (j <= hi) {
  25. temp[k++] = a[j++];
  26. }
  27. for (i = 0; i < k; ++i) {
  28. a[lo + i] = temp[i];
  29. }
  30. }
  31. int main() {
  32. int n, m, i, j, k;
  33. Student a[100], b[100], c[200];
  34. // 分别读入两个数组 a 和 b
  35. printf("Input the number of students in list a: ");
  36. scanf("%d", &n);
  37. for (i = 0; i < n; ++i) {
  38. printf("Input the num and score of the %dth student: ", i + 1);
  39. scanf("%d%d", &a[i].num, &a[i].score);
  40. }
  41. printf("Input the number of students in list b: ");
  42. scanf("%d", &m);
  43. for (i = 0; i < m; ++i) {
  44. printf("Input the num and score of the %dth student: ", i + 1);
  45. scanf("%d%d", &b[i].num, &b[i].score);
  46. }
  47. // 按照学号升序合并数组 a 和 b 到 c 中
  48. i = j = k = 0;
  49. while (i < n && j < m) {
  50. if (a[i].num <= b[j].num) {
  51. c[k++] = a[i++];
  52. } else {
  53. c[k++] = b[j++];
  54. }
  55. }
  56. while (i < n) {
  57. c[k++] = a[i++];
  58. }
  59. while (j < m) {
  60. c[k++] = b[j++];
  61. }
  62. // 对新数组 c 按照学号升序排序
  63. mergeSort(c, 0, k - 1);
  64. // 输出新数组
  65. printf("The merged and sorted list:\n");
  66. for (i = 0; i < k; ++i) {
  67. printf("%d %d\n", c[i].num, c[i].score);
  68. }
  69. return 0;
  70. }

改进算法

  1. #include <stdio.h>
  2. typedef struct {
  3. int num; // 学号
  4. int score; // 成绩
  5. } Student;
  6. // 归并排序算法
  7. void mergeSort(Student* a, int lo, int hi) {
  8. if (lo >= hi) return;
  9. int mid = (lo + hi) / 2;
  10. mergeSort(a, lo, mid);
  11. mergeSort(a, mid + 1, hi);
  12. int i = lo, j = mid + 1, k = 0;
  13. Student temp[hi - lo + 1];
  14. while (i <= mid && j <= hi) {
  15. if (a[i].num <= a[j].num) {
  16. temp[k++] = a[i++];
  17. } else {
  18. temp[k++] = a[j++];
  19. }
  20. }
  21. while (i <= mid) {
  22. temp[k++] = a[i++];
  23. }
  24. while (j <= hi) {
  25. temp[k++] = a[j++];
  26. }
  27. for (i = 0; i < k; ++i) {
  28. a[lo + i] = temp[i];
  29. }
  30. }
  31. int main() {
  32. int n, m, i, j, k;
  33. Student a[100], b[100], c[200];
  34. // 分别读入两个数组 a 和 b
  35. scanf("%d", &n);
  36. for (i = 0; i < n; ++i) {
  37. scanf("%d %d", &a[i].num, &a[i].score);
  38. }
  39. scanf("%d", &m);
  40. for (i = 0; i < m; ++i) {
  41. scanf("%d%d", &b[i].num, &b[i].score);
  42. }
  43. // 按照学号升序合并数组 a 和 b 到 c 中
  44. i = j = k = 0;
  45. while (i < n && j < m) {
  46. if (a[i].num <= b[j].num) {
  47. c[k++] = a[i++];
  48. } else {
  49. c[k++] = b[j++];
  50. }
  51. }
  52. while (i < n) {
  53. c[k++] = a[i++];
  54. }
  55. while (j < m) {
  56. c[k++] = b[j++];
  57. }
  58. // 对新数组 c 按照学号升序排序
  59. mergeSort(c, 0, k - 1);
  60. // 输出新数组
  61. for (i = 0; i < k; ++i) {
  62. printf("%d %d\n", c[i].num, c[i].score);
  63. }
  64. return 0;
  65. }

此代码产生了,数组越界问题

  1. #include <stdio.h>
  2. typedef struct {
  3. int num; // 学号
  4. int score; // 成绩
  5. } Student;
  6. // 归并排序算法
  7. void mergeSort(Student* a, int lo, int hi) {
  8. if (lo >= hi) return;
  9. int mid = (lo + hi) / 2;
  10. mergeSort(a, lo, mid);
  11. mergeSort(a, mid + 1, hi);
  12. int i = lo, j = mid + 1, k = 0;
  13. Student temp[hi - lo + 1];
  14. while (i <= mid && j <= hi) {
  15. if (a[i].num <= a[j].num) {
  16. temp[k++] = a[i++];
  17. } else {
  18. temp[k++] = a[j++];
  19. }
  20. }
  21. while (i <= mid) {
  22. temp[k++] = a[i++];
  23. }
  24. while (j <= hi) {
  25. temp[k++] = a[j++];
  26. }
  27. for (i = 0; i < k; ++i) {
  28. a[lo + i] = temp[i];
  29. }
  30. }
  31. int main() {
  32. int n, m, i, j, k;
  33. Student a[110], b[110], c[220]; // 扩大数组定义范围
  34. // 分别读入两个数组 a 和 b
  35. scanf("%d", &n);
  36. for (i = 0; i < n && i < 100; ++i) { // 判断输入的大小是否超出了数组定义范围
  37. scanf("%d %d", &a[i].num, &a[i].score);
  38. }
  39. scanf("%d", &m);
  40. for (i = 0; i < m && i < 100 ; ++i) { // 判断输入的大小是否超出了数组定义范围
  41. scanf("%d%d", &b[i].num, &b[i].score);
  42. }
  43. // 按照学号升序合并数组 a 和 b 到 c 中
  44. i = j = k = 0;
  45. while (i < n && j < m) {
  46. if (a[i].num <= b[j].num) {
  47. c[k++] = a[i++];
  48. } else {
  49. c[k++] = b[j++];
  50. }
  51. }
  52. while (i < n) {
  53. c[k++] = a[i++];
  54. }
  55. while (j < m) {
  56. c[k++] = b[j++];
  57. }
  58. // 对新数组 c 按照学号升序排序
  59. mergeSort(c, 0, k - 1);
  60. // 输出新数组
  61. for (i = 0; i < k && i < 200; ++i) { // 判断输出的大小是否超出了数组定义范围
  62. printf("%d %d\n", c[i].num, c[i].score);
  63. }
  64. return 0;
  65. }

修改后的代码

  1. #include <stdio.h>
  2. #include <stdlib.h> // 用到 malloc 和 free 函数
  3. typedef struct Linklist1052{
  4. int num;
  5. int score;
  6. struct Linklist1052 *next;
  7. }Node;
  8. Node* create(int n){
  9. Node *p1,*p2;
  10. Node *head = NULL;
  11. p1=p2=(Node *)malloc(sizeof(Node));
  12. for(int i=0;i<n;i++){
  13. scanf("%d %d",&p1->num,&p1->score);
  14. if(i==0){
  15. head=p1;
  16. }else{
  17. p2->next=p1;
  18. }
  19. p2=p1;
  20. p1=(Node *)malloc(sizeof(Node));
  21. }
  22. p2->next=NULL;
  23. return head;
  24. }
  25. void print1052(Node *head){
  26. Node *p = head;
  27. if(head!=NULL){
  28. while(p!=NULL){
  29. printf("%d %d\n",p->num,p->score);
  30. p=p->next;
  31. }
  32. }
  33. }
  34. // 对链表进行归并和排序操作
  35. Node *pai1052(Node *a, Node *b, int n, int m){
  36. Node *p,*q,*head,*min,*minq,*newp;
  37. head=NULL;
  38. p=a;
  39. while(p->next!=NULL){
  40. p=p->next;
  41. }
  42. p->next=b;
  43. q=min=q=p;
  44. for(int i=0; i<n+m; i++){
  45. p=a;
  46. q=minq=min=p;
  47. // 寻找num最小指针
  48. while(p!=NULL){
  49. if(min->num>p->num){
  50. min=p;
  51. minq=q;
  52. }
  53. q=p;
  54. p=p->next;
  55. }
  56. if(min==a){ // 首位最小的情况
  57. a=a->next;
  58. }
  59. // 解绑
  60. minq->next=min->next;
  61. if(i==0){
  62. head=min;
  63. }else{
  64. newp->next=min;
  65. }
  66. newp=min;
  67. }
  68. newp->next=NULL;
  69. return head;
  70. }
  71. int main(){
  72. Node *a,*b,*ab;
  73. int n,m;
  74. scanf("%d",&n);
  75. scanf("%d",&m);
  76. a=create(n);
  77. b=create(m);
  78. ab=pai1052(a,b,n,m);
  79. print1052(ab);
  80. // 释放内存,防止内存泄漏
  81. Node *temp = NULL;
  82. while (a != NULL)
  83. {
  84. temp = a;
  85. a = a->next;
  86. free(temp);
  87. }
  88. while (b != NULL)
  89. {
  90. temp = b;
  91. b = b->next;
  92. free(temp);
  93. }
  94. while (ab != NULL)
  95. {
  96. temp = ab;
  97. ab = ab->next;
  98. free(temp);
  99. }
  100. return 0;
  101. }

最后解决代码

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号