Guest User

set

a guest
Jun 3rd, 2011
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.69 KB | None | 0 0
  1. //множества
  2. #include <iostream.h>
  3. #include <conio.h>
  4.  
  5. template <class SetType> class set{
  6. public:
  7.     set(int size);
  8.     set(set<SetType> &ob);
  9.     ~set(){del();};
  10.  
  11.     //функции
  12.     void init();//вводим множества
  13.     void print();//печатаем множества
  14.  
  15.     friend set <SetType> operator +(SetType &el, set<SetType> &ob){return ob+el;};//элемент + множество
  16.     set <SetType> operator +(SetType &el);//множество + элемент
  17.     set <SetType> operator +(set<SetType> &ob);//объединение множеств
  18.     set <SetType> operator &(set<SetType> &ob);//пересечение множеств
  19.     set <SetType> operator -(set<SetType> &ob);//разность множеств
  20.     set <SetType> operator ^(set<SetType> &ob);//симметричная разность
  21.     set <SetType> &operator =(const set &ob);//присваивание
  22.  
  23.     int operator <(set<SetType> &ob);//подмножество
  24.     int operator >(set<SetType> &ob);//надмножество
  25.     int operator <(SetType &el);//принадлежность элемента
  26.     int operator ==(set<SetType> &ob);//эквивалентность множеств
  27.     int operator !=(set<SetType> &ob);//неэквивалентность множеств
  28.     int operator &();//проверка на пустоту
  29.     int operator !();//размер множества
  30.  
  31.     set <SetType> operator --(int x);//удаление элемента из конца
  32.     set <SetType> operator --();//удаление элемента из начала
  33.  
  34.  
  35.     friend ostream &operator << (ostream &cout, set<SetType> &ob);//печать
  36.     //-->
  37. private:
  38.     int sz;//размер множества
  39.     int id;
  40.  
  41.     struct list{//структура, в которой хранятся элементы множеств
  42.         SetType key;
  43.         list *next;
  44.     };
  45.     list *root;
  46.     list *head;
  47.  
  48.     //функции для работы со списком
  49.     list *search(SetType key);//поиск элемента в списке
  50.     list *search(set<SetType> &ob, SetType key);//поиск элемента в списке
  51.     list *search_el(SetType id);//проверка множества на уникальность элементов
  52.     void add(SetType id);//добавление элемента в список
  53.     void del();//удаление списка
  54.     void del_el();//удаление элемента
  55. };
  56.  
  57. //--------------------------------------------------------------------------------------------------------------------------->
  58. //--------------------------------------------------------------------------------------------------------------------------->
  59. template <class SetType> set<SetType>::set(int size){
  60.     sz=size;
  61.     root=head=new list;
  62.  
  63.     if(sz>1)
  64.         init();//вводим множества
  65.  
  66.     else if(sz==1){
  67.         cin >> root->key;
  68.         root->next=new list;
  69.         root->next = NULL;
  70.     }
  71.     else if(sz==0)
  72.         root=head=NULL;
  73. }
  74.  
  75. template <class SetType> void set<SetType>::init(){//вводим множества
  76.     cin >> root->key;//вводим первый элемент множества
  77.     for(int i=0; i<sz-1; i++){//вводим остальные элементы
  78.         root->next=new list;
  79.         cin >> root->next->key;
  80.         root=root->next;
  81.         root->next=NULL;
  82.         //проверка на уникальность элементов
  83.         while(search_el(root->key)!=NULL){
  84.             cout << "error!";
  85.             cin >> root->key;
  86.         }
  87.     }
  88. }
  89.  
  90. template <class SetType> set<SetType>::set(set<SetType> &ob):sz(0){
  91.     root=head=NULL;
  92.     list *temp=head=ob.head;
  93.     root=new list;
  94.  
  95.     while(temp){
  96.         add(temp->key);
  97.         temp=temp->next;
  98.     }
  99. }
  100. //--------------------------------------------------------------------------------------------------------------------------->
  101. //функции для работы со списком:
  102. //--------------------------------------------------------------------------------------------------------------------------->
  103. template <class SetType> set<SetType>::list *set<SetType>::search(SetType key){//поиск элемента в списке
  104.     list *tmp=head;
  105.     while (tmp!=NULL){
  106.         if (tmp->key==key)
  107.             break;
  108.         tmp=tmp->next;
  109.     }
  110.     return tmp;
  111. }
  112.  
  113. template <class SetType> set<SetType>::list *set<SetType>::search(set<SetType> &ob, SetType key){//поиск элемента в списке
  114.     list *tmp=ob.head;
  115.     while (tmp!=NULL){
  116.         if (tmp->key==key)
  117.             break;
  118.         tmp=tmp->next;
  119.     }
  120.     return tmp;
  121. }
  122.  
  123. template <class SetType> void set<SetType>::add(SetType id){//добавляем элемент
  124.     if(sz==0){
  125.         head=new list;
  126.         head->key=id;
  127.         head->next=NULL;
  128.         root=head;
  129.     }
  130.     else{
  131.         list *tmp=new list;
  132.         tmp->key=id;
  133.         tmp->next=NULL;
  134.         root->next=tmp;
  135.         root=tmp;
  136.     }
  137.     sz++;
  138. }
  139.  
  140. template <class SetType> void set<SetType>::print(){//печатаем множества  
  141.     list *tmp=head;
  142.     while(tmp){
  143.         cout << tmp->key << " ";
  144.         tmp=tmp->next;
  145.     }
  146.     cout <<endl;
  147. }
  148.  
  149. template <class SetType> void set<SetType>::del(){//удаление списка
  150.     list *tmp;
  151.     while(head){
  152.         tmp=head;
  153.         head=head->next;
  154.         delete[] tmp;
  155.     }
  156.     sz=0;
  157. }
  158.  
  159. //проверка элементов
  160. template <class SetType> set<SetType>::list *set<SetType>::search_el(SetType id){
  161.     list *tmp=head;
  162.  
  163.     while (tmp->next){
  164.         if (tmp->key==id)
  165.             return tmp;
  166.         tmp=tmp->next;
  167.     }
  168.     return NULL;
  169. }
  170.  
  171. //удаление элемента
  172. template <class SetType> void set<SetType>::del_el(){
  173.     list *tmp=head;
  174.  
  175.     while(tmp->next)
  176.         tmp=tmp->next;
  177.     list *q=tmp;
  178.  
  179.     tmp=head;
  180.     while(tmp->next->next)
  181.         tmp=tmp->next;
  182.     tmp->next=NULL;
  183.     delete[] q;
  184. }
  185. //--------------------------------------------------------------------------------------------------------------------------->
  186. //перегрузка операторов:
  187. //--------------------------------------------------------------------------------------------------------------------------->
  188. //печать
  189. template <class SetType> ostream &operator << (ostream &cout, set<SetType> &ob){
  190.     ob.root=ob.head;
  191.     while(ob.root){
  192.         cout << ob.root->key << " ";
  193.         ob.root=ob.root->next;
  194.     }
  195.     cout <<endl;
  196.  
  197.     return cout;
  198. }
  199.  
  200. //объединение двух множеств /объект + объект/
  201. template <class SetType> set<SetType> set<SetType>::operator +(set<SetType> &ob){
  202.     set<SetType> val=*this;
  203.     list *tmp=ob.head;
  204.  
  205.     for(int i=0; i<ob.sz; i++){
  206.         val=val+(tmp->key);
  207.         tmp=tmp->next;
  208.     }
  209.     return val;
  210. }
  211.  
  212. //объединение двух множеств /объект + элемент/
  213. template <class SetType> set<SetType> set<SetType>::operator +(SetType &el){   
  214.     set<SetType> val=*this;
  215.  
  216.     if(search(el)==NULL)//проверяем, нет ли в множестве этого элемента
  217.         val.add(el);//добавляем элемент в список
  218.     return val;
  219. }
  220.  
  221. //пересечение множеств
  222. template <class SetType> set<SetType> set<SetType>::operator &(set<SetType> &ob){
  223.     set<SetType> newval(0);//пустое множество, в которое будет скопирован результат поиска
  224.     list *tmp=ob.head;
  225.  
  226.     while(tmp){
  227.         if(search(tmp->key)!=NULL)
  228.             newval.add(tmp->key);
  229.         tmp=tmp->next;
  230.     }
  231.  
  232.     return newval;
  233. }
  234.  
  235. //разность множеств
  236. template <class SetType> set<SetType> set<SetType>::operator -(set<SetType> &ob){
  237.     set<SetType> newval(0);//пустое множество, в которое будет скопирован результат поиска
  238.     list *temp=head;
  239.  
  240.     while(temp){
  241.         if(search(ob, temp->key)==NULL)
  242.             newval.add(temp->key);
  243.         temp=temp->next;
  244.     }
  245.     return newval;
  246. }
  247.  
  248. //симметричная разность
  249. template <class SetType> set<SetType> set<SetType>::operator ^(set<SetType> &ob){
  250.     set<SetType> newval(0);
  251.     list *temp=head;
  252.     list *tmp=ob.head;
  253.  
  254.     //копируем элементы из первого множества
  255.     while(temp){
  256.         if(search(ob, temp->key)==NULL)
  257.             newval.add(temp->key);
  258.         temp=temp->next;
  259.     }
  260.     //копируем элементы из второго множества
  261.     while(tmp){
  262.         if(search(tmp->key)==NULL)
  263.             newval.add(tmp->key);
  264.         tmp=tmp->next;
  265.     }
  266.     return newval;
  267. }
  268.  
  269. //присваивание
  270. template <class SetType> set<SetType> & set<SetType>::operator =(const set &ob){
  271.     if(sz==ob.sz){
  272.         list *tmp=head;
  273.         list *temp=ob.head;
  274.  
  275.         while(tmp){
  276.             tmp->key=temp->key;
  277.             tmp=tmp->next;
  278.             temp=temp->next;
  279.         }  
  280.     }
  281.     else{
  282.         del();
  283.         list *tmp=ob.head;
  284.  
  285.         while(tmp){
  286.             add(tmp->key);
  287.             tmp=tmp->next;
  288.         }
  289.     }
  290.     return *this;
  291. }
  292.  
  293. //подмножество
  294. template <class SetType> int set<SetType>::operator <(set<SetType> &ob){
  295.     list *tmp=head;
  296.  
  297.     while(tmp){
  298.         if(search(ob, tmp->key)==NULL)//ищем отсутствие элементов из 1 множества во 2
  299.             return 0;
  300.         tmp=tmp->next;
  301.     }
  302.     return 1;
  303. }
  304.  
  305. //надмножество
  306. template <class SetType> int set<SetType>::operator >(set<SetType> &ob){
  307.     list *tmp=ob.head;
  308.  
  309.     while(tmp){
  310.         if(search(tmp->key)==NULL)//ищем отсутствие элементов из 2 множества в 1
  311.             return 0;
  312.         tmp=tmp->next;
  313.     }
  314.     return 1;
  315. }
  316.  
  317. //принадлежность элемента
  318. template <class SetType> int set<SetType>::operator <(SetType &el){
  319.     root=head;
  320.     if(search(el)!=NULL)//проверяем наличиe элемента
  321.         return 1;
  322.  
  323.     return 0;
  324. }
  325.  
  326. //эквивалентность
  327. template <class SetType> int set<SetType>::operator ==(set<SetType> &ob){
  328.     list *temp=ob.head;
  329.  
  330.     while(temp){
  331.         if(search(temp->key)==NULL)//если какой-то элемент 2 множества не равен элементам 1, то множества неэквивалентны
  332.             return NULL;
  333.         temp=temp->next;
  334.     }
  335.     return 1;
  336. }
  337.  
  338. //неэквивалентность
  339. template <class SetType> int set<SetType>::operator !=(set<SetType> &ob){
  340.     return !(*this==ob);
  341. }
  342.  
  343. //пустое ли
  344. template <class SetType> int set<SetType>::operator &(){
  345.     if(head)
  346.         return 1;
  347.     return NULL;
  348. }
  349.  
  350. //размер множества
  351. template <class SetType> int set<SetType>::operator !(){
  352.     int i=0;
  353.     list *tmp=head;
  354.  
  355.     while(tmp){
  356.         tmp=tmp->next;
  357.         i++;
  358.     }
  359.     return i;
  360. }
  361.  
  362. //удаление элемента из хвоста
  363. template <class SetType> set<SetType> set<SetType>::operator --(int x){
  364.     if(sz>1){
  365.         list *tmp=head;
  366.  
  367.         while(tmp->next)
  368.             tmp=tmp->next;
  369.         list *q=tmp;
  370.  
  371.         tmp=head;
  372.         while(tmp->next->next)
  373.             tmp=tmp->next;
  374.         tmp->next=NULL;
  375.         delete[] q;
  376.     }
  377.     else
  378.         cout << "size<1!" <<endl;
  379.  
  380.     return *this;
  381. }
  382.  
  383. //удаление элемента из головы
  384. template <class SetType> set<SetType> set<SetType>::operator --(){
  385.     if(sz>1){
  386.         list *temp;
  387.         temp=head;
  388.         head=head->next;
  389.         delete temp;
  390.     }
  391.     else
  392.         cout << "size<1!" <<endl;
  393.  
  394.     return *this;
  395. }
  396. //--------------------------------------------------------------------------------------------------------------------------->
  397. //--------------------------------------------------------------------------------------------------------------------------->
  398.    
  399. int main(){
  400.     int sz1, sz2;//размеры для создания объекта
  401.     int size=0;//размер множества
  402.  
  403.     cout <<"SIZE1: ";//размер множества
  404.     cin >> sz1;
  405.     cout <<"SIZE2: ";
  406.     cin >> sz2;
  407.  
  408.     cout << "set1(int): " <<endl;//множества целочисленных элементов
  409.     set<int> s_int_1(sz1);
  410.     cout << "set2(int): " <<endl;
  411.     set<int> s_int_2(sz2);
  412.  
  413.     //================================================================>
  414.     cout << "__________________________" <<endl;
  415.         int el1;
  416.         cout << "el: ";
  417.         cin >> el1;
  418.         cout <<endl;
  419.         s_int_1=el1+s_int_1;//элемент + множество
  420.         cout << "el+s_int_1: ";
  421.         cout << s_int_1;
  422.  
  423.         int el;
  424.         cout << "el(add): ";
  425.         cin >> el;//вводим элемент, который надо прибавить к множеству
  426.         cout <<endl;
  427.         cout << "set1+el: ";
  428.         s_int_1=s_int_1+el;//добавляем элемент к множеству
  429.         cout << s_int_1;
  430.    
  431.         if(s_int_1 < s_int_2){//множество 1 является подмножеством множества 2
  432.             cout << "s_int_1 < s_int_2" <<endl;
  433.             cout <<endl;
  434.         }
  435.  
  436.         if(s_int_1 > s_int_2){//множество 1 является надмножеством множества 2
  437.             cout << "s_int_1 > s_int_2" <<endl;
  438.             cout <<endl;
  439.         }
  440.  
  441.         int tmp;
  442.         cout << "el: ";
  443.         cin >> tmp;
  444.         cout <<endl;
  445.         if(s_int_1 < tmp)//определяем принадлежность введеного элемента множеству
  446.             cout << "el < set1" <<endl;
  447.  
  448.         if(s_int_1 == s_int_2){//эквивалентность
  449.             cout << "s_int_1 == s_int_2" <<endl;
  450.             cout << endl;
  451.         }
  452.  
  453.         if(s_int_1 != s_int_2){//неэквивалентность
  454.             cout << "s_int_1 != s_int_2" <<endl;
  455.             cout << endl;
  456.         }
  457.  
  458.         if(!(&s_int_1))//пустое ли
  459.             cout <<"s_int_1 == NULL";
  460.  
  461.         size=(!s_int_1);//размер
  462.         cout << "SIZE: " << size <<endl;
  463.  
  464.     //================================================================>
  465.     cout << "__________________________" <<endl;
  466.     cout << "set1 ^ set2: ";
  467.     s_int_1=s_int_1^s_int_2;//симметричная разность
  468.     cout << s_int_1;
  469.  
  470.     cout << "set1 - set2: ";
  471.     s_int_1=s_int_1-s_int_2;//разность
  472.     cout << s_int_1;
  473.  
  474.     cout << "set1 + set2: ";
  475.     s_int_1=s_int_1+s_int_2;//объединение множеств
  476.     cout << s_int_1;
  477.  
  478.     cout << "set1 & set2: ";
  479.     s_int_1=s_int_1&s_int_2;//пересечение множеств
  480.     cout << s_int_1;
  481.  
  482.     s_int_1=s_int_1--;//удаление последнего элемента
  483.     cout << "s_int_1--: ";
  484.     cout << s_int_1;
  485.  
  486.     s_int_1=--s_int_1;//удаление первого элемента
  487.     cout << "--s_int_1: ";
  488.     cout << s_int_1;
  489.    
  490.     cout << "Press any key...";
  491.     getch();
  492. }
Advertisement
Add Comment
Please, Sign In to add comment