双链表

双链表

#include<iostream>

using namespace std;

template<typename T>
struct DblNode
{
    T data;                 //数据域,用来存放数据元素
    DblNode<T>* prior;      //前驱指针
    DblNode<T>* next;       //后继指针
};

template<typename T>
class DblLinkList
{
public:
    DblLinkList();                          //构造函数
    ~DblLinkList(){}                         //析构函数
public:
    bool ListInsert(int i, const T& e);                 //在第i个位置插入指定元素e
    bool ListDelete(int i);                             //删除第i个位置的元素
    bool GetElem(int i, T& e);                          //获得第i个位置的元素值
    int LocateElem(const T& e);                         //按元素值查找其在单链表中第一次出现的位置

    void DispList();                                    //输出双链表中所有元素
    int ListLength();                                   //获取双链表的长度
    bool Empty();                                       //判断双链表是否为空
    void ReverseList();                                 //翻转双链表
    bool InsertPriorNode(DblNode<T>*pcurr, const T& e);   //在pcurr的前面插入一个节点,节点值为e
    bool DeleteNode(DblNode<T>* pdel);
private:
    DblNode<T>* m_head;                                    //头指针(指向链表第一个节点的指针,如果链表有头节点,则指向头结点)
    int m_length;   
};

template<typename T>
DblLinkList<T>::DblLinkList()
{
    m_head = new DblNode<T>;        //先创建一个头结点
    m_head->next = nullptr;         
    m_head->prior = nullptr;
    m_length = 0;
}

template<typename T>
bool DblLinkList<T>::ListInsert(int i, const T& e)
{
    //判断插入位置i是否合法,i的合法值应该是从1到m_length + 1之间
    if(i < 1 || i > (m_length + 1))
    {
        cout << "元素 " << e << " 插入的位置" << i << " 不合适,合法的位置是1到" << m_length + 1 << " 之间" <<endl; 
        return false;
    }
    DblNode<T>* p_curr = m_head;
    
    //for循环用于找到第i - 1 个节点
    for(int j = 0; j < (i - 1); ++j)        //j从0开始,表示p_curr刚开始指向的是第0个节点(头结点)
    {
        p_curr = p_curr->next;              
    }
    DblNode<T> *node = new DblNode<T>;           
    node->data = e;                        
    node->next = p_curr->next;              
    node->prior = p_curr;

    if(p_curr->next != nullptr)
    {
        p_curr->next->prior = node;
    }
    p_curr->next = node;
    cout << "成功在位置为 " << i << " 处插入元素 " << e << endl;
    m_length++;                             //实际表长加一
    return true;          
}

template<typename T>
bool DblLinkList<T>::ListDelete(int i)
{
    if(m_length < 1)
    {
        cout << "当前单链表为空,不能删除任何数据" <<endl;
        return false;
    }

    if(i < 1 || i > m_length)
    {
        cout << "删除位置 " << i << " 不合法,合法的位置是1到 " << m_length <<"之间" <<endl; 
        return false;
    }

    DblNode<T> *p_curr = m_head;
    //for循环用于找到i - 1个节点
    for(int j = 0; j < (i - 1); ++j)    
    {
        p_curr = p_curr->next;          
    }
    DblNode<T> *p_willdel = p_curr->next;  //p_willdel指向带删除的节点
    if(p_willdel->next != nullptr)
        p_willdel->next->prior = p_curr;
    p_curr->next = p_willdel->next;
    cout << "成功删除位置为 " << i << " 的元素,该元素的值为 " << p_willdel->data <<endl;
    m_length--;                         //实际表长-1
    delete p_willdel;
    p_willdel->next = p_willdel->prior = nullptr;
    return true; 
}
template<typename T>
void DblLinkList<T>::DispList()
{
    DblNode<T> *p = m_head->next;
    while(p != nullptr)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

template<typename T>
bool DblLinkList<T>::GetElem(int i, T& e)
{
    if(m_length < 1)
    {
        cout << "当前单链表为空,不能获取任何数据" <<endl;
        return false;
    }

    if(i < 1 || i > m_length)
    {
        cout << "获取位置 " << i << " 不合法,合法的位置是1到 " << m_length <<"之间" <<endl; 
        return false;
    }
    DblNode<T>* p_curr = m_head;
    for(int j = 0; j < i; ++j)
    {
        p_curr = p_curr->next;
    }
    e = p_curr->data;
    cout << "成功获取 " << i << " 的元素,该元素的值为 " << e << endl;
    return true;
}

template<typename T>
int DblLinkList<T>::LocateElem(const T& e)
{
    DblNode<T>* p_curr = m_head;
    for(int i = 1; i <= m_length; ++i) 
    {
        if((p_curr->next->data) == e)
        {
            cout << "值为 " << e << " 的元素在单链表中第一次出现的位置为 " << i <<endl;
            return i;
        }
        p_curr = p_curr->next;
    }
    cout << "值为 " << e << " 的元素在单链表中没有找到  " << endl;
    return -1;              //返回-1表示查找失败
}
int main()
{
    DblLinkList<int> DBobj;
    DBobj.ListInsert(1,1);
    DBobj.ListInsert(1,2);
    DBobj.ListInsert(1,3);
    DBobj.DispList();
    DBobj.ListDelete(1);
    DBobj.DispList();
    return 0;
}

 

posted @ 2022-07-24 20:45  huahuati  阅读(50)  评论(0)    收藏  举报