zoukankan      html  css  js  c++  java
  • 数据结构—单链表(模板类)

      链表概念--链表是一种线性表,但是并不是顺序存储,而是每个节点里面存储着下一个节点的指针,把存储数据元素的数据串链起来

    单链表的实现

      1 #include<iostream>
      2 #include<assert.h>
      3 using namespace std;
      4 
      5 template <class T>
      6 struct Node
      7 {
      8  Node(const T& x)
      9  :_data(x)
     10  , _pNext(NULL)
     11  { }
     12 
     13  Node<T> *_pNext;
     14  T _data;
     15 };
     16 template <class T>
     17 class SList
     18 {
     19 public:
     20  SList()
     21  :_pHead(NULL)
     22  , _size(0)
     23  { }
     24 
     25  SList(const SList<T>& l)
     26  {
     27  Node<T>*pNode = l._pHead;
     28 
     29  while (pNode)
     30  {
     31  PushBack(pNode->_data);
     32  pNode = pNode->_pNext;
     33  }
     34  }
     35 
     36  ~SList()
     37  {
     38  Clear();
     39  }
     40 
     41  void Clear()
     42  {
     43  Node<T>*pNode = _pHead;
     44 
     45  while (pNode)
     46  {
     47  Node<T>* pDel = pNode;
     48  pNode = pNode->_pNext;
     49  delete pDel;
     50  }
     51  _pHead = NULL;
     52  _size = 0;
     53  }
     54 
     55  SList& operator = (const SList& other)
     56  {
     57  if (this != &other)
     58  {
     59 
     60  Node<T> *pNode = other._pHead;
     61  while (NULL != pNode)
     62  {
     63  PushBack(pNode->_data);
     64  pNode = pNode->_pNext;
     65  }
     66  }
     67 
     68  return *this;
     69  }
     70 
     71  //尾插
     72  void PushBack(const T& x)
     73  {
     74  Node<T>*pNode = _BuyNode(x);
     75  Node<T>*cur = _pHead;
     76  if (Empty())
     77  {
     78  _pHead = pNode;
     79  }
     80  else
     81  {
     82  while (cur->_pNext)
     83  {
     84  cur = cur->_pNext;
     85  }
     86  cur->_pNext = pNode;
     87  }
     88  _size++;
     89  }
     90  //尾删
     91  void PopBack()
     92  {
     93  if (Empty())
     94  {
     95  return;
     96  }
     97  else if (_size == 1)
     98  {
     99  delete _pHead;
    100  _pHead = NULL;
    101  _size = 0;
    102  }
    103  else
    104  {
    105  Node<T>*pNode = _pHead;
    106  Node<T>*pPreNode = NULL;
    107  while (pNode->_pNext)
    108  {
    109  pPreNode = pNode;
    110  pNode = pNode->_pNext;
    111  }
    112  pPreNode->_pNext = NULL;
    113  delete pNode;
    114  _size--;
    115  }
    116 
    117  }
    118  //头插
    119  void PushFront(const T&x)
    120  {
    121  Node<T>*pNode = _BuyNode(x);
    122  if (Empty())
    123  {
    124  _pHead = pNode;
    125  }
    126  else
    127  {
    128  pNode->_pNext = _pHead;
    129  _pHead = pNode;
    130  }
    131  _size++;
    132  }
    133  //头删
    134  void PopFront()
    135  {
    136  if (Empty())
    137  {
    138  return;
    139  }
    140  else if (_size == 1)
    141  {
    142  delete _pHead;
    143  _pHead = NULL;
    144  _size = 0;
    145  }
    146  else
    147  {
    148  Node<T>*pNewNode = _pHead;
    149  _pHead = _pHead->_pNext;
    150  delete pNewNode;
    151  pNewNode = NULL;
    152  _size--;
    153  }
    154  }
    155  //显示
    156  void Print()
    157  {
    158  Node<T>*cur = _pHead;
    159  while (cur)
    160  {
    161  cout << cur->_data << "->";
    162 cur = cur->_pNext;
    163  }
    164  cout << "NULL";
    165  }
    166  //查找
    167  Node<T>* Serach(const T&x)
    168  {
    169  if (Empty())
    170  {
    171  return 0;
    172  }
    173  Node<T>*cur = _pHead;
    174  while (cur)
    175  {
    176  if (cur->_data == x)
    177  {
    178  return cur;
    179  }
    180  cur = cur->_pNext;
    181  }
    182  return NULL;
    183  }
    184  //删除
    185  void Erase(Node<T>*pos)
    186  {
    187 
    188  if (Empty())
    189  {
    190  return;
    191  }
    192  if (pos == _pHead)
    193  {
    194  _pHead = pos->_pNext;
    195  delete pos;
    196  }
    197  else
    198  {
    199  Node<T>*cur = _pHead;
    200  while (cur)
    201  {
    202  if (cur->_pNext == pos)
    203  {
    204  cur->_pNext = pos->_pNext;
    205  delete pos;
    206  }
    207  cur = cur->_pNext;
    208  }
    209  }
    210  }
    211 
    212  //排序(冒泡法)
    213  void BubbleSort()
    214  {
    215  Node<T>* ptail = NULL;
    216  Node<T>*pNode = NULL;
    217  Node<T>* ppreNode = NULL;
    218 
    219  if (_pHead == NULL || _pHead->_pNext == NULL)
    220  {
    221  return;
    222  }
    223  while (_pHead != ptail)
    224  {
    225  int exchange = 0;
    226  ppreNode = _pHead;
    227  pNode = _pHead->_pNext;
    228  while (pNode != ptail)
    229  {
    230  if (ppreNode->_data > pNode->_data)
    231  {
    232  T temp;
    233  temp = ppreNode->_data;
    234  ppreNode->_data = pNode->_data;
    235  pNode->_data = temp;
    236  exchange = 1;
    237  }
    238  ppreNode = pNode;
    239  pNode = pNode->_pNext;
    240  }
    241  if (exchange == 0)
    242  {
    243  return;
    244  }
    245  ptail = ppreNode;
    246  }
    247  }
    248 
    249  //逆置(前插)
    250  void Reverse()
    251  {
    252  Node<T>* pPreNode = NULL;
    253  Node<T>* pNewNode = NULL;
    254  Node<T>* pNode = _pHead;
    255  if (_pHead == NULL || (_pHead)->_pNext == NULL)
    256  {
    257  return;
    258  }
    259  while (pNode)
    260  {
    261  pPreNode = pNode;
    262  pNode = pNode->_pNext;
    263  pPreNode->_pNext = pNewNode;
    264  pNewNode = pPreNode;
    265  }
    266  _pHead = pNewNode;
    267  }
    268 
    269  bool Empty()
    270  {
    271  return _size == 0;
    272  }
    273 
    274  T & operator[](size_t index)
    275  {
    276  if (index >= _size)
    277  {
    278  cout << "index error" << endl;
    279  abort();
    280  }
    281  Node<T>* pNode = _pHead;
    282  while (index--)
    283  {
    284 pNode = pNode->_pNext;
    285  }
    286  return pNode->_data;
    287  }
    288 
    289  const T & operator[](size_t index) const
    290  {
    291  if (index >= _size)
    292  {
    293  cout << "index error" << endl;
    294  abort();
    295  }
    296  Node* pNode = _pHead;
    297  while (index--)
    298  {
    299 pNode = pNode->_pNext;
    300  }
    301  return pNode->_data;
    302  }
    303 
    304  friend ostream& operator << (ostream& _cout, const SList<T>&l)
    305  {
    306  Node<T> *pNode = l._pHead;
    307 
    308  while (pNode)
    309  {
    310  _cout << pNode->_data << "->";
    311 pNode = pNode->_pNext;
    312  }
    313  _cout << "NULL";
    314  return _cout;
    315  }
    316 
    317  Node<T>*FindMidNode();
    318 
    319 private:
    320  Node<T>* _BuyNode(const T& data)
    321  {
    322  return new Node<T>(data);
    323  }
    324 
    325 private:
    326  Node<T> *_pHead;
    327  size_t _size;
    328 };
    329 //查找单链表的中间节点
    330 template <typename T>
    331 Node<T>*SList<T>::FindMidNode()
    332 {
    333  Node<T>*pFast = _pHead;
    334  Node<T>*pSlow = _pHead;
    335  while (pFast&&pFast->_pNext)
    336  {
    337  pFast = pFast->_pNext->_pNext;
    338  pSlow = pSlow->_pNext;
    339  }
    340  return pSlow;
    341 }
    342 
    343 void main()
    344 {
    345  SList<int> s;
    346 
    347  s.PushBack(6);
    348  s.PushBack(3);
    349  s.PushBack(7);
    350  cout << s[0] << endl;
    351  cout << s << endl;
    352 
    353  SList<int> s1(s);
    354 
    355  cout << s1 << endl;
    356 
    357  s.Print();
    358 
    359 }
  • 相关阅读:
    07.消除过期对象的引用
    1.1进程和多线程概述
    1.2什么是操作系统
    06.避免创建不必要的对象
    05.依赖注入优先于硬连接资源
    04.使用私有构造器执行非实例化
    03.使用私有构造方法或枚类实现 Singleton 属性
    02.当构造参数过多时使用builder模式
    01.考虑使用静态工厂方法替代构造方法
    iiS申请地址
  • 原文地址:https://www.cnblogs.com/-zyj/p/5407843.html
Copyright © 2011-2022 走看看