C++单循环链表(迭代器版)

天大地大妈咪最大 提交于 2020-02-26 15:35:39
 1 #ifndef _LIST_H_
 2 #define _LIST_H_
 3 //虚基类
 4 template<class ElemType>
 5 class List
 6 {
 7 public:
 8     List() {};
 9     virtual ~List() {};
10     virtual void Clear() = 0;//清空数据结构
11     virtual void Insert(const int& i, const ElemType& X) = 0;//插入元素
12     virtual void ReMove(const int &i) = 0;//移除指定位置的元素
13     virtual void Erase(const ElemType& X) = 0;//删除表中所有X元素
14     virtual int Search(const ElemType& X) const = 0;//搜索某个元素
15     virtual void Traverse() const = 0;//遍历数据结构
16     virtual ElemType Visit(const int& i)const = 0;//访问某个元素
17 };
18 #endif // !_LIST_H_
List.h
  1 #ifndef __SCYCLISTLIST_H__
  2 #define __SCYCLISTLIST_H__
  3 #include "List.h"
  4 template<class ElemType>
  5 class sCycleList :public List<ElemType>
  6 {
  7 private:
  8     struct Node
  9     {
 10         ElemType data;
 11         Node* next;
 12         Node(const ElemType& x, Node* n = nullptr) :data(x), next(n) {}
 13         Node() :next(nullptr) {}
 14     };    
 15     Node* Head;
 16     int CurrentLength;
 17     Node* Move(int i) const;
 18 public:
 19     sCycleList() :Head(nullptr), CurrentLength(0){};
 20     ~sCycleList() { Clear(); };
 21     virtual void Clear() override;//清空数据结构
 22     virtual void Insert(const int& i, const ElemType& X) override;//插入元素
 23     virtual void ReMove(const int& i) override;//移除指定位置的元素
 24     virtual void Erase(const ElemType& X) override;//删除表中所有X元素
 25     virtual int Search(const ElemType& X) const override;//搜索某个元素
 26     virtual void Traverse() const override;//遍历数据结构
 27     virtual ElemType Visit(const int& i)const override;//访问某个元素
 28     void Inverse();//逆置
 29     const int GetSize() const { return CurrentLength; }
 30     /*--------迭代器--------*/
 31     class Iterator
 32     {
 33         friend sCycleList;
 34     private:
 35         Node* cur;
 36     public:
 37     
 38         Iterator(Node* p=nullptr) :cur(p) {}
 39         Iterator operator ++(int)
 40         {
 41             Node* tmp = cur;
 42             cur = cur->next;
 43             return tmp;
 44         }
 45         Iterator operator ++()
 46         {
 47             return cur = cur->next;
 48         }
 49 
 50         ElemType& operator *()
 51         {
 52             return cur->data;
 53         }
 54         bool operator ==(const Iterator& x)
 55         {
 56             return cur == x.cur;
 57         }
 58         bool operator !=(const Iterator& x)
 59         {
 60             return cur != x.cur;
 61         }
 62         bool IsNull(const Iterator& x)
 63         {
 64             return x == nullptr;
 65         }
 66         
 67     };
 68     Iterator begin() const;
 69     void insert(Iterator& p, const ElemType& x);
 70     void erase(Iterator& p);
 71     Iterator search(const ElemType& x);
 72     void traverse(const sCycleList& sList) const;
 73 };
 74 
 75 
 76 template<class ElemType>
 77 typename sCycleList<ElemType>::Node* sCycleList<ElemType>::Move(int i) const
 78 {
 79     Node* tmp = Head;
 80     while (--i >= 0)
 81     {
 82         tmp = tmp->next;
 83     }
 84     return tmp;
 85 }
 86 
 87 template<class ElemType>
 88 void sCycleList<ElemType>::Clear()
 89 {
 90     if (Head != nullptr)
 91     {
 92         Node* beg = Head, * tmp = nullptr;
 93         do
 94         {
 95             tmp = Head->next;
 96             delete Head;
 97             Head = tmp;
 98             --CurrentLength;
 99         } while (beg == Head);
100     }
101 }
102 
103 template<class ElemType>
104 void sCycleList<ElemType>::Insert(const int& i, const ElemType& X)
105 {
106     if (Head == nullptr)
107     {
108         Head = new Node(X, Head);
109         Head->next = Head;
110     }
111     else
112     {
113         if (i == 0)
114         {
115             Node* newNode = new Node(X, Head);
116             Head = newNode;
117             Node* tail = Move(CurrentLength);
118             tail->next = Head;
119         }
120         else
121         {
122             Node* pre = Move(i - 1);
123             Node* newNode = new Node(X, pre->next);
124             pre->next = newNode;
125         }    
126     }
127     ++CurrentLength;
128 }
129 
130 template<class ElemType>
131 void sCycleList<ElemType>::ReMove(const int& i)
132 {
133     Node* pre = Move(i - 1);
134     
135     if (pre == Head)
136     {
137         Node* delp = pre;
138         Head = Head->next;
139         delete delp;
140         Node* tail = Move(CurrentLength-1);
141         tail->next = Head;
142     }
143     else
144     {
145         Node* delp = pre->next;
146         pre->next = pre->next->next;
147         delete delp;
148     }
149     --CurrentLength;
150 }
151 
152 template<class ElemType>
153 void sCycleList<ElemType>::Erase(const ElemType& X)
154 {
155     if (Head == nullptr)
156         return;
157     int num = CurrentLength;
158     Node* p = Head;
159     Node* tail = Move(CurrentLength-1);
160     Node* pre = Head;
161     while (num--)
162     {
163         if (num + 1 == CurrentLength)
164         {
165             if (p->data == X)
166             {
167                 Head = Head->next;
168                 tail->next = Head;
169                 delete p;
170                 p = Head;
171                 --CurrentLength;
172             }
173             else
174             {
175                 pre = p;
176                 p = p->next;
177             }
178         }
179         else
180         {
181             if (p->data == X)
182             {
183                 if (p == Head)
184                 {
185                     Head = Head->next;
186                     tail->next = Head;
187                     delete p;
188                     p = Head;
189                 }
190                 else
191                 {
192                     p = p->next;
193                     delete pre->next;
194                     pre->next = p;
195                 }    
196                 --CurrentLength;
197             }
198             else
199             {
200                 pre = p;
201                 p = p->next;
202             }
203         }
204     }
205 }
206 
207 template<class ElemType>
208 int sCycleList<ElemType>::Search(const ElemType& X) const
209 {
210     Node* p = Head;
211     int i = 0;
212     while (p->data != X)
213     {
214         ++i;
215         if (i == CurrentLength)
216             return -1;
217         p = p->next;
218     }
219     return i;
220 }
221 
222 template<class ElemType>
223 void sCycleList<ElemType>::Traverse() const
224 {
225     int num = CurrentLength;
226     Node* p = Head;
227     while (num--)
228     {
229         std::cout << p->data << std::endl;
230         p = p->next;
231     }
232 }
233 
234 template<class ElemType>
235 ElemType sCycleList<ElemType>::Visit(const int& i) const
236 {
237     return Move(i)->data;
238 }
239 
240 template<class ElemType>
241 void sCycleList<ElemType>::Inverse()
242 {
243     Node* pn = Head->next;
244     Node* tmp = Head;
245     while (pn!= tmp)
246     {
247         Node* pt = pn->next;
248         Node* pr = Head;
249         Head = pn;
250         Head->next = pr;
251         pn = pt;
252     }
253     pn->next = Head;
254 }
255 
256 template<class ElemType>
257 typename sCycleList<ElemType>::Iterator sCycleList<ElemType>::begin() const
258 {
259     return Head;
260 }
261 
262 
263 
264 template<class ElemType>
265 void sCycleList<ElemType>::insert(Iterator& p, const ElemType& x)
266 {
267     if (p.cur == nullptr)
268     {
269         Head = p.cur = new Node(x);
270         Head->next = Head;
271     }
272     else
273     {
274         p.cur = p.cur->next = new Node(x, p.cur->next);
275     }
276     ++CurrentLength;
277 }
278 
279 template<class ElemType>
280 void sCycleList<ElemType>::erase(Iterator& p)
281 {
282     if (nullptr == p.cur)
283     {
284         return;
285     }
286     if (p.cur->next == p.cur)
287     {
288         delete p.cur;
289         Head = p.cur = nullptr;
290     }
291     else
292     {
293         Node* q = p.cur->next;
294         p.cur->next = q->next;
295         if (q == Head)
296             Head = q->next;
297         delete q;
298     }
299     --CurrentLength;
300 }
301 
302 template<class ElemType>
303 typename sCycleList<ElemType>::Iterator sCycleList<ElemType>::search(const ElemType& x)
304 {
305     Iterator p = begin(), q = p;
306     for (++p; p != q; ++p)
307         if (x == *p)
308             return p;
309     return nullptr;
310 }
311 
312 template<class ElemType>
313 void sCycleList<ElemType>::traverse(const sCycleList &sList) const
314 {
315     int i = 0;
316     for (Iterator Itr = sList.begin(); i++ < sList.GetSize(); ++Itr)
317     {
318         std::cout << *Itr << std::endl;
319     }
320 }
321 #endif
sCycleList.h
  1 #include <iostream>
  2 #include <string.h>
  3 #include "sCycleList.h"
  4 void IntTest()
  5 {
  6     std::cout<< "\n----------------------IntTest----------------------" << std::endl;
  7     sCycleList<int> sList;
  8     for (int i = 0; i < 10; ++i)
  9         sList.Insert(i,i+10);
 10     sList.Traverse();
 11     std::cout << "---------ReMove---------" << std::endl;
 12     sList.ReMove(0);
 13     sList.Traverse();
 14     std::cout << "---------Insert---------" << std::endl;
 15     sList.Insert(9, 9999);
 16     sList.Insert(0, 777);
 17     sList.Insert(4, 777);
 18     sList.Insert(4, 777);
 19     sList.Insert(10, 777);
 20     sList.Traverse();
 21     std::cout << "---------Erase---------" << std::endl;
 22     sList.Erase(777);
 23     sList.Erase(-111);
 24     sList.Traverse();
 25     std::cout << "---------Search---------" << std::endl;
 26     std::cout << sList.Search(1111111)<<std::endl;
 27     std::cout << "---------Visit---------" << std::endl;
 28     std::cout << sList.Visit(11) << std::endl;
 29     std::cout << "---------Inverse---------" << std::endl;
 30     sList.Inverse();
 31     sList.Traverse();
 32 }
 33 
 34 void StringTest()
 35 {
 36     std::cout << "\n----------------------StringTest----------------------" << std::endl;
 37     std::string sarr[] = { "aaaa", "bbb", "ccc", "ddd","eee", "fff", "ggg", "hhh","iii","jjj" };
 38     sCycleList<std::string> sList;
 39     for (int i = 0; i < 10; ++i)
 40         sList.Insert(i, sarr[i]);
 41     sList.Traverse();
 42     std::cout << "---------ReMove---------" << std::endl;
 43     sList.ReMove(0);
 44     sList.Traverse();
 45     std::cout << "---------Insert---------" << std::endl;
 46     sList.Insert(0,"ggg");
 47     sList.Insert(3, "ggg");
 48     sList.Traverse();
 49     std::cout << "---------Erase---------" << std::endl;
 50     sList.Erase("ggg");
 51     sList.Traverse();
 52     std::cout << "---------Search---------" << std::endl;
 53     std::cout << sList.Search("ddd") << std::endl;
 54     std::cout << "---------Visit---------" << std::endl;
 55     std::cout << sList.Visit(5) << std::endl;
 56     std::cout << "---------Inverse---------" << std::endl;
 57     sList.Inverse();
 58     sList.Traverse();
 59 }
 60 
 61 struct MyStruct
 62 {
 63     int id;
 64     char name[20];
 65     void copy(const MyStruct& tmp)
 66     {
 67         id = tmp.id;
 68         for (int i = 0; i < 20; ++i)
 69         {
 70             name[i] = tmp.name[i];
 71         }
 72     }
 73     bool operator ==(const MyStruct&tmp) const
 74     {
 75         if (this->id == tmp.id)
 76         {
 77             for (int i = 0; i < 20; ++i)
 78             {
 79                 if (this->name[i] != tmp.name[i])
 80                     return false;
 81             }
 82         }
 83         else
 84         {
 85             return false;
 86         }
 87         return true;
 88     }
 89     MyStruct& operator =(const MyStruct& right)
 90     {
 91         copy(right);
 92         return *this;
 93     }
 94 
 95     bool operator !=(const MyStruct& right)
 96     {
 97         if (right == *this)
 98             return false;
 99         return true;
100     }
101 
102     friend std::ostream& operator <<(std::ostream &os,const MyStruct&self)
103     {
104         os << self.id << "  " << self.name;
105         return os;
106     }
107 };
108 static MyStruct Stdudent[10] =
109 {
110     {1,"ge"},
111     {2,"sheng"},
112     {3,"lu"},
113     {4,"ge1"},
114     {5,"sheng1"},
115     {6,"lu1"},
116     {7,"ge2"},
117     {8,"sheng2"},
118     {9,"lu2"},
119     {10,"lu3"},
120 };
121 
122 void ObjectTest()
123 {
124     std::cout << "\n----------------------ObjectTest----------------------" << std::endl;
125     sCycleList<MyStruct> sList;
126     for (int i = 0; i < 10; ++i)
127         sList.Insert(i, Stdudent[i]);
128     sList.Traverse();
129     std::cout << "---------ReMove---------" << std::endl;
130     sList.ReMove(0);
131     sList.Traverse();
132     std::cout << "---------Insert---------" << std::endl;
133     sList.Insert(0, Stdudent[7]);
134     sList.Insert(3, Stdudent[7]);
135     sList.Traverse();
136     std::cout << "---------Erase---------" << std::endl;
137     sList.Erase(Stdudent[7]);
138     sList.Traverse();
139     std::cout << "---------Search---------" << std::endl;
140     std::cout << sList.Search(Stdudent[5]) << std::endl;
141     std::cout << "---------Visit---------" << std::endl;
142     std::cout << sList.Visit(5) << std::endl;
143     std::cout << "---------Inverse---------" << std::endl;
144     sList.Inverse();
145     sList.Traverse();
146 }
147 
148 void TestIterator()
149 {
150     std::cout << "\n----------------------TestIterator----------------------" << std::endl;
151     sCycleList<MyStruct> sList;
152     sCycleList<MyStruct>::Iterator Itr;
153     
154     for (int i = 0; i < 10; ++i)
155         sList.Insert(i, Stdudent[i]);
156     sList.traverse(sList);
157     sCycleList<MyStruct>::Iterator Itr2(sList.begin());
158 
159     std::cout << "---------begin()  ++  end()---------" << std::endl;
160     int i = 0;
161     for (Itr = sList.begin(); i++ <= sList.GetSize(); ++Itr)
162     {
163         std::cout << *Itr << std::endl;
164     }
165     Itr = sList.begin();
166     std::cout << "--------- ==  != ---------" << std::endl;
167     if (Itr2 == Itr)
168     {
169         std::cout << "==" << std::endl;
170     }
171     else
172     {
173         std::cout << "!=" << std::endl;
174     }
175     std::cout << "---------insert---------" << std::endl;
176     sList.insert(Itr, Stdudent[2]);
177     sList.traverse(sList);
178 
179     std::cout << "---------erase---------" << std::endl;
180     sList.erase(Itr);
181     sList.traverse(sList);
182 
183     std::cout << "---------search---------" << std::endl;
184     ++Itr;
185     ++Itr;
186     sCycleList<MyStruct>::Iterator Itr3(sList.search(*(Itr)));
187     if (Itr3!=nullptr)
188     {
189         std::cout << *Itr3 << std::endl;
190     }
191 }
192 
193 int main()
194 {
195     /*IntTest();
196     StringTest();
197     ObjectTest();*/
198     TestIterator();
199     return 0;
200 }
main.cpp

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!