【练习】归并和冒泡两种方法c++将两个无序链表合并为一个升序的有序链表

曾经终败给现在 2022-11-19 01:24 103阅读 0赞

定义:

  1. struct node {
  2. int data;
  3. node* next;
  4. };

新建有头指针的链表:

  1. struct node *head;
  2. head = NULL;//头指针初始为空
  3. struct node *p;
  4. //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
  5. p=(struct node *)malloc(sizeof(struct node));
  6. scanf("%d",&a);
  7. p->data=a;//将数据存储到当前结点的data域中
  8. p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空

完整版本:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //这里创建一个结构体用来表示链表的结点类型
  4. struct node
  5. {
  6. int data;
  7. struct node *next;
  8. };
  9. int main()
  10. {
  11. struct node *head,*p,*q,*t;
  12. int i,n,a;
  13. scanf("%d",&n);
  14. head = NULL;//头指针初始为空
  15. for(i=1;i<=n;i++)//循环读入n个数
  16. {
  17. scanf("%d",&a);
  18. //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
  19. p=(struct node *)malloc(sizeof(struct node));
  20. p->data=a;//将数据存储到当前结点的data域中
  21. p->next=NULL;//设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
  22. if(head==NULL)
  23. head=p;//如果这是第一个创建的结点,则将头指针指向这个结点
  24. else
  25. q->next=p;//如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
  26. q=p;//指针q也指向当前结点
  27. }
  28. //输出链表中的所有数
  29. t=head;
  30. while(t!=NULL)
  31. {
  32. printf("%d ",t->data);
  33. t=t->next;//继续下一个结点
  34. }
  35. getchar();getchar();
  36. return 0;
  37. }

合并采用先分别升序后再进行合并两个有序链表,分别升序采用双指针和递归调用。先看用归并排序:

用归并排序:

  1. node* merge(node* p,node*p2) { //这里是合并的排序
  2. node* src = new node;
  3. src->next = nullptr;
  4. //src->data = 0;
  5. node* now = src;
  6. node* a1 = p;
  7. node* a2 = p2;
  8. while (a1 != NULL && a2 != NULL) {
  9. if (a1->data >= a2->data) {
  10. node* tem = a2->next;
  11. src->next = a2;
  12. a2 = tem;
  13. }
  14. else {
  15. node* tem = a1->next;
  16. src->next = a1;
  17. a1 = tem;
  18. }
  19. src = src->next;//合并两个有序链表 src->next=nullptr
  20. }
  21. if (a1 != NULL) src->next = a1;
  22. if (a2 != NULL)src->next = a2;
  23. return now->next;
  24. }
  25. node* merge_sort(node* p) { //这是将一个链表进行升序
  26. if (p == nullptr || p->next == nullptr) return p;
  27. node* fast = p;
  28. node* slow = new node;
  29. slow->data = 0;
  30. slow->next = p;
  31. while (fast != NULL && fast->next != NULL) {
  32. fast = fast->next->next;
  33. slow = slow->next;
  34. }
  35. node* rhead = slow->next;
  36. slow->next = NULL;
  37. node* lh = merge_sort(p);
  38. node* rh = merge_sort(rhead);
  39. node* after = merge(lh, rhead);
  40. return after;
  41. }
  42. int main()
  43. {
  44. srand(0);
  45. node* m = new node;
  46. m->data = rand()%5;
  47. //cout << m->data;
  48. node* n = new node;
  49. n->data = rand()%7;
  50. m->next = n;
  51. node* nn = new node;
  52. nn->data = rand()%8;
  53. n->next = nn;
  54. nn->next = nullptr;
  55. node* copy_m = m;
  56. cout << "第一个链表:";
  57. while (copy_m) {
  58. cout << copy_m->data;
  59. copy_m = copy_m->next;
  60. }
  61. cout << endl;
  62. node* m2 = new node;
  63. m2->data =rand()%18;
  64. node* n2 = new node;
  65. n2->data = rand() % 13;
  66. m2->next = n2;
  67. node* nn2 = new node;
  68. nn2->data = rand()%15;
  69. n2->next = nn2;
  70. nn2->next = nullptr;
  71. node* copy_n = m2;
  72. cout << "第二个链表:";
  73. while (copy_n) {
  74. cout << copy_n->data;
  75. copy_n = copy_n->next;
  76. }
  77. cout << endl;
  78. node*one = merge_sort(m);
  79. node*two= merge_sort(m2);
  80. node* new_m = merge(one,two);
  81. node* nice = new_m;
  82. cout << endl;
  83. cout << "合并两个有序链表后的结果:";
  84. while (nice) {
  85. cout << nice->data << "->";
  86. nice = nice->next;
  87. }
  88. }

结果:
在这里插入图片描述

用冒泡排序:

  1. node* merge_sort(node* p) { //这是将一个链表进行升序
  2. if (p == nullptr || p->next == nullptr) return p;
  3. node* mana = p;
  4. node* pp = mana;
  5. for (int i = 0; i < len(p) - 1; i++) {
  6. mana = p;
  7. for (int j = 0; j < len(p) - i - 1; j++) {
  8. node* t1 = mana;
  9. node* t2 = mana->next;
  10. if (t1->data > t2->data) {
  11. int tem = t1->data;
  12. t1->data = t2->data;
  13. t2->data = tem;
  14. }
  15. mana = mana->next;
  16. }
  17. }
  18. return pp;
  19. }
  20. int main()
  21. {
  22. srand(0);
  23. node* m = new node;
  24. m->data = rand()%12;
  25. //cout << m->data;
  26. node* n = new node;
  27. n->data = rand()%17;
  28. m->next = n;
  29. node* nn = new node;
  30. nn->data = rand()%18;
  31. n->next = nn;
  32. node* nnn = new node;
  33. nnn->data = rand() % 23;
  34. nnn->next = NULL;
  35. nn->next = nnn;
  36. node* copy_m = m;
  37. cout << "第一个链表:";
  38. while (copy_m) {
  39. cout << copy_m->data<<"-";
  40. copy_m = copy_m->next;
  41. }
  42. cout << endl;
  43. node* m2 = new node;
  44. m2->data =rand()%18;
  45. node* n2 = new node;
  46. n2->data = rand() % 13;
  47. m2->next = n2;
  48. node* nn2 = new node;
  49. nn2->data = rand()%15;
  50. n2->next = nn2;
  51. nn2->next = nullptr;
  52. node* copy_n = m2;
  53. cout << "第二个链表:";
  54. while (copy_n) {
  55. cout << copy_n->data << "-";
  56. copy_n = copy_n->next;
  57. }
  58. cout << endl;
  59. node*one = merge_sort(m);
  60. node*two= merge_sort(m2);
  61. node* new_m = merge(one,two);
  62. node* nice = new_m;
  63. cout << endl;
  64. cout << "合并两个有序链表后的结果:";
  65. while (nice) {
  66. cout << nice->data << "->";
  67. nice = nice->next;
  68. }
  69. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读