《数据结构》2.4求两个递增链表的差集

前端之家收集整理的这篇文章主要介绍了《数据结构》2.4求两个递增链表的差集前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

2.4求连个递增来表的差集

题目描述:

已知A和B表是两个集合,其元素的值递增排列;设计一个算法,求A和B的差集,
(即出现在A中但是不在B中) 结果放在A中,同时返回元素的个数。


算法思想:

需要设置三个指针,pa,pb,pc;初始时,pa指向L1的第一个结点,pb指向第二个结点,pc指向L3求得头结点,L3=L1,即使用L1的头结点当做新链表L3的头结点。当pa和pb都非空时,比较两个指针所指向的元素的值:1.当pa->data<pb->data时,说明当前pa所指向的元素值在L1中,此时令pc=pa,pb不变,pa向后移动,pa=pa->next;2.当pa->data>pb->data时,说明pb所指向的元素在L2中,而不在L1中,则pa指针保持不变,pb后移,pb=pb->next;3.当pa->data==pb->data时,说明pa和pb所指向的是L1和L2的公共元素,则需要改变pc的指向,pa也啊哟后移,pc->next=pa->next,pa=pa->next。


  1. void DiffSet(LinkList &L1,LinkList &L2,LinkList &L3){
  2. struct LNode *pa,*pb,*pc;
  3. pa=L1->next;
  4. pb=L2->next;
  5. pc=L3=L1;
  6. while(pa&&pb){
  7. if(pa->data<pb->data){
  8. pc=pa;
  9. pa=pa->next;
  10. }else if(pa->data>pb->data){
  11. //pc=pa;
  12. pb=pb->next;
  13. }else if(pa->data==pb->data){
  14. // pc=pa;
  15. // pa=pa->next;
  16. // pb=pb->next;
  17. // pc=pa;
  18. pc->next=pa->next;
  19. pa=pa->next;
  20. }
  21. }
  22. }



具体实现:


  1. /*
  2. 已知A和B表是两个集合,其元素的值递增排列;设计一个算法,求A和B的差集,
  3. (即出现在A中但是不在B中) 结果放在A中,同时返回元素的个数。
  4. */
  5. #include<stdio.h>
  6. #define MAX 100
  7.  
  8. typedef struct LNode {
  9. int data;
  10. struct LNode *next;
  11. }LNode,*LinkList;
  12.  
  13. int InitList(LinkList &L){
  14. L=new LNode;
  15. L->next=NULL;
  16. return 1;
  17. }
  18.  
  19. int ListLength(LinkList &L){
  20. struct LNode *p;
  21. p=L->next;
  22. int length=0;
  23. while(p){
  24. ++length;
  25. p=p->next;
  26. }
  27. return length;
  28. }
  29.  
  30. void TraveList(LinkList L){
  31. struct LNode *p;
  32. p=L->next;
  33. while(p){
  34. printf("%d ",p->data);
  35. p=p->next;
  36. }
  37. printf("\n");
  38. }
  39.  
  40. void CreateList(LinkList &L,int n){
  41. L=new LNode;
  42. L->next=NULL;
  43. struct LNode *r;
  44. r=L;
  45. for(int i=0;i<n;i++){
  46. printf("请输入第%d个元素的值:",i+1);
  47. struct LNode *s;
  48. s=new LNode;
  49. scanf("%d",&s->data);
  50. s->next=NULL;
  51. r->next=s;
  52. r=s;
  53. }
  54. }
  55.  
  56. void DiffSet(LinkList &L1,*pc;
  57. pa=L1->next;
  58. pb=L2->next;
  59. pc=L3=L1;
  60. while(pa&&pb){
  61. if(pa->data<pb->data){
  62. pc=pa;
  63. pa=pa->next;
  64. }else if(pa->data>pb->data){
  65. //pc=pa;
  66. pb=pb->next;
  67. }else if(pa->data==pb->data){
  68. // pc=pa;
  69. // pa=pa->next;
  70. // pb=pb->next;
  71. // pc=pa;
  72. pc->next=pa->next;
  73. pa=pa->next;
  74. }
  75. }
  76. }
  77. int main(){
  78. LinkList L1,L2,L3;
  79. if(InitList(L1)){
  80. printf("L1初始化成功!\n");
  81. }else{
  82. printf("L1初始化失败!\n");
  83. }
  84. if(InitList(L2)){
  85. printf("L2初始化成功!\n");
  86. }else{
  87. printf("L2初始化失败!\n");
  88. }
  89. if(InitList(L3)){
  90. printf("L3初始化成功!\n");
  91. }else{
  92. printf("L3初始化失败!\n");
  93. }
  94. printf("请输入L1的长度:");
  95. int n1;
  96. scanf("%d",&n1);
  97. CreateList(L1,n1);
  98. TraveList(L1);
  99. printf("请输入L2的长度:");
  100. int n2;
  101. scanf("%d",&n2);
  102. CreateList(L2,n2);
  103. TraveList(L2);
  104. DiffSet(L1,L3);
  105. TraveList(L3);
  106. printf("差集的元素个数:%d",ListLength(L3));
  107. }

猜你在找的数据结构相关文章