
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_

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

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 }
来源:https://www.cnblogs.com/jiangnansytle/p/12367041.html