fork download
  1. #include <iostream>
  2.  
  3.  
  4. using namespace std;
  5. // enum bool {false,true};
  6. struct element { //定义链表中的结点结构
  7. int val;
  8. element *next;
  9. };
  10. class list { //定义链表类
  11. protected:element *elems;
  12. public:
  13. list() { elems = 0; }
  14. ~list();
  15. virtual bool insert(int); //此虚函数在派生类中可重新定义
  16. virtual bool deletes(int); //此虚函数在派生类中可重新定义
  17. bool contain(int);
  18. void print();
  19. };
  20. class set :public list { //将集合类 set 定义为链表类 list 的派生类
  21. int Card;
  22. public:
  23. set() { Card = 0; }
  24. bool insert(int); //重定义此函数
  25. bool deletes(int); //重定义此函数
  26. bool add(set*, set*);
  27. bool and1(set*, set*);
  28. bool minute(set*, set*);
  29. friend set operator +(set&, set&);
  30. friend set operator -(set&, set&);
  31. friend set operator *(set&, set&);
  32. };
  33. list::~list() //list 类得析构函数定义,循环释放各元素所占的存储
  34. {
  35. element *tmp = elems;
  36. for (element *elem = elems; elem != 0;)
  37. {
  38. tmp = elem;
  39. elem = elem->next;
  40. delete tmp;
  41. }
  42. }
  43. bool list::insert(int val) //定义 list 类中插入元素的成员函数
  44. {
  45. element *elem = new element; //为新元素分配存储
  46. if (elem != 0) {
  47. elem->val = val; //将新元素插入到链表头
  48. elem->next = elems;
  49. elems = elem;
  50. return true;
  51. }
  52. else return false;
  53. }
  54. bool list::deletes(int val) //定义 list 类中删除元素的成员函数
  55. {
  56. if (elems == 0) return false; //若表为空,返回 false
  57. element *tmp = elems;
  58. if (elems->val == val)
  59. { //若待删除的元素为表头元素
  60. elems = elems->next;
  61. delete tmp;
  62. return true;
  63. }
  64. else
  65. for (element *elem = elems; elem->next != 0; elem = elem->next)
  66. if (elem->next->val == val)
  67. { //循环查找待删除元素
  68. tmp = elem->next;
  69. elem->next = tmp->next;
  70. delete tmp;
  71. return true;
  72. }
  73. return false;
  74. }
  75. bool list::contain(int val)
  76. { //判元素 val 在链表中是否存在,存在返回true,不存在返回false
  77. if (elems == 0)return false;
  78. if (elems->val == val) return true;
  79. else
  80. for (element *elem = elems; elem->next != 0; elem = elem->next)
  81. if (elem->next->val == val)
  82. return true;
  83. return false;
  84. }
  85. void list::print() //输出链表中各元素
  86. {
  87. if (elems == 0) return;
  88. for (element *elem = elems; elem != 0; elem = elem->next)
  89. cout << elem->val << " ";
  90. cout << endl;
  91. }
  92. bool set::insert(int val) //在 set 类中的 insert 的重定义版本
  93. {
  94. if (!contain(val))
  95. { //先判断此元素是否存在,然后再调用基类的此函数版本
  96. ++Card;
  97. list::insert(val);
  98. return true;
  99. }
  100. return false;
  101. }
  102. bool set::deletes(int val) //在 set 类中的 deletes 的重定义版本
  103. {
  104. if (list::deletes(val)) //调用基类中的此函数版本
  105. {
  106. return true;
  107. }
  108. return false;
  109. }
  110. bool set::add(set* s1,set* s2)
  111. {
  112. for (element* elem=s1->elems;elem!=NULL;elem=elem->next)
  113. {
  114. insert(elem->val);
  115. }
  116. for (element* elem = s2->elems; elem != NULL; elem = elem->next)
  117. {
  118. insert(elem->val);
  119. }
  120. return true;
  121. }
  122. bool set:: and1(set* s1,set* s2)
  123. {
  124. for (element* elem=s1->elems;elem!=NULL;elem=elem->next)
  125. {
  126. if (s2->contain(elem->val))
  127. {
  128. insert(elem->val);
  129. }
  130. }
  131. return true;
  132. }
  133. bool set::minute(set* s1,set* s2)
  134. {
  135. for (element* elem = s1->elems; elem!= NULL; elem = elem->next)
  136. {
  137. if (!s2->contain(elem->val))
  138. {
  139. insert(elem->val);
  140. }
  141. }
  142. return true;
  143. }
  144.  
  145. set operator +(set& s1, set& s2)
  146. {
  147. set s;
  148.  
  149. for (element* elem = s1.elems; elem != NULL; elem = elem->next)
  150. {
  151. s.insert(elem->val);
  152. }
  153. for (element* elem = s2.elems; elem != NULL; elem = elem->next)
  154. {
  155. s.insert(elem->val);
  156. }
  157. return s;
  158. }
  159.  
  160. set operator -(set& s1, set& s2)
  161. {
  162. set s;
  163. set* set1 = &s1;
  164. set* set2 = &s2;
  165. for (element* elem = set1->elems; elem != NULL; elem = elem->next)
  166. {
  167. if (!set2->contain(elem->val))
  168. {
  169. s.insert(elem->val);
  170. }
  171. }
  172. return s;
  173. }
  174. set operator *(set& s1, set& s2)
  175. {
  176. set s;
  177. for (element* elem = s1.elems; elem != NULL; elem = elem->next)
  178. {
  179. if (s2.contain(elem->val))
  180. {
  181. s.insert(elem->val);
  182. }
  183. }
  184. return s;
  185. }
  186.  
  187. int main()
  188. {
  189. set *ptr, set1,set2;
  190. ptr = &set1;
  191. ptr->insert(15);
  192. ptr->insert(16);
  193. ptr->insert(17);
  194. ptr->insert(18);
  195. ptr->print();
  196. ptr = &set2;
  197. ptr->insert(20);
  198. ptr->insert(19);
  199. ptr->insert(17);
  200. ptr->insert(18);
  201. ptr->print();
  202. set set3, set4, set5;
  203. ptr = &set3;
  204. set3 = (set1 + set2);
  205. //set4 = set1 - set2;
  206. //set5 = set1 * set2;
  207.  
  208. ptr->print();
  209. ptr->print();
  210. ptr->print();
  211. return 1;
  212. }
Runtime error #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
18 17 16 15 
18 17 19 20 
0 164817624 164817608 164817592 164817576 164817560 
0 164817624 164817608 164817592 164817576 164817560 
0 164817624 164817608 164817592 164817576 164817560