C++数据结构之单链表实现

单链表模版实现

功能:

1 创建

2 遍历

3 反转

4 插入

5 取值

6 修改某位置值

7 删除

。。。。

xxx.h

节点定义:

  1. template <typename T> 
  2. struct sLink {
  3.     T data;
  4.     struct sLink *next;
  5.     
  6.     sLink(){this->next = nullptr;}
  7.     sLink(const T data){this->data = data; this->next = nullptr;}
  8.     sLink(const struct sLink &node){this->data = node.data; this->next = nullptr;}
  9. };

别名定义:

  1. template <typename T> 
  2. using sLinkNode = struct sLink<T>;

链表定义:

  1. template <typename T> 
  2. class sLinkList {
  3.     private:
  4.         sLinkNode <T> *head;
  5.     public:
  6.         sLinkList() {this->head = nullptr;}
  7.         sLinkList(const T &data){this->head = new sLinkNode<T>(data);}
  8.         sLinkList(const sLinkNode<T> &node){this->head = new sLinkNode<T>(node);}
  9.         sLinkList(const sLinkList<T> &list);
  10.         ~sLinkList();
  11.         void clear();
  12.         bool isEmpty();
  13.         int length();
  14.         void show();
  15.         void reverse();
  16.         
  17.         bool GetHeadNode(T &data);
  18.         bool GetTailNode(T &data);
  19.         bool GetPosNode(T &data, int pos);
  20.         
  21.         bool SetHeadNode(const T &data);
  22.         bool SetTailNode(const T &data);
  23.         bool SetPosNode(const T &data, int pos);
  24.                 
  25.         bool InsertHeadNode(const T &data);
  26.         bool AppendTailNode(const T &data);
  27.         bool InsertPosNode(const T &data, int pos);
  28.         
  29.         bool PopHeadNode(T &data);
  30.         bool PopTailNode(T &data);
  31.         bool PopNodePos(T &data, int pos);
  32.         
  33.         bool DelHeadNode();
  34.         bool DelTailNode();
  35.         bool DelPosNode(int pos);
  36.         
  37.         
  38.         /*
  39.         function:find the position of node which equal to data in the list
  40.         data:the data which compared
  41.         return value:the position which equal to data;
  42.         this function need edit accoding the T
  43.         */
  44.         int GetFirstNodePos(T &data);
  45.         /*
  46.         function:find the position of node which equal to data in the list
  47.         data:the data which compared
  48.         pos:the array which storage the position
  49.         return value:the num which equal to data;
  50.         this function need edit accoding the T
  51.         */
  52.         int GetNodePos(T &data,int *pos);
  53. };

xxx.cpp

复制构造函数:

template <typename T>
sLinkList<T>::sLinkList(const sLinkList<T> &list)
{
    sLinkNode<T> *p1 = list.head, *p2, *p3;

    if(p1 == nullptr)
    {
        this->head = nullptr;

        return ;
    }
    
    this->head = new sLinkNode<T>(*p1);
    p2 = this->head;
    p1 = p1->next;
    
    while(p1 != nullptr){
        p3 = new sLinkNode<T>(*p1);        
        p2->next = p3;
        p2 = p3;        
        p1 = p1->next;
    }
    p2->next = nullptr;
}

析构函数:删除链表中所有元素

template <typename T>
sLinkList<T>::~sLinkList()
{
    sLinkNode<T> *p = this->head;
    while(p != nullptr){
        p = p->next;
        delete this->head;
        this->head = p;
    }    
}

清除函数:删除链表中所有函数,与析构函数操作几乎一致

template <typename T>
void sLinkList<T>::clear()
{
    if(this->head == nullptr)
        return ;
    
    sLinkNode<T> *p = this->head;
    while(p != nullptr){
        p = p->next;
        delete this->head;
        this->head = p;
    }    
}

function:判断是否为空

template <typename T>
bool sLinkList<T>::isEmpty()
{
    if(this->head != nullptr)
        return true;
    
    return false;
}

function:取链表长度

template <typename T>
int sLinkList<T>::length()
{
    int len = 0;
    sLinkNode<T> *p = this->head;
    while(p != nullptr){
        len++;
        p = p->next;
    }
    return len;
}

function:遍历链表

template <typename T>
void sLinkList<T>::show()
{
    std::cout<<"The sum of data in the list is: "<<length()<<std::endl;
    std::cout<<"detail:";
    sLinkNode<T> *p = this->head;
    while(p != nullptr){
        std::cout<<p->data<<" ";
        p= p->next;
    }
    std::cout<<std::endl;
}

function:反转链表(只需要修改各节点指向即可)

template <typename T>
void sLinkList<T>::reverse()
{
    if(this->head == nullptr)
        return ;
    
    sLinkNode<T> *p1 = this->head, *p2 = this->head->next, *p3;
    p1->next = nullptr;
    while(p2 != nullptr){
        p3 = p2->next;
        p2->next = p1;
        p1 = p2;
        p2 = p3;    
    }
    this->head = p1;
}

function:获取表头、表尾即pos处节点

template <typename T>
bool sLinkList<T>::GetHeadNode(T &data)
{
    return GetPosNode(data, 0);
}

template <typename T>
bool sLinkList<T>::GetTailNode(T &data)
{
    int len = length();
    return GetPosNode(data, len-1);
}

template <typename T>
bool sLinkList<T>::GetPosNode(T &data, int pos)
{
    if(this->head == nullptr)
        return false;
    
    if(pos < 0)
        return false;
    
    sLinkNode <T> *p = this->head;
    while((p->next!=nullptr) && pos){
        --pos;
        p = p->next;
    }
    
    if(pos != 0)
        return false;
    
    data = p->data;
    return true;
}
 

function:修改表头、表尾或Pos处的值

template <typename T>
bool sLinkList<T>::SetHeadNode(const T &data)
{
    return SetPosNode(data, 0);
}

template <typename T>
bool sLinkList<T>::SetTailNode(const T &data)
{
    int len = length();
    return SetPosNode(data, len-1);
}

template <typename T>
bool sLinkList<T>::SetPosNode(const T &data, int pos)
{
    if(this->head == nullptr)
        return false;
    
    if(pos < 0)
        return false;
    
    sLinkNode <T> *p = this->head;
    while((p->next!=nullptr) && pos){
        --pos;
        p = p->next;
    }
    
    if(pos != 0)
        return false;
    
    p->data = data;

    return true;
}

function:在表头、表尾或pos处插入新节点

template <typename T>
bool sLinkList<T>::InsertHeadNode(const T &data)
{
    return InsertPosNode(data, 0);
}

template <typename T>
bool sLinkList<T>::AppendTailNode(const T &data)
{
    return InsertPosNode(data, length());
}

template <typename T>
bool sLinkList<T>::InsertPosNode(const T &data, int pos)
{

    if(pos < 0)
        return false;
    
    sLinkNode <T> *p1 = new sLinkNode<T>(data);
    
    if(pos == 0){
        p1->next = this->head;
        this->head = p1;
        return true;
    }
    
    sLinkNode <T> *p2 = this->head;
    while((--pos) && (p2->next!=nullptr)){
        p2 = p2->next;
    }
     //if pos != 0, then append the node after the tail
    p1->next = p2->next;
    p2->next = p1;

    return true;
}

function:取出表头、表尾或pos处的节点,并删除表中的节点

template <typename T>
bool sLinkList<T>::PopHeadNode(T &data)
{
    return PopNodePos(data, 0);
}
        
template <typename T>
bool sLinkList<T>::PopTailNode(T &data)
{
    return PopNodePos(data, length()-1);
}

template <typename T>
bool sLinkList<T>::PopNodePos(T &data, int pos)
{
    if(this->head == nullptr)
        return false;
    
    if(pos < 0)
        return false;
    
    sLinkNode <T> *p1 = this->head;
    if(pos == 0){
        data = this->head->data;
        this->head = this->head->next;
        delete p1;
        return true;
    }
    
    sLinkNode <T> *p2 = this->head;
    while((p1->next!=nullptr) && pos){
        --pos;
        p2 = p1;
        p1 = p1->next;    
    }
    
    if(pos != 0){   //if pos != 0, then cannot find the pos value
        return false;
    }
    
    p2->next = p1->next;
    data = p1->data;
    delete p1;
    return true;
}

function:删除表头、表尾或pos处的值

template <typename T>
bool sLinkList<T>::DelHeadNode()
{
    return DelPosNode(0);
}

template <typename T>
bool sLinkList<T>::DelTailNode()
{
    return DelPosNode(length()-1);
}

template <typename T>
bool sLinkList<T>::DelPosNode(int pos)
{
    if(this->head == nullptr)
        return false;
    
    if(pos < 0)
        return false;
    
    sLinkNode <T> *p1 = this->head;
    if(pos == 0){
        this->head = this->head->next;
        delete p1;
        return true;
    }    
    
    sLinkNode <T> *p2 = this->head;
    while((p1->next!=nullptr) && pos){
        --pos;
        p2 = p1;
        p1 = p1->next;    
    }
    
    if(pos != 0){   //if pos != 0, then cannot find the pos value
        return false;
    }
    
    p2->next = p1->next;
    delete p1;
}

其他:如有错误,欢迎大家指正及交流。

源码下载地址(包含测试代码):https://download.csdn.net/download/zhouchao_0321/10674658

猜你喜欢

转载自blog.csdn.net/zhouchao_0321/article/details/82684065