顺序表、链表、栈和队列

  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 };

 

posted @ 2018-02-20 12:47  Posase  阅读(353)  评论(0编辑  收藏  举报