zoukankan      html  css  js  c++  java
  • c++List容器(随意写的

      1 #include <iostream>
      2 #include<my.hpp>
      3 using namespace std;
      4 
      5 void line_feed() {
      6     cout << endl;
      7 }
      8 
      9 template<class T>class List {
     10 public:
     11     T* a;
     12     List() { init(); }
     13 
     14     List(T data) {
     15         init();
     16         this->push_back(data);
     17         curr = begin();
     18     }
     19 
     20     List(List<T>& want) {
     21         init();
     22         auto cp = want.begin();
     23         while (cp != want.end()) {
     24             sz++;
     25             curr = curr->insertsurr(cp->data);
     26             cp = cp->surr;
     27         }
     28 
     29     }
     30     List<T>& operator=(List<T>& want) {
     31         init();
     32         auto cp = want.begin();
     33         while (cp != want.end()) {
     34             sz++;
     35             curr = curr->insertsurr(cp->data);
     36             cp = cp->surr;
     37         }
     38         return *this;
     39     }
     40 
     41     ~List() {
     42         clear();
     43         delete head;
     44         delete tail;
     45     }
     46 
     47     List(initializer_list<T>input) {
     48         init();
     49         this->push_back(input);
     50 
     51     }
     52 
     53     const T& operator [](int times) {
     54         ListNode<T>* cp = begin();
     55         for (auto i = 0; i < times; ++i)cp = cp->surr;
     56         return cp->data;
     57     }
     58     ListNode<T>* operator++() {
     59         curr = curr->surr;
     60         return curr;
     61     }
     62 
     63     ListNode<T>* operator++(int) {
     64         curr = curr->surr;
     65         return curr;
     66     }
     67 
     68     ListNode<T>* operator--() {
     69         curr = curr->pre;
     70         return curr;
     71     }
     72 
     73     ListNode<T>* operator--(int) {
     74         curr = curr->pre;
     75         return curr;
     76     }
     77 
     78     void unique();
     79 
     80     void push_back(const ListNode<T>* list) {
     81         sz++;
     82         tail->pre = tail->pre->insertsurr(list->data);
     83     }
     84 
     85     void push_back(T data) {
     86         sz++;
     87         tail->pre = tail->pre->insertsurr(data);
     88     }
     89 
     90     void push_back(initializer_list<T>input) {
     91         for (auto i = input.begin(); i < input.end(); ++i) {
     92             sz++;
     93             tail->pre = tail->pre->insertsurr(*i);
     94 
     95         }
     96     }
     97 
     98     void push_front(const ListNode<T>* list) {
     99         sz++;
    100         head->surr = head->surr->insertpre(list->data);
    101     }
    102 
    103     void push_front(T data) {
    104         sz++;
    105         head->surr = head->surr->insertpre(data);
    106     }
    107 
    108     void push_front(initializer_list<T>input) {
    109         for (auto i = input.begin(); i < input.end(); ++i) {
    110             sz++;
    111             head->surr = head->surr->insertpre(*i);
    112         }
    113     }
    114 
    115     ListNode<T>* begin() { return head->surr; }
    116 
    117     ListNode<T>* end() { return tail; }
    118 
    119     auto traverse() {
    120         ListNode<T>* cp = begin();
    121         auto s = sz;
    122         while (s--)
    123         {
    124             cout << cp->data << ends;
    125             cp = cp->surr;
    126         }
    127     }
    128     int find(int begin, int end, T data) {
    129         int get = begin;
    130         while (get != end) {
    131             if (operator[](get++) == data)return get - 1;
    132         }
    133         return -1;
    134     }
    135 
    136     ListNode<T>* find(ListNode<T>* begin, ListNode<T>* end, T data) {
    137         decltype(begin) get = this->begin();
    138         while (get != end) {
    139             if (get->data == data)return  get;
    140             get = get->surr;
    141         }
    142         return get;
    143     }
    144 
    145     ListNode<T>* current() { return curr; }
    146 
    147     T current_data() { return curr->data; }
    148 
    149     size_t size()
    150     {
    151         return sz;
    152     }
    153     void insert(ListNode<T>* begin, T data);
    154 
    155     void insert(ListNode<T>* ptr, const ListNode<T>* begin, const ListNode<T>* end) const;
    156 
    157     void insert(ListNode<T>* begin, int site, T data);
    158 
    159     ListNode<T>* remove(ListNode<T>* want);
    160 
    161     ListNode<T>* remove(ListNode<T>* want, int site);
    162 
    163     void clear() {
    164         decltype(head)ptr = begin();
    165         while (--sz) {
    166             ptr = ptr->surr;
    167 
    168             delete ptr->pre;
    169         }
    170         curr = head;
    171     }
    172 
    173     void sorted_unique();
    174 
    175     void insert_sort();
    176 
    177     ListNode<T>* selectMax(ListNode<T>* cp);
    178 
    179     auto search(int begin, int end, T data) {
    180         int get = end;
    181         while (get != begin) {
    182             if (operator[](--get) <= data)break;
    183 
    184         }
    185         return get + 1;
    186 
    187     }
    188 
    189     void insert_after(ListNode<T>* begin, int site, T data);
    190 
    191     auto generate(List<T>ls) {
    192         ListNode<T>* a = begin();
    193         int num = 0;
    194         while (num != ls.size()) {
    195 
    196             a->data = ls[num++];
    197             a = a->surr;
    198         }
    199     }
    200 
    201     void select_sort();
    202 
    203     void swap(ListNode<T>* ls, ListNode<T>* rs) {
    204         T t = ls->data;
    205         ls->data = rs->data;
    206         rs->data = t;
    207     }
    208 
    209 
    210 protected:
    211 
    212     auto init() {
    213         sz = 0;
    214         head = new ListNode<T>(), tail = new ListNode<T>();
    215         head->surr = tail;
    216         tail->pre = head;
    217         head->pre = NULL;
    218         tail->surr = NULL;
    219         curr = head;
    220         rpre = tail;
    221     }
    222 
    223 
    224 private:
    225 
    226     mutable size_t sz;
    227 
    228     ListNode<T>* head, * tail;
    229 
    230     ListNode<T>* curr, * rpre;
    231 };
    232 template<class T> inline void List<T>::insert(ListNode<T>* begin, T data) {
    233     decltype(begin)cp(begin);
    234     sz++;
    235     cp = cp->insertpre(data);
    236 }
    237 
    238 template<class T> inline void List<T>::insert(ListNode<T>* begin, int site, T data) {
    239     sz++;
    240     decltype(begin)cp(begin);
    241     while (site--) { cp = cp->surr; }
    242     cp->insertpre(data);
    243 }
    244 
    245 template<class T> inline void List<T>::insert_after(ListNode<T>* begin, int site, T data) {
    246     sz++;
    247     decltype(begin)cp(begin);
    248     while (site--) { cp = cp->surr; }
    249     cp->insertsurr(data);
    250 }
    251 
    252 template<class T> inline void List<T>::insert(ListNode<T>* ptr, const ListNode<T>* begin, const ListNode<T>* end) const {
    253     decltype(begin)cp(begin);
    254     while (cp != end) {
    255         sz++;
    256         ptr->insertpre(cp->data);
    257         cp = cp->surr;
    258     }
    259 }
    260 template<class T> inline ListNode<T>* List<T>::remove(ListNode<T>* want) {
    261     decltype(want)& p1 = want->pre;
    262     decltype(want)& p2 = want->surr;
    263     p1->surr = want->surr;
    264     p2->pre = want->pre;
    265     delete want;
    266     --sz;
    267     return p2;
    268 }
    269 
    270 template<class T> inline ListNode<T>* List<T>::remove(ListNode<T>* want, int site) {
    271 
    272     while (site--)
    273         want = want->surr;
    274     return remove(want);
    275 
    276 
    277 }
    278 
    279 template<class T>void List<T>::unique() {
    280     int r = 0, site;
    281     while (r != size()) {
    282         {int num = this->operator[](r);
    283         if ((site = find(r + 1, size(), num)) != -1) {
    284             remove(begin(), site);
    285 
    286         }
    287         else r++;
    288         }
    289     }
    290 
    291 }
    292 
    293 template<class T>void List<T>::sorted_unique() {
    294     ListNode<T>* cp = begin(), * nextcp = cp->surr;
    295     while (nextcp != end()) {
    296         {
    297             if (cp->data == nextcp->data) {
    298                 nextcp = nextcp->surr;
    299                 remove(nextcp->pre);
    300             }
    301             else {
    302                 cp = nextcp;
    303                 nextcp = nextcp->surr;
    304             }}
    305     }
    306 
    307 }
    308 
    309 
    310 
    311 template<class T>void List<T>::insert_sort() {
    312     List<T>newlist(0);
    313     ListNode<T>* cp = begin();
    314     size_t s = sz;
    315 
    316     while (s--) {
    317 
    318         int site = newlist.search(0, newlist.size(), cp->data);
    319         newlist.insert(newlist.begin(), site, cp->data);
    320         cp = cp->surr;
    321         //newlist.traverse();
    322         //cout << newlist.begin()->data;
    323     }
    324     newlist.remove(newlist.begin(), 0);
    325     generate(newlist);
    326 
    327 
    328 
    329 }
    330 template<class T>ListNode<T>* List<T>::selectMax(ListNode<T>* cp) {
    331     ListNode<T>* where = cp;
    332     ListNode<T>* other = where;
    333     T max = where->data;
    334     while (where != begin()) {
    335         where = where->pre;
    336         if (where->data > max)
    337         {
    338             max = where->data;
    339             other = where;
    340         }
    341     }
    342     return other;
    343 }
    344 
    345 template<class T>void List<T>::select_sort()
    346 {
    347     using std::swap;
    348     ListNode<T>* cp = end()->pre;
    349     size_t s = sz;
    350     while (s--) {
    351 
    352         this->swap(cp, selectMax(cp));
    353         cp = cp->pre;
    354     }
    355 
    356 }
    357 
    358 int main()
    359 {
    360     List<int>a{ 100,5,2,7,4,6,3,1,1,1,5,42,52, };
    361     a.select_sort();
    362     a.push_back(3);
    363     a.push_back(1);
    364 
    365     a.traverse();
    366     line_feed();
    367     a.insert_sort();
    368     a.traverse();
    369 
    370 
    371 
    372 }
     1 #pragma once
     2 template<class T>struct ListNode {
     3     ListNode() = default;
     4     ListNode(T data, ListNode<T>* pre = NULL, ListNode<T>* surr = NULL) :pre(pre), surr(surr), data(data) {}
     5     ListNode<T>* pre, *surr;
     6     T data;
     7     ListNode<T>*insertpre(const T& data);
     8     ListNode<T>*insertsurr(const T& data);
     9     ListNode<T>* operator++() { this = this->surr; return this; }
    10     bool operator!=(const ListNode<T>right)const { return &this != right; }
    11     T operator*() const { return this->data; }    
    12     ListNode<T>* operator++() const { return this->surr; }
    13     ~ListNode() {}
    14 };
    15 template<class T>ListNode<T>* ListNode<T>::insertpre(const T& data) {
    16     ListNode<T>* newptr = new ListNode<T>(data);
    17     newptr->surr = this;
    18     newptr->pre = pre;
    19     pre->surr = newptr;
    20     pre = newptr;
    21     return newptr;
    22 }
    23 template<class T>ListNode<T>* ListNode<T>::insertsurr(const T& data) {
    24     ListNode<T>* newptr = new ListNode<T>(data);
    25     newptr->surr = surr;
    26     newptr->pre = this;
    27     surr->pre = newptr;
    28     surr = newptr;
    29     return newptr;
    30 }
  • 相关阅读:
    CenOS下搭建PPTP服务
    Nginx做反向代理总是被系统kill
    python排序算法
    linux系统中rsync+inotify实现服务器之间文件实时同步
    HDU
    BZOJ1237: [SCOI2008]配对
    BZOJ2243: [SDOI2011]染色
    BZOJ3192: [JLOI2013]删除物品
    点分治小结
    AtCoder Beginner Contest 124 解题报告
  • 原文地址:https://www.cnblogs.com/otakus/p/13442942.html
Copyright © 2011-2022 走看看