zoukankan      html  css  js  c++  java
  • 顺序表、链表、栈和队列

      1 #include <iostream>
      2 #define Len head->data
      3 using namespace std;
      4 template <class T>
      5 struct node{//带一个指针的结点(可做前驱指针或后继指针)
      6     T data;
      7     node<T> *point;
      8     node(T x = 0):data(x),point(0){}
      9 };
     10 template <class T>//带两个指针的节点,用于双向链表
     11 struct dul_node{
     12     T data;
     13     dul_node<T> *prior,*next;
     14     dul_node(T x = 0):data(x),prior(0),next(0){}
     15 };
     16 template <class T>
     17 class sqlist{//顺序表
     18     int len,max_size,ex_size;
     19     T *array;
     20 public:
     21     sqlist(int l = 100):len(0),max_size(l),ex_size(10){
     22         if(l/10 > 10) ex_size = l/10;
     23         array = new T[max_size];
     24     }
     25     ~sqlist(){ delete[] array; }
     26     void ex_list(){
     27         max_size += ex_size;
     28         T *t = new T[max_size];
     29         for(int i = 0; i < len; ++i)
     30             t[i] = array[i];
     31         delete[] array;
     32         array = t;
     33     }
     34     void display(){
     35         for(int i = 0; i < len; ++i)
     36             cout << array[i] << " ";
     37         cout << endl;
     38     }
     39     bool set_maxSize(int s){
     40         if(s > max_size){
     41             max_size = s;
     42             return true;
     43         }
     44         return false;
     45     }
     46     bool set_exSize(int s){
     47         if(s > 0 && s > ex_size){
     48             ex_size = s;
     49             return true;
     50         }
     51         return false;
     52     }
     53     bool insert(int p, T x){
     54         if(p < 1 || p > len+1) return false;
     55         if(len+1 >= max_size) ex_list();
     56         for(int i = len; i >= p; --i)
     57             array[i] = array[i-1];
     58         array[p-1] = x;
     59         ++len;
     60         return true;
     61     }
     62     bool add(T x){ return insert(len+1,x); }
     63     bool del(int p){
     64         if(p < 1 || p > len) return false;
     65         for(int i = p; i < len; ++i)
     66             array[i-1] = array[i];
     67         --len;
     68         return true;
     69     }
     70     bool del(int p, T &x){
     71         if(p < 1 || p > len) return false;
     72         x = array[p-1];
     73         del(p);
     74         return true;
     75     }
     76     bool get(int p, T &x){
     77         if(p < 1 || p > len) return false;
     78         x = array[p-1];
     79         return true;
     80     }
     81     int seek(T x){
     82         for(int i = 0; i < len; ++i)
     83             if(array[i] == x)
     84                 return i+1;
     85         return 0;
     86     }
     87     int count(T x){
     88         int num = 0;
     89         for(int i = 0; i < len; ++i)
     90             if(array[i] == x)
     91                 ++num;
     92         return num;
     93     }
     94     int length() { return len; }
     95 };
     96 
     97 template <class T>
     98 class next_linklist{//后继式单链表(带头结点)
     99     node<T> *head;
    100 public:
    101     next_linklist(){
    102         head = new node<T>;
    103     }
    104     ~next_linklist(){
    105         while(head){
    106             node<T> *t = head;
    107             head = head->point;
    108             delete t;
    109         }
    110     }
    111     void display(){
    112         for(node<T> *p = head->point; p; p = p->point)
    113             cout << p->data << " ";
    114         cout << endl;
    115     }
    116     node<T> *location(int p){
    117         node<T> *q = head;
    118         for(int i = 1; i < p; ++i)
    119             q = q->point;
    120         return q;
    121     }
    122     bool insert(int p, T x){
    123         if(p < 1 || p > Len+1) return false;
    124         node<T> *q = location(p),*t = new node<T>(x);
    125         t->point = q->point;
    126         q->point = t;
    127         ++head->data;
    128         return true;
    129     }
    130     bool add(T x){ return insert(Len+1,x); }
    131     T del(node<T> *p){
    132         node<T> *t = p->point->point;
    133         T x = p->point->data;
    134         delete p->point;
    135         p->point = t;
    136         --head->data;
    137         return x;
    138     }
    139     bool del(int p){
    140         if(p < 1 || p > Len) return false;
    141         node<T> *q = location(p);
    142         del(q);
    143         return true;
    144     }
    145     bool del(int p, T &x){
    146         if(p < 1 || p > Len) return false;
    147         node<T> *q = location(p);
    148         x = del(q);
    149         return true;
    150     }
    151     bool get(int p, T &x){
    152         if(p < 1 || p > Len) return false;
    153         x = location(p)->point->data;
    154         return true;
    155     }
    156     int seek(T x){
    157         int t = 1;
    158         for(node<T> *p = head->point; p; p = p->point, ++t)
    159             if(p->data == x)
    160                 return t;
    161         return 0;
    162     }
    163     int count(T x){
    164         int num = 0;
    165         for(node<T> *p = head->point; p; p = p->point)
    166             if(p->data == x)
    167                 ++num;
    168         return num;
    169     }
    170     int length(){ return head->data; }
    171 };
    172 
    173 template <class T>
    174 class prior_linklist{//前驱式单链表(不带头结点)
    175     int len;
    176     node<T> *tail;
    177 public:
    178     prior_linklist():tail(0),len(0){}
    179     ~prior_linklist(){
    180         while(tail){
    181             node<T> *t = tail;
    182             tail = tail->point;
    183             delete t;
    184         }
    185     }
    186     node<T> *get_tail(){ return tail; }
    187     void display(node<T> *p){
    188         if(p == 0) return;
    189         display(p->point);
    190         cout << p->data << " ";
    191         if(p == tail) cout << endl;
    192     }
    193     void display(){ display(tail); }
    194     node<T> *location(int p){
    195         if(p >= len) return 0;
    196         p = len - p - 1;
    197         node<T> *q = tail;
    198         while(p--) q = q->point;
    199         return q;
    200     }
    201     bool insert(int p, T x){
    202         if(p < 1 || p > len+1) return false;
    203         node<T> *q = location(p), *t = new node<T>(x);
    204         if(p == len+1){
    205             t->point = tail;
    206             tail = t;
    207         }
    208         else if(q){
    209             t->point = q->point->point;
    210             q->point->point = t;
    211         }
    212         else{
    213             t->point = tail->point;
    214             tail->point = t;
    215         }
    216         ++len;
    217         return true;
    218     }
    219     bool add(T x){ return insert(len+1,x); }
    220     T del(node<T> *p){
    221         T x;
    222         if(p){
    223             node<T> *t = p->point->point;
    224             x = p->point->data;
    225             delete p->point;
    226             p->point = t;
    227         }
    228         else{
    229             node<T> *t = tail->point;
    230             x = tail->data;
    231             delete tail;
    232             tail = t;
    233         }
    234         --len;
    235         return x;
    236     }
    237     bool del(int p){
    238         if(p < 1 || p > len) return false;
    239         node<T> *q = location(p);
    240         del(q);
    241         return true;
    242     }
    243     bool del(int p, T &x){
    244         if(p > 1 || p > len) return false;
    245         node<T> *q = location(p);
    246         x = del(q);
    247         return true;
    248     }
    249     bool get(int p, T &x){
    250         if(p < 1 || p > len) return false;
    251         x = p == len ? tail->data : location(p)->point->data;
    252         return true;
    253     }
    254     int seek(T x){
    255         int n = len,ans = 0;
    256         for(node<T> *p = tail; p; p = p->point,--n)
    257             if(p->data == x)
    258                 ans = n;
    259         return ans;
    260     }
    261     int count(T x){
    262         int n = 0;
    263         for(node<T> *p = tail; p; p = p->point)
    264             if(p->data == x)
    265                 ++n;
    266         return n;
    267     }
    268     int length() { return len; }
    269 };
    270 
    271 template <class T>
    272 class dul_linklist{//双向链表
    273     dul_node<T> *head, *tail;
    274     int len;
    275 public:
    276     dul_linklist():len(0),head(0),tail(0){}
    277     ~dul_linklist(){
    278         for(dul_node<T> *p = head; p; p = head){
    279             head = head->next;
    280             delete p;
    281         }
    282     }
    283     void display(){
    284         for(dul_node<T> *p = head; p != tail; p = p->next)
    285             cout << p->data << " ";
    286         cout << tail->data << endl;
    287     }
    288     dul_node<T> *location(int p){
    289         if(p == 1) return 0;
    290         dul_node<T> *q;
    291         if(p > len/2+1){
    292             p = len - p + 1;
    293             for(q = tail; p--; q = q->prior);
    294         }
    295         else{
    296             p -= 2;
    297             for(q = head; p--; q = q->next);
    298         }
    299         return q;
    300     }
    301     bool insert(int p, T x){
    302         if(p < 1 || p > len+1) return false;
    303         dul_node<T> *q = location(p), *t = new dul_node<T>(x);
    304         t->prior = q;
    305         if(q){
    306             t->next = q->next;
    307             q->next = t;
    308             if(t->next) t->next->prior = t;
    309         }
    310         else{
    311             t->next = head;
    312             if(head) head->prior = t;
    313             head = t;
    314         }
    315         if(p == len+1) tail = t;
    316         ++len;
    317         return true;
    318     }
    319     bool add(T x){ return insert(len+1,x); }
    320     T del(dul_node<T> *p){
    321         T x;
    322         if(p){
    323             if(p == tail->prior) tail = p;
    324             dul_node<T> *t = p->next->next;
    325             x = p->next->data;
    326             delete p->next;
    327             p->next = t;
    328         }
    329         else{
    330             dul_node<T> *t = head->next;
    331             x = head->data;
    332             delete head;
    333             head = t;
    334         }
    335         --len;
    336         return x;
    337     }
    338     bool del(int p){
    339         if(p < 1 || p > len) return false;
    340         dul_node<T> *q = location(p);
    341         del(q);
    342         return true;
    343     }
    344     bool del(int p, T &x){
    345         if(p < 1 || p > len) return false;
    346         dul_node<T> *q = location(p);
    347         x = del(q);
    348         return true;
    349     }
    350     bool get(int p, T &x){
    351         if(p > 1 || p < len) return false;
    352         x = p == 1 ? head->data : location(p)->next->data;
    353         return true;
    354     }
    355     int seek(T x){
    356         int n = 1;
    357         for(dul_node<T> *p = head; p; p = p->next,++n)
    358             if(p->data == x)
    359                 return n;
    360         return 0;
    361     }
    362     int count(T x){
    363         int n = 0;
    364         for(dul_node<T> *p = head; p; p = p->next)
    365             if(p->data == x)
    366                 ++n;
    367         return n;
    368     }
    369     int length(){ return len; }
    370 };
    371 
    372 template <class T>
    373 class stack:public prior_linklist<T>{//前驱式链栈
    374 public:
    375     stack():prior_linklist<T>(){}
    376     bool empty() { return prior_linklist<T>::length(); }
    377     bool push(T x) { return prior_linklist<T>::add(x); }
    378     bool pop() { return prior_linklist<T>::del(prior_linklist<T>::length()); }
    379     bool get(T &x) { return prior_linklist<T>::get(prior_linklist<T>::length(),x); }
    380 };
    381 
    382 template <class T>
    383 class queue:public dul_linklist<T>{//双向式队列
    384 public:
    385     queue():dul_linklist<T>(){}
    386     bool empty() { return dul_linklist<T>::length(); }
    387     bool push(T x) { return dul_linklist<T>::add(x); }
    388     bool pop() { return dul_linklist<T>::del(1); }
    389     bool get(T &x) { return dul_linklist<T>::get(1,x); }
    390 };
  • 相关阅读:
    【转载】$.ajax()方法详解
    【转载】"从客户端中检测到有潜在危险的 Request.Form 值"的解决方案汇总
    jQuery获取select的选中项value和text
    AIDL
    SAX
    AsyncTask
    Handler
    ViewSwitch
    TabActivity
    AlarmManager
  • 原文地址:https://www.cnblogs.com/qq188380780/p/8455056.html
Copyright © 2011-2022 走看看