单循环链表

Posted jiangnansytle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单循环链表相关的知识,希望对你有一定的参考价值。

技术图片
 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 };
 30 
 31 
 32 template<class ElemType>
 33 typename sCycleList<ElemType>::Node* sCycleList<ElemType>::Move(int i) const
 34 {
 35     Node* tmp = Head;
 36     while (--i >= 0)
 37     {
 38         tmp = tmp->next;
 39     }
 40     return tmp;
 41 }
 42 
 43 template<class ElemType>
 44 void sCycleList<ElemType>::Clear()
 45 {
 46     if (Head != nullptr)
 47     {
 48         Node* beg = Head, * tmp = nullptr;
 49         do
 50         {
 51             tmp = Head->next;
 52             delete Head;
 53             Head = tmp;
 54             --CurrentLength;
 55         } while (beg == Head);
 56     }
 57 }
 58 
 59 template<class ElemType>
 60 void sCycleList<ElemType>::Insert(const int& i, const ElemType& X)
 61 {
 62     if (Head == nullptr)
 63     {
 64         Head = new Node(X, Head);
 65         Head->next = Head;
 66     }
 67     else
 68     {
 69         if (i == 0)
 70         {
 71             Node* newNode = new Node(X, Head);
 72             Head = newNode;
 73             Node* tail = Move(CurrentLength);
 74             tail->next = Head;
 75         }
 76         else
 77         {
 78             Node* pre = Move(i - 1);
 79             Node* newNode = new Node(X, pre->next);
 80             pre->next = newNode;
 81         }    
 82     }
 83     ++CurrentLength;
 84 }
 85 
 86 template<class ElemType>
 87 void sCycleList<ElemType>::ReMove(const int& i)
 88 {
 89     Node* pre = Move(i - 1);
 90     
 91     if (pre == Head)
 92     {
 93         Node* delp = pre;
 94         Head = Head->next;
 95         delete delp;
 96         Node* tail = Move(CurrentLength-1);
 97         tail->next = Head;
 98     }
 99     else
100     {
101         Node* delp = pre->next;
102         pre->next = pre->next->next;
103         delete delp;
104     }
105     --CurrentLength;
106 }
107 
108 template<class ElemType>
109 void sCycleList<ElemType>::Erase(const ElemType& X)
110 {
111     if (Head == nullptr)
112         return;
113     int num = CurrentLength;
114     Node* p = Head;
115     Node* tail = Move(CurrentLength-1);
116     Node* pre = Head;
117     while (num--)
118     {
119         if (num + 1 == CurrentLength)
120         {
121             if (p->data == X)
122             {
123                 Head = Head->next;
124                 tail->next = Head;
125                 delete p;
126                 p = Head;
127                 --CurrentLength;
128             }
129             else
130             {
131                 pre = p;
132                 p = p->next;
133             }
134         }
135         else
136         {
137             if (p->data == X)
138             {
139                 if (p == Head)
140                 {
141                     Head = Head->next;
142                     tail->next = Head;
143                     delete p;
144                     p = Head;
145                 }
146                 else
147                 {
148                     p = p->next;
149                     delete pre->next;
150                     pre->next = p;
151                 }    
152                 --CurrentLength;
153             }
154             else
155             {
156                 pre = p;
157                 p = p->next;
158             }
159         }
160     }
161 }
162 
163 template<class ElemType>
164 int sCycleList<ElemType>::Search(const ElemType& X) const
165 {
166     Node* p = Head;
167     int i = 0;
168     while (p->data != X)
169     {
170         ++i;
171         if (i == CurrentLength)
172             return -1;
173         p = p->next;
174     }
175     return i;
176 }
177 
178 template<class ElemType>
179 void sCycleList<ElemType>::Traverse() const
180 {
181     int num = CurrentLength;
182     Node* p = Head;
183     while (num--)
184     {
185         std::cout << p->data << std::endl;
186         p = p->next;
187     }
188 }
189 
190 template<class ElemType>
191 ElemType sCycleList<ElemType>::Visit(const int& i) const
192 {
193     return Move(i)->data;
194 }
195 
196 template<class ElemType>
197 void sCycleList<ElemType>::Inverse()
198 {
199     Node* pn = Head->next;
200     Node* tmp = Head;
201     while (pn!= tmp)
202     {
203         Node* pt = pn->next;
204         Node* pr = Head;
205         Head = pn;
206         Head->next = pr;
207         pn = pt;
208     }
209     pn->next = Head;
210 }
211 #endif
sCycleList.h
技术图片
  1 #include <iostream>
  2 #include <string.h>
  3 #include "sCycleList.h"
  4 void IntTest()
  5 {
  6     std::cout<< "
----------------------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 << "
----------------------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 << "
----------------------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 int main()
149 {
150     IntTest();
151     StringTest();
152     ObjectTest();
153     return 0;
154 }
main.cpp

 

以上是关于单循环链表的主要内容,如果未能解决你的问题,请参考以下文章

编程算法 - 有序双循环链表的插入 代码(C)

c语言,链表的反转,请写出代码,并讲解下,谢了!!!!!

AVKit – 视频片段仅循环 2 次

如何使用事件侦听器来加载动画片段的循环

c#node struct自定义LinkedListNode结构中的循环依赖

java数据结构-04单循环链表