栈  0.1
数据结构_第3章
sLinkList.h
Go to the documentation of this file.
1 #ifndef __sLinkListIncluded
2 #define __sLinkListIncluded
3 
4 #include "List.h"
5 #include <initializer_list>
17 #include <iostream>
18 
19 namespace List
20 {
21 // 单链表类的定义
22 template <typename T>
23 class sLinkList : public List<T>
24 {
25 private:
26  struct node // 单链表中的结点类
27  {
28  T data;
30  node(const T &obj = T(), node *next = nullptr)
31  : data(obj), next(next) {}
32  ~node() = default;
33  };
34 
35  node *head; // 头指针,指向头节点
36  int currentLength; // 表长
37  node *move(int i) const; // 返回指向第i个结点的指针,i = -1表示头指针
38 
39 public:
41  {
42  public:
43  const_iterator() : current(nullptr) {}
44  virtual const T &operator*() const { return current->data; }
46  {
47  current = current->next;
48  return *this;
49  }
50  // 派生类将定义同名同参函数,仅返回类型不同。若在此(基类)设为虚函数,由于子类函数同名同参,将构成override而不是redefine。由于是值返回,override的函数必须返回相同类型以满足covariant return type规则。
51  /*virtual*/ const_iterator operator++(int)
52  {
53  const_iterator old = *this;
54  current = current->next;
55  return old;
56  }
57  virtual bool operator==(const const_iterator &rhs) const { return rhs.current == current; }
58  virtual bool operator!=(const const_iterator &rhs) const { return rhs.current != current; }
59  bool isEnd() const { return !current; } // past-the-end
60 
61  protected:
64 
65  friend sLinkList<T>;
66  };
67 
68  class iterator : public const_iterator
69  {
70  public:
71  iterator() = default;
72  // 内嵌类的派生类访问基类成员须加类名限定
73  virtual T &operator*() { return iterator::current->data; }
74  virtual const T &operator*() const { return iterator::current->data; }
76  {
78  return *this;
79  }
80 
81  // 派生类将定义同名同参函数,仅返回类型不同。若在基类设为虚函数,由于派生类函数同名同参,将构成override而不是redefine。由于是值返回,override的函数必须返回相同类型以满足covariant return type规则。
82  /*virtual*/ iterator operator++(int)
83  {
84  iterator old = *this;
86  return old;
87  }
88  // 与基类相同
89  // virtual bool operator==(const iterator &rhs) const;
90  // virtual bool operator!=(const iterator &rhs) const;
91  protected:
93  friend sLinkList<T>;
94  };
95 
96 public:
97  sLinkList() : head(new node()), currentLength(0) {}
98  sLinkList(const std::initializer_list<T> &il); // 支持初始化列表
99  virtual ~sLinkList()
100  {
101  clear();
102  delete head;
103  }
104 
105  virtual void clear(); // 删除线性表中所有的元素
106  virtual int length() const; // 返回线性表的长度
107  virtual void insert(int i, const T &obj); // 在第i个位置插入一个元素,即新元素的下标将为i
108  virtual void remove(int i); // 删除第i个位置的元素
109  virtual int search(const T &obj) const; // 返回元素obj在线性表中首次出现的下标
110  virtual T visit(int i) const; // 返回线性表中第i个元素
111  virtual void traverse() const; // 遍历线性表
112  void erase(const T &lb, const T &rb); // 删除所有值在[lb,rb]之间的元素
113  void reverse(); // 逆置
114  T findKthLast(int k); // 返回倒数第k个元素,k为正整数
115 
116  virtual iterator begin() { return iterator(head->next); } // 数据范围[begin, end)
117  virtual const_iterator begin() const { return iterator(head->next); }
118  // 是否允许delete基类成员函数?
119  virtual iterator end() = delete;
120  virtual const_iterator end() const = delete;
121 
122  node &retNode() const
123  {
124  return *head;
125  }
126 };
127 
128 // 单链表类的实现
129 template <class T>
130 sLinkList<T>::sLinkList(const std::initializer_list<T> &il) // 支持初始化列表
131  : sLinkList()
132 {
133  for (auto &obj : il)
134  insert(currentLength, obj);
135 }
136 
137 template <class T>
139 {
140  node *ptr = head;
141  for (int k = 0; k <= i; ++k)
142  ptr = ptr->next;
143 
144  return ptr;
145 }
146 
147 template <class T>
149 {
150  return currentLength;
151 }
152 
153 template <class T>
155 {
156  node *p{head->next}, *q;
157  head = nullptr;
158 
159  while (p)
160  {
161  q = p->next;
162  delete p;
163  p = q;
164  }
165 
166  currentLength = 0;
167 }
168 
169 template <class T>
170 void sLinkList<T>::insert(int i, const T &obj)
171 {
172  node *pre = move(i - 1);
173  pre->next = new node(obj, pre->next);
174  ++currentLength;
175 }
176 
177 template <class T>
179 {
180  node *pre = move(i - 1);
181 
182  node *delp = pre->next;
183  pre->next = delp->next;
184  delete delp;
185 
186  --currentLength;
187 }
188 
189 template <class T>
190 int sLinkList<T>::search(const T &obj) const
191 {
192  node *ptr = head->next;
193  int i = 0;
194 
195  while (ptr)
196  {
197  if (ptr->data == obj)
198  return i;
199 
200  ptr = ptr->next;
201  ++i;
202  }
203 
204  return -1;
205 }
206 
207 template <class T>
208 T sLinkList<T>::visit(int i) const
209 {
210  return move(i)->data;
211 }
212 
213 template <class T>
215 {
216  std::cout << '\n';
217  node *ptr = head->next;
218 
219  while (ptr)
220  {
221  std::cout << ptr->data << ' ';
222  ptr = ptr->next;
223  }
224  std::cout << std::endl;
225 }
226 
227 template <class T>
228 void sLinkList<T>::erase(const T &lb, const T &rb) // 删除所有值在[lb,rb]之间的元素
229 {
230  node *p = head; // 指向当前正在处理结点的前一结点
231 
232  while (p->next)
233  {
234  if (p->next->data >= lb && p->next->data <= rb)
235  {
236  node *delp = p->next;
237  p->next = p->next->next;
238  delete delp;
239  --currentLength;
240  }
241  else
242  p = p->next;
243  }
244 }
245 
246 template <class T>
247 void sLinkList<T>::reverse() // 逆置
248 {
249  node *p = head->next, *q;
250  head->next = nullptr;
251 
252  while (p)
253  {
254  q = p->next;
255 
256  p->next = head->next;
257  head->next = p;
258  p = q;
259  }
260 }
261 
262 template <class T>
263 T sLinkList<T>::findKthLast(int k) // 返回倒数第k个元素,k为正整数
264 {
265  typename sLinkList<T>::node *p = head->next, *q = head->next;
266 
267  // 使q指向第k个结点
268  for (int i = 0; i < k; ++i)
269  {
270  if (!q)
271  return T();
272  q = q->next;
273  }
274 
275  //
276  while (q)
277  {
278  p = p->next;
279  q = q->next;
280  }
281 
282  std::cout << '\n';
283  std::cout << "The " << k << "-th last element is " << p->data << std::endl;
284 
285  return p->data;
286 }
287 } // namespace List
288 #endif
List::sLinkList::const_iterator::const_iterator
const_iterator()
Definition: sLinkList.h:43
List::sLinkList::move
node * move(int i) const
Definition: sLinkList.h:138
List::sLinkList::const_iterator::operator!=
virtual bool operator!=(const const_iterator &rhs) const
Definition: sLinkList.h:58
List::sLinkList::begin
virtual iterator begin()
Definition: sLinkList.h:116
List::sLinkList
Definition: sLinkList.h:23
List::sLinkList::end
virtual iterator end()=delete
List::sLinkList::iterator::operator*
virtual const T & operator*() const
Definition: sLinkList.h:74
List::sLinkList::head
node * head
Definition: sLinkList.h:35
List::sLinkList::const_iterator::operator++
const_iterator operator++(int)
Definition: sLinkList.h:51
List::sLinkList::const_iterator
Definition: sLinkList.h:40
List::sLinkList::node::data
T data
Definition: sLinkList.h:28
List
Definition: dLinkList.h:19
List::sLinkList::currentLength
int currentLength
Definition: sLinkList.h:36
List::sLinkList::iterator::operator++
iterator & operator++()
Definition: sLinkList.h:75
List::sLinkList::const_iterator::operator*
virtual const T & operator*() const
Definition: sLinkList.h:44
List.h
栈的抽象类
List::sLinkList::node::node
node(const T &obj=T(), node *next=nullptr)
Definition: sLinkList.h:30
List::sLinkList::visit
virtual T visit(int i) const
Definition: sLinkList.h:208
List::sLinkList::reverse
void reverse()
Definition: sLinkList.h:247
List::sLinkList::insert
virtual void insert(int i, const T &obj)
Definition: sLinkList.h:170
List::sLinkList::findKthLast
T findKthLast(int k)
Definition: sLinkList.h:263
List::sLinkList::iterator::iterator
iterator(node *p)
Definition: sLinkList.h:92
List::sLinkList::erase
void erase(const T &lb, const T &rb)
Definition: sLinkList.h:228
List::sLinkList::begin
virtual const_iterator begin() const
Definition: sLinkList.h:117
List::sLinkList::node
Definition: sLinkList.h:26
List::sLinkList::clear
virtual void clear()
Definition: sLinkList.h:154
List::sLinkList::const_iterator::const_iterator
const_iterator(node *p)
Definition: sLinkList.h:63
List::sLinkList::traverse
virtual void traverse() const
Definition: sLinkList.h:214
List::sLinkList::const_iterator::current
node * current
Definition: sLinkList.h:62
List::sLinkList::const_iterator::operator==
virtual bool operator==(const const_iterator &rhs) const
Definition: sLinkList.h:57
List::sLinkList::search
virtual int search(const T &obj) const
Definition: sLinkList.h:190
List::sLinkList::node::~node
~node()=default
List::sLinkList::iterator
Definition: sLinkList.h:68
List::sLinkList::length
virtual int length() const
Definition: sLinkList.h:148
List::sLinkList::remove
virtual void remove(int i)
Definition: sLinkList.h:178
List::sLinkList::const_iterator::operator++
virtual const_iterator & operator++()
Definition: sLinkList.h:45
List::sLinkList::retNode
node & retNode() const
Definition: sLinkList.h:122
List::sLinkList::const_iterator::isEnd
bool isEnd() const
Definition: sLinkList.h:59
List::sLinkList::iterator::operator*
virtual T & operator*()
Definition: sLinkList.h:73
List::sLinkList::sLinkList
sLinkList()
Definition: sLinkList.h:97
List::sLinkList::node::next
node * next
Definition: sLinkList.h:29
List::sLinkList::iterator::operator++
iterator operator++(int)
Definition: sLinkList.h:82
List::sLinkList::~sLinkList
virtual ~sLinkList()
Definition: sLinkList.h:99
List::sLinkList::iterator::iterator
iterator()=default