实验要求

求两个集合LA和LB(用单链表表示)的并和交集
要求:在实验二的基础上,使用单链表表示集合。编写两个算法(求交算法和求并算法),并输出最终的结果。
测试用例:集合A为{3,4,1,6},集合A为{2,3,6,7},
交集为{3,6}
并集为{1,2,3,4,6,7}
交作业时间:4月16日

实验代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. /**
  4. * 求两个集合LA和LB(用单链表表示)的并和交集
  5. */
  6. /* 单链表的存储结构 */
  7. typedef struct LNode {
  8. int data; //数据域
  9. struct LNode *next; //指针域
  10. }Lnode, *LinkList; //LinkList为指向结构体LNode的指针类型
  11. /* 初始化链表 */
  12. void InitList(LinkList &L) {
  13. L = new LNode;
  14. L->next = NULL;
  15. }
  16. /* 创建:后插 */
  17. void CreateList_R(LinkList &L, int n) {
  18. cout << "请输入" << n << "个数字"<< "\n";
  19. InitList(L);
  20. // 定义一个在下面循环用来一直操作所加元素的结点p来指向头结点L
  21. LinkList p = L;
  22. for (int i = 0; i < n;i++) {
  23. LinkList q = new Lnode;
  24. q->next = NULL;
  25. cin >> q->data;
  26. p->next = q;
  27. p = q; //为了下一次
  28. }
  29. }
  30. /* 打印 */
  31. void TraverseList(LinkList & L){
  32. LinkList p = new LNode;
  33. p = L->next;
  34. cout << "此链表打印的结果为:"<< "\n";
  35. while (p != NULL)
  36. {
  37. cout << p->data << " ";
  38. p = p->next;
  39. }
  40. cout << "\n";
  41. }
  42. /* 排序单链表 */
  43. void sort(LinkList &L) {
  44. }
  45. /* jiao算法 */
  46. void jiao(LinkList &A,LinkList &B) {
  47. // 用双循环得出共有的元素并输出
  48. LinkList p;
  49. InitList(p);
  50. A = A->next;
  51. B = B->next;
  52. while (A != NULL ) {
  53. LinkList copy_b = B;
  54. while(copy_b != NULL) {
  55. if (A->data == copy_b->data) {
  56. LinkList temp = new Lnode;
  57. temp->data = copy_b->data;
  58. temp->next = p->next;
  59. p->next = temp;
  60. break;
  61. } else {
  62. copy_b = copy_b->next;
  63. }
  64. }
  65. A = A->next;
  66. }
  67. while(p->next != NULL) {
  68. cout << p->next->data << " ";
  69. p = p->next;
  70. }
  71. }
  72. /* bing算法 */
  73. void bing(LinkList &A,LinkList &B) {
  74. LinkList p = A;
  75. LinkList s = B;
  76. A = A->next;
  77. B = B->next;
  78. while (A != NULL ) {
  79. LinkList copy_b = B;
  80. while(copy_b != NULL) {
  81. if (A->data == copy_b->data) {
  82. // cout << A->data << "\n";
  83. // 在p链里面删除A->data值
  84. LinkList q = p;
  85. while(q->next != NULL) {
  86. if (q->next->data == A->data) {
  87. q->next = q->next->next;
  88. break;
  89. } else {
  90. q = q->next;
  91. }
  92. }
  93. break;
  94. } else {
  95. copy_b = copy_b->next;
  96. }
  97. }
  98. A = A->next;
  99. }
  100. // 将p链表连接到s链表上
  101. LinkList result = p;
  102. while (p != NULL) {
  103. if (p->next == NULL) {
  104. p->next = s->next;
  105. break;
  106. }
  107. p = p->next;
  108. }
  109. while(result->next != NULL) {
  110. cout << result->next->data << " ";
  111. result = result->next;
  112. }
  113. }
  114. int main() {
  115. LinkList list_A;
  116. LinkList list_B;
  117. InitList(list_A);
  118. InitList(list_B);
  119. CreateList_R(list_A, 6);
  120. CreateList_R(list_B, 6);
  121. LinkList list_C = list_A;
  122. LinkList list_D = list_B;
  123. cout <<"A、B交集的值为:";
  124. jiao(list_A, list_B);
  125. cout <<"\n"<<"A、B并集的值为:";
  126. bing(list_C, list_D);
  127. }