1
- #ifndef CIRCLIST_H
2
- #define CIRCLIST_H
3
-
4
- #include < iostream>
5
-
6
- using namespace std ;
7
-
8
- template <typename DataType>
9
- class CircList
10
- {
11
- friend ostream & operator <<(ostream& out, const CircList<DataType>& list) // tested
12
- {
13
- out << endl;
14
- CircList<DataType>::iterator it = list.begin ();
15
- for (int i = 0 ; i < list.size (); i++, it++)
16
- {
17
- out << (*it) << endl;
18
- }
19
-
20
- return out;
21
- }
22
-
23
- private:
24
- class Node
25
- {
26
- public:
27
- DataType data;
28
- Node *link = NULL ;
29
-
30
- Node (){}
31
- Node (DataType element): data(element){}
32
- Node (Node *ptr): link(ptr){}
33
- Node (DataType element, Node *ptr): data(element), link(ptr){}
34
- ~Node (){link = NULL ;}
35
- }*first = NULL , *rear = NULL ;
36
- int length = 0 ;
37
-
38
- private:
39
- Node* creat_node ()const ;
40
- Node* creat_node (DataType element)const ;
41
- Node* creat_node (DataType element, Node* ptr)const ;
42
- Node* creat_node (Node* node)const ;
43
- void memory_error (Node* p)const ;
44
-
45
- public:
46
- class iterator
47
- {
48
- public:
49
- Node* ptr = NULL ;
50
-
51
- public:
52
- iterator (){}
53
- iterator (Node* p): ptr(p){}
54
- iterator (const iterator& it): ptr(it.ptr){}
55
- ~iterator (){ptr = NULL ;}
56
- iterator& operator =(const iterator& it){ptr = it.ptr ; return *this ;}
57
- bool operator ==(const iterator& it){return (ptr == it.ptr );}
58
- bool operator !=(const iterator& it){return (ptr != it.ptr );}
59
- DataType& operator *(){return ptr->data ;}
60
- iterator& operator ++(){ptr = ptr->link ; return *this ;}
61
- iterator operator ++(int ){iterator it_temp = *this ; ptr = ptr->link ; return it_temp;}
62
- };
63
-
64
- class const_iterator
65
- {
66
- public:
67
- Node* ptr = NULL ;
68
-
69
- public:
70
- const_iterator (){}
71
- const_iterator (Node* p): ptr(p){}
72
- const_iterator (const iterator& it): ptr(it.ptr){}
73
- const_iterator (const const_iterator& it): ptr(it.ptr){}
74
- ~const_iterator (){ptr = NULL ;}
75
- const_iterator& operator =(const iterator& it){ptr = it.ptr ;return *this ;}
76
- const_iterator& operator =(const const_iterator& it){ptr = it.ptr ;return *this ;}
77
- bool operator ==(const iterator& it){return (ptr == it.ptr );}
78
- bool operator ==(const const_iterator& it){return (ptr == it.ptr );}
79
- bool operator !=(const iterator& it){return (ptr != it.ptr );}
80
- bool operator !=(const const_iterator& it){return (ptr != it.ptr );}
81
- DataType operator *(){return ptr->data ;}
82
- const_iterator& operator ++(){ptr = ptr->link ; return *this ;}
83
- const_iterator operator ++(int ){const_iterator it_temp = *this ; ptr = ptr->link ; return it_temp;}
84
- };
85
-
86
- public:
87
- CircList<DataType>(){}; // tested
88
- CircList<DataType>(int n); // tested
89
- CircList<DataType>(int n, DataType element); // tested
90
- CircList<DataType>(const CircList<DataType>& list); // tested
91
- ~CircList<DataType>(); // tested
92
- void clear (); // tested
93
- CircList<DataType>& operator =(const CircList<DataType>& list); // tested
94
- int size ()const ; // tested
95
- bool empty ()const ; // tested
96
- DataType& operator [](int i); // tested
97
- DataType operator [](int i)const ; // tested
98
- int locate (DataType element)const ;
99
- void insert (int n, DataType element); // tested
100
- bool erase (int n); // tested
101
- void push_back (DataType element); // tested
102
- void push_front (DataType element); // tested
103
- DataType pop_back (); // tested
104
- DataType pop_front (); // tested
105
- bool swap (int i, int j); // tested
106
- CircList<DataType> cat (const CircList<DataType>& list); // tested
107
- iterator begin ()const {return iterator (first);}
108
- iterator last ()const {return iterator (rear);}
109
- };
1
+ #ifdef CIRCLIST_H
110
2
111
3
template <typename DataType>
112
4
void CircList<DataType>::memory_error(CircList<DataType>::Node* p)const
@@ -120,7 +12,7 @@ void CircList<DataType>::memory_error(CircList<DataType>::Node* p)const
120
12
}
121
13
122
14
template <typename DataType>
123
- typename CircList<DataType>::Node* CircList<DataType>::creat_node ()const
15
+ typename CircList<DataType>::Node* CircList<DataType>::new_Node ()const
124
16
{
125
17
CircList<DataType>::Node* p = new CircList<DataType>::Node;
126
18
memory_error (p);
@@ -129,7 +21,7 @@ typename CircList<DataType>::Node* CircList<DataType>::creat_node()const
129
21
}
130
22
131
23
template <typename DataType>
132
- typename CircList<DataType>::Node* CircList<DataType>::creat_node (DataType element)const
24
+ typename CircList<DataType>::Node* CircList<DataType>::new_Node (DataType element)const
133
25
{
134
26
CircList<DataType>::Node* p = new CircList<DataType>::Node (element);
135
27
memory_error (p);
@@ -138,7 +30,7 @@ typename CircList<DataType>::Node* CircList<DataType>::creat_node(DataType eleme
138
30
}
139
31
140
32
template <typename DataType>
141
- typename CircList<DataType>::Node* CircList<DataType>::creat_node (DataType element, CircList<DataType>::Node* ptr)const
33
+ typename CircList<DataType>::Node* CircList<DataType>::new_Node (DataType element, CircList<DataType>::Node* ptr)const
142
34
{
143
35
CircList<DataType>::Node* p = new CircList<DataType>::Node (element, ptr);
144
36
memory_error (p);
@@ -147,7 +39,7 @@ typename CircList<DataType>::Node* CircList<DataType>::creat_node(DataType eleme
147
39
}
148
40
149
41
template <typename DataType>
150
- typename CircList<DataType>::Node* CircList<DataType>::creat_node (CircList<DataType>::Node *node)const
42
+ typename CircList<DataType>::Node* CircList<DataType>::new_Node (CircList<DataType>::Node *node)const
151
43
{
152
44
CircList<DataType>::Node* p = new CircList<DataType>::Node (node->data );
153
45
memory_error (p);
@@ -169,11 +61,11 @@ CircList<DataType>::CircList(int n)
169
61
return ;
170
62
}
171
63
172
- first = creat_node ();
64
+ first = new_Node ();
173
65
CircList<DataType>::Node* p = first;
174
66
for (int i = 1 ; i < n; i++)
175
67
{
176
- p->link = creat_node ();
68
+ p->link = new_Node ();
177
69
p = p->link ;
178
70
}
179
71
p->link = first;
@@ -195,11 +87,11 @@ CircList<DataType>::CircList(int n, DataType element)
195
87
return ;
196
88
}
197
89
198
- first = creat_node (element);
90
+ first = new_Node (element);
199
91
CircList<DataType>::Node* p = first;
200
92
for (int i = 1 ; i < n; i++)
201
93
{
202
- p->link = creat_node (element);
94
+ p->link = new_Node (element);
203
95
p = p->link ;
204
96
}
205
97
p->link = first;
@@ -215,12 +107,12 @@ CircList<DataType>::CircList(const CircList<DataType>& list)
215
107
return ;
216
108
}
217
109
218
- first = creat_node (list.first );
110
+ first = new_Node (list.first );
219
111
CircList<DataType>::Node *p = first;
220
112
CircList<DataType>::Node *q = list.first ;
221
113
for (int i = 1 ; i < list.length ; i++)
222
114
{
223
- p->link = creat_node (q->link );
115
+ p->link = new_Node (q->link );
224
116
p = p->link ;
225
117
q = q->link ;
226
118
}
@@ -273,12 +165,12 @@ CircList<DataType>& CircList<DataType>::operator =(const CircList<DataType>& lis
273
165
return *this ;
274
166
}
275
167
276
- first = creat_node (list.first );
168
+ first = new_Node (list.first );
277
169
CircList<DataType>::Node *p = first;
278
170
CircList<DataType>::Node *q = list.first ;
279
171
for (int i = 1 ; i < list.length ; i++)
280
172
{
281
- p->link = creat_node (q->link );
173
+ p->link = new_Node (q->link );
282
174
p = p->link ;
283
175
q = q->link ;
284
176
}
@@ -364,7 +256,7 @@ void CircList<DataType>::insert(int n, DataType element)
364
256
{
365
257
if (length == 0 )
366
258
{
367
- first = creat_node (element);
259
+ first = new_Node (element);
368
260
first->link = first;
369
261
rear = first;
370
262
length = 1 ;
@@ -379,19 +271,19 @@ void CircList<DataType>::insert(int n, DataType element)
379
271
380
272
if (n == 0 )
381
273
{
382
- rear->link = creat_node (element, first);
274
+ rear->link = new_Node (element, first);
383
275
first = rear->link ;
384
276
}
385
277
else if (ni == 0 )
386
278
{
387
- rear->link = creat_node (element, first);
279
+ rear->link = new_Node (element, first);
388
280
rear = rear->link ;
389
281
}
390
282
else
391
283
{
392
284
CircList<DataType>::Node *p = first;
393
285
for (int i = 0 ; i < ni-1 ; i++, p = p->link ){}
394
- p->link = creat_node (element, p->link );
286
+ p->link = new_Node (element, p->link );
395
287
}
396
288
length++;
397
289
}
@@ -442,14 +334,14 @@ void CircList<DataType>::push_back(DataType element)
442
334
{
443
335
if (length == 0 )
444
336
{
445
- first = creat_node (element);
337
+ first = new_Node (element);
446
338
first->link = first;
447
339
rear = first;
448
340
length = 1 ;
449
341
return ;
450
342
}
451
343
452
- rear->link = creat_node (element, first);
344
+ rear->link = new_Node (element, first);
453
345
rear = rear->link ;
454
346
length++;
455
347
}
@@ -459,14 +351,14 @@ void CircList<DataType>::push_front(DataType element)
459
351
{
460
352
if (length == 0 )
461
353
{
462
- first = creat_node (element);
354
+ first = new_Node (element);
463
355
first->link = first;
464
356
rear = first;
465
357
length = 1 ;
466
358
return ;
467
359
}
468
360
469
- rear->link = creat_node (element, first);
361
+ rear->link = new_Node (element, first);
470
362
first = rear->link ;
471
363
length++;
472
364
}
@@ -629,7 +521,7 @@ CircList<DataType> CircList<DataType>::cat(const CircList<DataType>& list)
629
521
CircList<DataType>::Node *p = list.first ;
630
522
for (int i = 0 ; i < list.length ; i++)
631
523
{
632
- rear->link = creat_node (p);
524
+ rear->link = new_Node (p);
633
525
rear = rear->link ;
634
526
p = p->link ;
635
527
}
@@ -638,4 +530,24 @@ CircList<DataType> CircList<DataType>::cat(const CircList<DataType>& list)
638
530
return *this ;
639
531
}
640
532
533
+ template <class DataType >
534
+ ostream & operator <<(ostream& out, const CircList<DataType>& list)
535
+ {
536
+ if (list.empty ())
537
+ {
538
+ return out;
539
+ }
540
+
541
+ int n = list.size ();
542
+ typename CircList<DataType>::iterator it = list.begin ();
543
+ out << (*it);
544
+ it++;
545
+ for (int i = 1 ; i < n; i++, it++)
546
+ {
547
+ out << " , " << (*it);
548
+ }
549
+
550
+ return out;
551
+ }
552
+
641
553
#endif
0 commit comments