Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.71 KB | None | 0 0
  1. //Tema 8. multimi finite de numere intregi reprezentate ca liste inlantuite
  2. #include<iostream>
  3. using namespace std;
  4.  
  5. template <typename T>
  6. class Node {
  7. public:
  8.     T val{};
  9.     Node *next{};
  10.     friend istream & operator >> (istream &in, Node<T> &node);
  11.     friend ostream & operator << (ostream &out, Node<T> &node);
  12.     Node operator + (const Node &node);
  13.     Node operator * (const Node &node);
  14.     // Node &operator ++ ();
  15.     // const Node operator ++ (int);
  16.     Node &operator += (const Node &node);
  17.     bool operator < (const Node &node) const;
  18.     bool operator == (const Node &node) const;
  19.     bool operator != (const Node &node) const;
  20.     ~Node() {
  21.         delete [] next;
  22.     }
  23. };
  24.  
  25. template <typename T>
  26. istream & operator >> (istream &in, Node<T> &node) {
  27.     in >> node.val;
  28.     return in;
  29. }
  30.  
  31. template <typename T>
  32. ostream & operator << (ostream &out, Node<T> &node) {
  33.     out << node.val;
  34.     return out;
  35. }
  36.  
  37. template <typename T>
  38. Node<T> Node<T>:: operator + (const Node<T> &node) {
  39.     Node<T> rez{};
  40.     rez.val = node.val + this->val;
  41.     return rez;
  42. }
  43.  
  44. template <typename T>
  45. Node<T> Node<T>:: operator * (const Node<T> &node) {
  46.     Node rez{};
  47.     rez.val = this->val * node.val;
  48.     return rez;
  49. }
  50.  
  51. // Node &Node :: operator ++ () {
  52. //     this->val += 1;
  53. //     return *this;
  54. // }
  55.  
  56. // const Node Node :: operator ++ (int) {
  57. //     Node rez = *this;
  58. //     ++(*this);
  59. //     return rez;
  60. // }
  61.  
  62. template <typename T>
  63. Node<T> &Node<T>:: operator += (const Node<T> &node) {
  64.     *this = *this + node;
  65.     return *this;
  66. }
  67.  
  68. template <typename T>
  69. bool Node<T>:: operator < (const Node<T> &node) const {
  70.     return this->val < node.val;
  71. }
  72.  
  73. template <typename T>
  74. bool Node<T>:: operator == (const Node<T> &node) const {
  75.     return this->val == node.val;
  76. }
  77.  
  78. template <typename T>
  79. bool Node<T>:: operator != (const Node<T> &node) const {
  80.     return this->val != node.val;
  81. }
  82.  
  83. template<typename T>
  84. class List {
  85. public:
  86.     int n{};
  87.     Node<T> *start{}, *end{};
  88.     friend istream & operator >> (istream &in, List &list);
  89.     friend ostream & operator << (ostream &out, List &list);
  90.     void sort();
  91. };
  92.  
  93. template <typename T>
  94. void add_node(Node<T> *node, List<T> &list) {
  95.     if (list.start == NULL) {
  96.         list.start = node;
  97.         list.end = list.start;
  98.     } else {
  99.         list.end->next = node;
  100.         list.end = list.end->next;
  101.     }
  102. }
  103.  
  104. template <typename T>
  105. void List<T>:: sort() {
  106.     Node<T> *node1 = this->start, *node2{};
  107.     for (int i = 1; i < this->n ; i ++, node1 = node1->next) {
  108.         node2 = node1->next;
  109.         for (int j = i + 1; j <= this->n; j ++, node2 = node2->next) {
  110.             if (*node2 < *node1) {
  111.                 swap(node1->val, node2->val);
  112.             }
  113.         }
  114.     }
  115. }
  116.  
  117. template <typename T>
  118. ostream & operator << (ostream &out, List<T> &list) {
  119.     for (Node<T> *node = list.start; node != NULL; node = node->next) {
  120.         out << *node << " ";
  121.     }
  122.     return out;
  123. }
  124.  
  125. template <typename T>
  126. istream & operator >> (istream &in, List<T> &list) {
  127.     in >> list.n;
  128.  
  129.     for (int i = 0; i < list.n; i ++) {
  130.         Node<T> *node = new Node<T>;
  131.         in >> *node;
  132.         add_node(node, list);
  133.     }
  134.     return in;
  135. }
  136.  
  137. template <typename T>
  138. class Set : public List<T> {
  139. public:
  140.     void transform();
  141.     Set operator + (const Set &set);
  142.     Set operator * (const Set &set);
  143.     Set operator - (const Set &set);
  144. };
  145.  
  146. template <typename T>
  147. void Set<T>::transform() {
  148.     (*this).sort();
  149.     Node<T> *node = this->start;
  150.     for (int i = 1; i < this->n; i ++, node = node->next) {
  151.         while (node->next != NULL && *node == *node->next) {
  152.             node->next = node->next->next;
  153.             this->n --;
  154.         }
  155.     }
  156. }
  157.  
  158. template <typename T>
  159. void copy_object(Node<T> *node, List<T> &list) {
  160.     while (node != NULL) {
  161.         Node<T> *aux = new Node<T>;
  162.         aux->val = node->val;
  163.         add_node(aux, list);
  164.         node = node->next;
  165.         list.n ++;
  166.     }
  167. }
  168.  
  169. template <typename T>
  170. Set<T> Set<T>:: operator + (const Set<T> &set) {
  171.     Set<T> rez{};
  172.  
  173.     copy_object(this->start, rez);
  174.     copy_object(set.start, rez);
  175.  
  176.     rez.transform();
  177.     return rez;
  178. }
  179.  
  180. template <typename T>
  181. Set<T> Set<T>:: operator * (const Set<T> &set) {
  182.     Node<T> *node1 = this->start, *node2 = set.start;
  183.     Set rez{};
  184.  
  185.     while (node1 != NULL && node2 != NULL) {
  186.         if (*node1 < *node2) {
  187.             node1 = node1->next;
  188.         } else if (*node2 < *node1) {
  189.             node2 = node2->next;
  190.         } else {
  191.             Node<T> *aux = new Node<T>;
  192.             aux->val = node1->val;
  193.             add_node(aux, rez);
  194.             node1 = node1->next;
  195.             node2 = node2->next;
  196.             rez.n ++;
  197.         }
  198.     }
  199.  
  200.     rez.transform();
  201.     return rez;
  202. }
  203.  
  204. template <typename T>
  205. Set<T> Set<T>:: operator - (const Set<T> &set) {
  206.     Set<T> rez{};
  207.     Node<T> *node1 = this->start, *node2 = set.start;
  208.  
  209.     while (node1 != NULL && node2 != NULL) {
  210.         if (*node1 < *node2) {
  211.             Node<T> *aux = new Node<T>;
  212.             aux->val = node1->val;
  213.             add_node(aux, rez);
  214.             node1 = node1->next;
  215.             rez.n ++;
  216.         } else if (*node2 < *node1) {
  217.             node2 = node2->next;
  218.         } else {
  219.             node1 = node1->next;
  220.             node2 = node2->next;
  221.         }
  222.     }
  223.  
  224.     while (node1 != NULL) {
  225.         Node<T> *aux = new Node<T>;
  226.         aux->val = node1->val;
  227.         add_node(aux, rez);
  228.         node1 = node1->next;
  229.         rez.n ++;
  230.     }
  231.  
  232.     return rez;
  233. }
  234.  
  235. //**********************************************************************************************************************
  236. // class Pair_set;
  237.  
  238. class Pair {
  239.     int first, second;
  240.     friend Set<Pair>;
  241.  
  242.     friend istream &operator >>(istream &is, Pair &p) {
  243.         is >> p.first >> p.second;
  244.         return is;
  245.     }
  246.  
  247.     friend ostream &operator <<(ostream &os, Pair &p) {
  248.         os << p.first << ' ' << p.second << '\n';
  249.         return os;
  250.     }
  251.  
  252. public:
  253.     bool operator ==(const Pair &other) const {
  254.         return first == other.first && second == other.second;
  255.     }
  256.  
  257.  
  258.     bool operator <(const Pair &other) const {
  259.         if (first == other.first) {
  260.             return second < other.second;
  261.         }
  262.  
  263.         return first < other.first;
  264.     }
  265. };
  266.  
  267. //**********************************************************************************************************************
  268. // class Pair_set {
  269.  
  270. // };
  271.  
  272. int main() {
  273.     List<int> set1, set2, rez{};
  274.     cin >> set1;
  275.     // set1.transform();
  276.     // cin >> set2;
  277.     // set2.transform();
  278.     // rez = set1 * set2;
  279.     // cout << set1 << endl << set2 << endl << rez;
  280.     return 0;
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement