• 【Weiss】【第03章】链表例程


    这种基础例程,如之前所提,会有一个实现和一个简单的测试代码。

    链表其实没什么可说的,其实包括后面的栈和队列也没什么可说的,直接放代码吧。

    下面这个是测试代码

     1 #include <iostream>
     2 #include "linklist.h"
     3 using namespace std;
     4 using namespace linklist;
     5 template class List<int>;
     6 int main(void)
     7 {
     8     List<int> number;
     9 
    10     //测试插入
    11     cout << "/*additem()*/" << endl;
    12     number.additem(2);
    13     number.additem(3);
    14     number.additem(5);
    15     number.additem(7);
    16     number.additem(11);
    17     number.traverse();
    18     cout << "
    /*end*/
    
    "<< flush;
    19 
    20     //测试获取长度
    21     cout << "/*length()*/" << endl;
    22     cout << number.size() << endl;
    23     cout << "/*end*/
    
    " << flush;
    24 
    25     //测试获得头元素
    26     cout << "/*getfirst()*/" << endl;
    27     cout << number.getfirst() << endl;
    28     cout << "/*end*/
    
    " << flush;
    29 
    30     //测试删除存在的元素
    31     cout << "/*remove()*/" << endl;
    32     number.remove(5);
    33     number.traverse();
    34     cout << "
    /*end*/
    
    " << flush;
    35 
    36     //测试删除不存在的元素
    37     cout << "/*remove()*/" << endl;
    38     number.remove(13);
    39     cout << "/*end*/
    
    " << flush;
    40 
    41     //测试清空,并测试从空表中删除元素
    42     cout << "/*clear(),remove()*/" << endl;
    43     number.clear();
    44     number.remove(2);
    45     cout << "/*end*/
    
    " << flush;
    46 
    47     system("pause");
    48 }
    View Code

    主体

      1 #ifndef LINKLIST
      2 #define LINKLIST  3 #include <iostream>
      4 using namespace std;
      5 
      6 namespace linklist
      7 {
      8 
      9 //链表节点模板
     10 template <typename T> struct Node
     11 {
     12     Node<T>() : next(nullptr){}
     13     Node<T>(const T &item, Node<T>* ptr = nullptr) : data(item), next(ptr){}
     14     T data;
     15     Node<T>* next;
     16 };
     17 //头节点及链表主体操作
     18 template <typename T> class List
     19 {
     20 //构造函数
     21 public:
     22     List<T>() : length(0), front(nullptr){}
     23 //接口
     24 public:
     25     //返回长度
     26     unsigned int size()const{ return length; }
     27     //返回头指针
     28     Node<T>* begin()const{ return front; }
     29     //判断是否为空
     30     bool empty()const{ return length == 0; }
     31     //获得头元素
     32     T getfirst()const{ return front->data; }
     33     //#查找元素所在地址
     34     Node<T>* find(const T &item)const;
     35     //#尾部加入新元素
     36     bool additem(const T &item);
     37     //#删除指定元素
     38     bool remove(const T &item);
     39     //#遍历并输出链表元素
     40     void traverse()const;
     41     //清空链表
     42     void clear();
     43 
     44 //辅助函数
     45 private:
     46     //#查找元素前驱
     47     Node<T>* find_prev(const T& item)const;
     48 //数据
     49 private:
     50     unsigned int length;
     51     Node<T>* front;
     52 };
     53 
     54 //如果元素为头元素或元素不存在则返回nullptr,否则返回前驱
     55 template <typename T> Node<T>* List<T>::find_prev(const T& item)const
     56 {
     57     if (length == 0)
     58         return nullptr;
     59     if (front->data == item)
     60         return nullptr;
     61     for (Node<T>* iter = front; iter->next != nullptr; iter = iter->next)
     62     {
     63         if (iter->next->data == item)
     64             return iter;
     65     }
     66     return nullptr;
     67 }
     68 //调用find_prev,如果元素存在则返回地址,不存在则返回nullptr
     69 template <typename T> Node<T>* List<T>::find(const T &item)const
     70 {
     71     Node<T>* iter = find_prev(item);
     72     if (length == 0)
     73         return nullptr;
     74     if (front->data == item)
     75         return front;
     76     return iter->next;
     77 }
     78 template <typename T> bool List<T>::additem(const T &item)
     79 {
     80     Node<T>* pnew = new Node<T>(item);
     81     if (length == 0)
     82         front = pnew;
     83     else
     84     {
     85         Node<T>* iter = front;
     86         while (iter->next != nullptr)
     87             iter = iter->next;
     88         iter->next = pnew;
     89     }
     90     ++length;
     91     return true;
     92 }
     93 template <typename T> bool List<T>::remove(const T &item)
     94 {
     95     if (length == 0)                    //先判断链表是否空避免front->data未定义
     96     {
     97         cout << "No data!" << endl;
     98         return false;
     99     }
    100     Node<T>* iter = find_prev(item);
    101     if (iter == nullptr && front->data != item)
    102     {
    103         cout << "Can not find!" << endl;
    104         return false;
    105     }
    106     Node<T>* save;
    107     if (front->data == item)
    108     {
    109         save = front;
    110         front = front->next;
    111         free(save);
    112     }
    113     else
    114     {
    115         save = iter->next;
    116         iter->next = iter->next->next;
    117         free(save);
    118     }
    119     --length;
    120     return true;
    121 }
    122 template <typename T> void List<T>::traverse()const
    123 {
    124     if (length != 0)
    125     {
    126         for (Node<T>* iter = front; iter != nullptr; iter = iter->next)
    127             cout << iter->data << ends;
    128     }
    129 }
    130 template <typename T> void List<T>::clear()
    131 {
    132     Node<T>* iter;
    133     while (front != nullptr)
    134     {
    135         iter = front;
    136         front = front->next;
    137         delete iter;
    138     }
    139     front = nullptr;
    140     length = 0;
    141 }
    142 }
    143 #endif
  • 相关阅读:
    QT5编程入门教程
    bstr_t与BSTR
    Android Studio 更改APP图标
    Indy服务器关闭所有客户端连接
    使用高德地图API
    内网渗透——Hadoop未授权访问getshell
    内网渗透——struts2远程任意代码执行(s2-046)
    工具使用——cobalt strike使用
    工具使用——docker使用
    漏洞复现——weblogic任意文件上传(cve-2018-2894)
  • 原文地址:https://www.cnblogs.com/catnip/p/4328889.html
Copyright © 2020-2023  润新知