数据结构 单链表应用:回溯法求幂集

举报
悦来客栈的老板 发表于 2020/12/29 01:13:49 2020/12/29
【摘要】 #include <stdio.h>#include <stdlib.h>#include <iostream.h> #define OK 1#define ERROR 0#define OVERFLOW -2 typedef int ElemType; typedef struct LNode{ ElemType data; struct...

  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream.h>
  4. #define OK 1
  5. #define ERROR 0
  6. #define OVERFLOW -2
  7. typedef int ElemType;
  8. typedef struct LNode
  9. {
  10. ElemType data;
  11. struct LNode *next;
  12. }LNode, *LinkList;
  13. void CreateList_L(LinkList &L, int n)
  14. {
  15. int i;
  16. LinkList p,q;
  17. L = (LinkList) malloc (sizeof(LNode));
  18. if (!L)
  19. {
  20. exit(OVERFLOW);
  21. }
  22. p = L;
  23. for (i=0; i<n; i++)
  24. {
  25. q = (LinkList) malloc (sizeof(LNode));
  26. if (!q)
  27. {
  28. exit(OVERFLOW);
  29. }
  30. q->data = i+1;
  31. p->next = q;
  32. p = q;
  33. }
  34. p->next = NULL;
  35. }
  36. void Display(LinkList L)
  37. {
  38. LinkList p = L->next;
  39. while (p != NULL)
  40. {
  41. printf("%d ",p->data);
  42. p = p->next;
  43. }
  44. printf("\n");
  45. }
  46. int Listlength(LinkList L)
  47. {
  48. LinkList p = L->next;
  49. int n = 0;
  50. while (p!=NULL)
  51. {
  52. n++;
  53. p = p->next;
  54. }
  55. return n;
  56. }
  57. int ListInsert_L(LinkList &L, int i, ElemType e)
  58. {
  59. LinkList s,p = L;
  60. int j = 0;
  61. while (p && j<i-1)
  62. {
  63. p = p->next;
  64. ++j;
  65. }
  66. if (!p || j>i-1)
  67. {
  68. return ERROR;
  69. }
  70. s = (LinkList) malloc (sizeof(LNode));
  71. s->data = e;
  72. s->next = p->next;
  73. p->next = s;
  74. return OK;
  75. }
  76. int ListDelete_L(LinkList &L, int i, ElemType &e)
  77. {
  78. LinkList p = L,q;
  79. int j = 0;
  80. while (p->next && j<i-1)
  81. {
  82. p = p->next;
  83. ++j;
  84. }
  85. if (!(p->next) || j>i-1)
  86. {
  87. return ERROR;
  88. }
  89. q = p->next;
  90. p->next = q->next ;
  91. e = q->data ;
  92. free(q);
  93. return OK;
  94. }
  95. int GetElem_L(LinkList L, int i, ElemType &e)
  96. {
  97. LinkList p = L->next;
  98. int j = 1;
  99. while (p && j<i)
  100. {
  101. p = p->next;
  102. j++;
  103. }
  104. if (!p || j>i)
  105. {
  106. return ERROR;
  107. }
  108. e = p->data;
  109. return OK;
  110. }
  111. void GetPowerset(int i, LinkList A,LinkList &B)
  112. {
  113. int x,k;
  114. if (i>Listlength(A))
  115. {
  116. Display(B);
  117. }
  118. else
  119. {
  120. GetElem_L(A,i,x);
  121. k = Listlength(B);
  122. ListInsert_L(B,k+1,x);
  123. GetPowerset(i+1,A,B);
  124. ListDelete_L(B,k+1,x);
  125. GetPowerset(i+1,A,B);
  126. }
  127. }
  128. int main()
  129. {
  130. int i = 1;
  131. LinkList A,B;
  132. B = (LinkList) malloc (sizeof(LNode));
  133. B->next = NULL;
  134. CreateList_L(A,8);
  135. GetPowerset(i,A,B);
  136. return 0;
  137. }

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/17268183

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。