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