使用C++实现的双向链表

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/44682325 不多说,直接上代码。
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/44682325

不多说,直接上代码。

注意:其中的Exception类请参考我的博客《使用C++实现的单向循环链表》。

#ifndef DDCHAIN_H
#define DDCHAIN_H

#include "Exception.h"
#include 

template
class DDChain;

template
class DDChainNode{
    friend class DDChain;
private:
    T data;
    DDChainNode* left;
    DDChainNode* right;
};

template
class DDChain{
public:
    DDChain(){leftEnd = rightEnd = 0;}
    ~DDChain();
    int Length() const;
    bool isEmpty();
    bool Find(int k,T& x) const;
    int Search(const T&  x);
    DDChain& Delete(int k,T& x);
    DDChain& Insert(int k,const T& x);
    void print();
private:
    DDChainNode* leftEnd;
    DDChainNode* rightEnd;
};

template
DDChain::~DDChain()
{
   DDChainNode* current = leftEnd;

   while(current){
       leftEnd = leftEnd->right;
       delete current;
       current = leftEnd;
   }

  leftEnd = rightEnd = 0;
}

template
bool DDChain::isEmpty()
{
    return ((leftEnd == rightEnd) && (leftEnd == 0));
}

template
int DDChain::Length() const
{
    DDChainNode* current = leftEnd;

    int index = 0;
    while(current){
        index++;
        current = current->right;
    }

    return index;
}

template
bool DDChain::Find(int k, T &x) const
{
    if(k < 1)
        throw OutOfBounds();

    DDChainNode* current = leftEnd;

    for(int i = 1;i < k && current;i++){
        current = current->right;
    }

    if(!current)
        return false;

    x = current->data;
    return true;
}

template
int DDChain::Search(const T &x)
{
    DDChainNode* current = leftEnd;
    int index = 1;

    while(current && (current->data != x)){
        index++;
        current = current->right;
    }

    if(current)
        return index;
    else
        return -1;
}

template
DDChain& DDChain::Delete(int k, T &x)
{
    if(k < 1)
        throw OutOfBounds();

   DDChainNode* current = leftEnd;
   DDChainNode *p = current->left;
   DDChainNode  *q = current->right;

   for(int i = 1;i < k && current;i++){
        p = current;
        current = current->right;
        q = current->right;
   }

   if(!current)
       throw OutOfBounds();

   if(p == 0 && q == 0){
       x = current->data;
       delete current;
       leftEnd = rightEnd = 0;

       return *this;
   }

   if(p == 0 && q != 0){
       leftEnd = leftEnd->right;

       x = current->data;

       delete current;

       return *this;
   }

   if(q == 0 && p != 0){
       rightEnd = rightEnd->left;

       x = current->data;
       delete current;

       return *this;
   }

   p->right = current->right;
   q->left = current->left;

   x = current->data;
   delete current;

   return *this;
}

template
DDChain& DDChain::Insert(int k, const T &x)
{
    if(k < 0)
        throw OutOfBounds();

    DDChainNode* temp = new DDChainNode();
    temp->data = x;

    if((leftEnd == rightEnd) && (leftEnd == 0)){
        std::cout << "insert" << std::endl;

        leftEnd = rightEnd = temp;
        leftEnd->left = 0;
        leftEnd->right = 0;

        return *this;
    }

    if(k == 0){
        temp->left = 0;
        temp->right = leftEnd;

        leftEnd = temp;

        return *this;
    }

    DDChainNode* current = leftEnd;
    DDChainNode* p = current->right;

    for(int i = 1;i < k && current;i++){
        current = current->right;
        p = current->right;
    }

    if(!current)
        throw OutOfBounds();

    if(current && !p){
        rightEnd->right = temp;
        temp->left = rightEnd;
        temp->right = 0;

        rightEnd = temp;

        return *this;
    }

    current->right = temp;
    temp->right = p;
    temp->left = current;
    p->left = temp;

    return *this;

}

template
void DDChain::print()
{
    DDChainNode* current = leftEnd;

    while(current){
        std::cout << current->data << " ";
        current = current->right;
    }

    std::cout << std::endl;
}

#endif // DDCHAIN_H

目录
相关文章
|
6月前
|
C++
【链表】还不会用C++实现链表?一文教会你各种链表的实现
【链表】还不会用C++实现链表?一文教会你各种链表的实现
264 0
|
4月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
5月前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
|
6月前
|
算法 C++
c++算法学习笔记 (13) 链表
c++算法学习笔记 (13) 链表
|
5月前
|
C++ Python
UE C++ 链表
UE C++ 链表
|
5月前
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
59 0
|
6月前
|
C语言 C++
【c++】用c++实现带头双向循环链表
【c++】用c++实现带头双向循环链表
|
6月前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
112 0
|
6月前
|
存储 算法 C语言
【C/C++ 链表结构】探索链表迭代器:C++实现的深入分析与优化策略
【C/C++ 链表结构】探索链表迭代器:C++实现的深入分析与优化策略
134 0
|
6月前
|
存储 算法 程序员
深入理解 C++ 自定义链表中实现迭代器
深入理解 C++ 自定义链表中实现迭代器
88 0