使用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

目录
相关文章
【链表】还不会用C++实现链表?一文教会你各种链表的实现
【链表】还不会用C++实现链表?一文教会你各种链表的实现
597 0
|
12月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
241 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
588 5
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
260 1
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
297 2
|
算法 C++
c++算法学习笔记 (13) 链表
c++算法学习笔记 (13) 链表
|
C++ Python
UE C++ 链表
UE C++ 链表
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
|
C语言 C++
【c++】用c++实现带头双向循环链表
【c++】用c++实现带头双向循环链表
172 1
|
存储 算法 C++
【数据结构】链表—C/C++实现
【数据结构】链表—C/C++实现
534 1