listの追加削除と並べ替えのマージ

21434 ワード


  
  
  
  
  1. #include<iostream> 
  2. using namespace std; 
  3.  
  4. template<class type> 
  5. struct listnode 
  6.     type data; 
  7.     listnode<type> * next; 
  8. }; 
  9.  
  10. template<class type> 
  11. class list 
  12. public
  13.     list(); 
  14.     ~list(); 
  15.     void insertend(type); //  
  16.     bool insert(type,int); //  
  17.     void delnode(int i);  //  
  18.     int find(type T);   //  
  19.     void uni(list<type>);//  
  20.     void sort();         //  
  21.     void empty();   //  
  22.     bool print();  //  
  23.     void merge(list<type>);//  
  24.     int getlen();  //  
  25. private
  26.     listnode<type>* find_for_sort(int); 
  27.     listnode<type> *first,*last; 
  28.     int length; 
  29. }; 
  30.  
  31. template<class type> 
  32. listnode<type>* list<type>::find_for_sort(int t) 
  33.     listnode<type> *p=first->next; 
  34.     int i=1; 
  35.     while(p&&i!=t) 
  36.     { 
  37.         p=p->next; 
  38.         i++; 
  39.     } 
  40.     return p; 
  41.  
  42. template<class type> 
  43. void list<type>::sort() 
  44.     int m; 
  45.     for(int i=1;i<=length;i++) 
  46.     { 
  47.         type t=find_for_sort(i)->data; 
  48.         m=i; 
  49.         for(int j=i+1;j<=length;j++) 
  50.         { 
  51.             if(find_for_sort(j)->data<t) 
  52.             { 
  53.                 t=find_for_sort(j)->data; 
  54.                 m=j; 
  55.             } 
  56.         } 
  57.         delnode(m); 
  58.         insert(t,1); 
  59.     } 
  60.  
  61. template<class type> 
  62. void list<type>::uni(list<type> o) 
  63.     listnode<type> *p=o.first->next; 
  64.     while(p) 
  65.     { 
  66.         if(!find(p->data)) insertend(p->data); 
  67.         p=p->next; 
  68.     } 
  69.  
  70. template<class type> 
  71. void list<type>::merge(list<type> o) 
  72.     listnode<type> *t; 
  73.     listnode<type> *pa=this->first->next; 
  74.     listnode<type> *pb=o.first->next; 
  75.     while(pa&&pb) 
  76.     { 
  77.         if(pa->data>pb->data) 
  78.         { 
  79.             t=pa; 
  80.             pa=pa->next; 
  81.         } 
  82.         else 
  83.         { 
  84.             t->next=pb; 
  85.             t=pb; 
  86.             pb=pb->next; 
  87.             t->next=pa; 
  88.         } 
  89.     } 
  90.     if(pa==0) t->next=pb; 
  91.  
  92. template<class type> 
  93. int list<type>::getlen() 
  94.     return length; 
  95.  
  96. template<class type> 
  97. void list<type>::empty() 
  98.     listnode<type> *p1,*p2; 
  99.  
  100.     p1=first->next; 
  101.     first->next=NULL; 
  102.     while(p1!=NULL) 
  103.     { 
  104.         p2=p1; 
  105.         p1=p1->next; 
  106.         delete p2; 
  107.     } 
  108.     length=0; 
  109.  
  110. template<class type> 
  111. void list<type>::insertend(type t) 
  112.  
  113.     listnode<type> *p; 
  114.     p=new listnode<type>; 
  115.     p->data=t; 
  116.     p->next=NULL; 
  117.     last->next=p; 
  118.     last=p; 
  119.     length++; 
  120.  
  121. template<class type> 
  122. bool list<type>::insert(type t,int i) 
  123.     listnode<type> *p; 
  124.     p=first; 
  125.  
  126.     int k=1; 
  127.     while(p!=NULL&&k<i) 
  128.     { 
  129.         p=p->next; 
  130.         k++; 
  131.     } 
  132.     if(p==NULL&&k!=i) 
  133.         return false
  134.     else 
  135.     { 
  136.         listnode<type> *tp; 
  137.         tp=new listnode<type>; 
  138.         tp->data=t; 
  139.         tp->next=p->next; 
  140.         p->next=tp; 
  141.         length++; 
  142.         if(i==length) last=tp; 
  143.         return true
  144.     } 
  145.  
  146. template<class type> 
  147. void list<type>::delnode(int i) 
  148.     int k=0; 
  149.     listnode<type> *p,*t=0; 
  150.     p=first; 
  151.     while(p!=NULL&&k!=i) 
  152.     { 
  153.         t=p; 
  154.         p=p->next; 
  155.         k++; 
  156.     } 
  157.     t->next=p->next; 
  158.     length--; 
  159.     delete p; 
  160.  
  161. template<class type> 
  162. bool list<type>::print() 
  163.     listnode<type> *p=first->next; 
  164.     if(length==0) 
  165.         return false
  166.     else 
  167.     { 
  168.         cout<<" "<<length<<" : "<<endl; 
  169.         while(p) 
  170.         { 
  171.             cout<<p->data<<" "
  172.             p=p->next; 
  173.         } 
  174.     } 
  175.     cout<<endl; 
  176.     return true
  177.  
  178. template<class type> 
  179. int list<type>::find(type T) 
  180.     listnode<type> *p=first->next; 
  181.     int i=1; 
  182.     while(p&&p->data!=T) 
  183.     { 
  184.         p=p->next; 
  185.         i++; 
  186.     } 
  187.     if(p) 
  188.         return i; 
  189.     else 
  190.         return 0; 
  191.  
  192. template<class type> 
  193. list<type>::~list() 
  194.     delete first,last; 
  195.  
  196. template<class type> 
  197. list<type>::list() 
  198.     listnode<type> *node=new listnode<type>; 
  199.     node->next=NULL; 
  200.     first=last=node; 
  201.     length=0; 
  202.  
  203. int main() 
  204.     list<int> s1,s2; 
  205.     s1.insert(10,1); 
  206.     s1.insert(7,2); 
  207.     s1.insert(3,3); 
  208.     s1.insert(4,4); 
  209.     s2.insert(2,1); 
  210.     s2.insert(4,2); 
  211.     s2.insert(6,3); 
  212.     s2.insert(8,4);// 4 type 8 
  213.     //s1.sort(); 
  214.     //s1.print(); 
  215.     //s2.sort(); 
  216.     //s2.print(); 
  217.     //s1.merge(s2); // sort merge  
  218.     s1.uni(s2);//  
  219.     s1.print(); 
  220.     return 0;