Mephistopheles_

Template list with indexing

Apr 4th, 2021
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. template<typename T>
  4. class List;
  5. template<typename T>
  6.  
  7. class reall{
  8.     reall* next= nullptr;
  9.  
  10.     reall* priv = nullptr;
  11.  
  12.     T inf;
  13.  
  14. public:
  15.     friend class  List<T>;
  16.  
  17.     explicit reall(const T& a);
  18.  
  19. };
  20.  
  21. template<typename T>
  22. class List{
  23.     int size=0;
  24.  
  25.     reall<T>* r= nullptr;
  26.  
  27. public:
  28.     List ()= default;
  29.     void addfirst(const T& u);
  30.  
  31.     void addlast(const T& u);
  32.  
  33.     void addin(const int& p,const T& u);
  34.  
  35.     void erazeL(const int& p);
  36.  
  37.     int& operator [](const int& a) {
  38.         if (a < 0 || a >= size)
  39.             throw;
  40.         auto *w = r;
  41.         if(a>size/2){
  42.             w=w->priv;
  43.             for(int i=size-1;i>=a;--i){
  44.                 if(i==a)
  45.                     return w->inf;
  46.                 w=w->priv;
  47.             }
  48.         }
  49.         for(int i=0;i<=a;++i){
  50.             if(i==a)
  51.                 return w->inf;
  52.             w=w->next;
  53.         }
  54.     }
  55.     void show();
  56.  
  57.     int getsize();
  58.  
  59.     ~List();
  60.  
  61. };
  62. int main(){
  63.     List<int> l;
  64.     l.addfirst(1);
  65.     cout<<l[0]<<'\n';
  66.     l[0]=5;
  67.     l.addlast(3);
  68.     l.show();
  69.     l.addin(1,2);
  70.     l.show();
  71.     l.erazeL(1);
  72.     l.show();
  73.     l[0] = 0;
  74.     l[1]=1;
  75.     l.show();
  76.     cout<<l.getsize();
  77. }
  78. template<typename T>
  79. reall<T> ::reall(const T& a){
  80.     this->inf=a;
  81. }
  82. template<typename T>
  83. void List<T>:: addfirst(const T& u) {
  84.     auto *w = new reall<T>(u);
  85.     ++size;
  86.     if (size == 1)
  87.         r = w;
  88.     else {
  89.         w->priv = r;
  90.         w->next = r->next;
  91.         if(!w->next){
  92.             w->next=r;
  93.             r->priv = w;
  94.         }
  95.         if(r->next)
  96.             r->next->priv=w;
  97.         r->next = w;
  98.         swap(r->inf,w->inf);
  99.     }
  100. }
  101. template<typename T>
  102. void List<T>::addlast(const T& u){
  103.     auto *w = new reall<T>(u);
  104.     ++size;
  105.     if(size==1)
  106.         r=w;
  107.     else{
  108.         w->priv=r->priv;
  109.         if(!w->priv)
  110.             w->priv=r;
  111.         w->next=r;
  112.         if(r->priv)
  113.             r->priv->next=w;
  114.         else
  115.             r->next=w;
  116.         r->priv=w;
  117.     }
  118. }
  119. template<typename T>
  120. void List<T>::addin(const int& p,const T& u){
  121.     if(p<0 || p>size)return;
  122.     if(p==0 || size==0) {
  123.         addfirst(u);
  124.         return;
  125.     }
  126.     if(p==size ) {
  127.         addlast(u);
  128.         return;
  129.     }
  130.     ++size;
  131.     auto*q=r;
  132.     auto *w = new reall<T>(u);
  133.     for(int i=0;i<p;++i){
  134.         if(i==p-1) {
  135.             w->priv = q;
  136.             w->next = q->next;
  137.             q->next->priv = w;
  138.             q->next = w;
  139.         }
  140.         q=q->next;
  141.     }
  142. }
  143. template<typename T>
  144. void List<T>::erazeL(const int& p){
  145.     if(p>=size || p<0)return;
  146.     --size;
  147.     if(p==0){
  148.         if(size==0){
  149.             delete r;
  150.             return;
  151.         }
  152.         auto* w=r->next;
  153.         swap(r->inf,w->inf);
  154.         if(size==1){
  155.             r->next= nullptr;
  156.             r->priv= nullptr;
  157.             delete w;
  158.             return;
  159.         }
  160.         w->next->priv=r;
  161.         r->next=w->next;
  162.         delete w;
  163.     }
  164.     else{
  165.         auto* w=r;
  166.         for(int i=0;i<=p;++i){
  167.             if(i==p) {
  168.                 if(w->next)
  169.                     w->priv->next=w->next;
  170.                 w->next->priv=w->priv;
  171.                 if(size==1){
  172.                     r->next= nullptr;
  173.                     r->priv= nullptr;
  174.                 }
  175.                 delete w;
  176.             }
  177.             w=w->next;
  178.         }
  179.     }
  180. }
  181. template<typename T>
  182. List<T>::~List(){
  183.     auto* w=r;
  184.     for(int i=0;i<size;++i){
  185.         w=w->next;
  186.         delete r;
  187.         r=w;
  188.     }
  189. }
  190. template<typename T>
  191. void List<T>::show(){
  192.     auto* w=r;
  193.     for(int i=0;i<size;++i){
  194.         cout<<w->inf<<' ';
  195.         w=w->next;
  196.     }
  197.     cout<<'\n';
  198. }
  199. template<typename T>
  200. int List<T>::getsize(){
  201.     return size;
  202. }
Advertisement
Add Comment
Please, Sign In to add comment