C++数据结构与STL--双向循环链表(实现自定义iterator类)

本文详细解析了双向循环链表的节点类、迭代器类及双向循环链表类的核心代码实现,包括节点结构、迭代器操作和双向循环链表的基本操作方法。通过实例演示了如何使用双向循环链表进行数据存储和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双向循环链表核心代码图解:

















节点类


#ifndef node_H
#define node_H

template<typename T>
class node
{
public:
node<T> *pre;
 //上一节点指针
node<T> *next;//下一节点指针
T val;

node():val(T()),pre(nullptr),next(nullptr){}
node(T v):val(v),pre(nullptr),next(nullptr){}
};


#endif




迭代器类


#ifndef my_iterator_H
#define my_iterator_H
#include"node.h"

class my_iterator
{
   friend class dLinkList<T>;
   
    private:
    node<T> *it;
    my_iterator(node<T> *pt):it(pt){}
//设为私有,不允许用户调用 
   
   public:
   my_iterator()=default;


  
my_iterator& operator++()//前置++ 
{
it=it->next;
return *this;
}  

my_iterator& operator--() //前置-- 
{
it=it->pre;
return *this;
}  

my_iterator operator++(int)//后置++ 
{
my_iterator tem(*this);
it=it->next;
return tem;
}  

my_iterator operator--(int)  //后置-- 
{
my_iterator tem(*this);
it=it->pre;
return tem;


bool operator==(const my_iterator& other)//重载== 
{
return it==other.it;
}   

bool operator!=( const my_iterator& other)//重载!= 
{
return it!=other.it;
}  

T operator*()
{
return it->val;
}  
   
};




#endif




双向循环链表类


#ifndef dLinkList_H
#define dLinkList_H
#include"node.h"
#include<iostream>
using namespace std;

template<typename T>
class dLinkList
{
private:
node<T> *head;  
//头节点
size_t length; //链表长度
void dInsert(node<T> *curr,T val)  //插入的辅助函数,把新节点插入curr前 
{
node<T>* tem=new node<T>(val);
node<T>* preNode=curr->pre;
preNode->next=tem;
tem->pre=preNode;
tem->next=curr;
curr->pre=tem; 


void dDelete(node<T> *curr)//删除的辅助函数,删除curr节点 
{
node<T> *preNode=curr->pre;
preNode->next=curr->next;
curr->next->pre=preNode;
delete curr; 
}
public:
   #include"my_iterator.h"     //使迭代器成为内部类

dLinkList():length(0) //初始化链表 
{
head=new node<T>;
head->next=head;
head->pre=head;
}


void push_back(T val) //尾插法
{

dInsert(head,val);
length++;


void push_front(T val)  //前插法
{

dInsert(head->next,val);
length++;




my_iterator begin()  //返回第一个节点(头节点的下一个节点)的迭代器 
{
return my_iterator(head->next);
}
 
my_iterator end()
{
return my_iterator(head);//返回尾节点的下一个节点(头结点)迭代器
}

void insert(my_iterator it,T val)//在迭代器it的位置插入一节点
{

dInsert(it.it,val);

               length++;

          }

 
void erase(my_iterator it)  //在删除迭代器it的位置的节点
{

dDelete(it.it);

                 length--;

}
 
~dLinkList()//清空链表,释放内存 
  {
  node<T> *tem=head->next;
  node<T> *p;
while(tem!=head)
{
   p=tem;
  
tem=tem->next;
delete p;
}
delete head; //删除头节点

 
  }
};  


  
#endif



测试代码:
#include<iostream>
#include"dLinkList.h" 
#include<algorithm>




int main()
{


dLinkList<int> dll;
dll.push_front(1);
dll.push_front(0);
dll.push_back(2);
dll.push_back(3);
    
    for(int x: dll)
{
cout<<x<<ends;
//0 1 2 3
}

cout<<endl;

    dLinkList<int>::my_iterator it=dll.begin();
dll.insert(it,-1);//在第一个元素前插入-1
it=dll.end();
it--;

dll.erase(it);//删除最后一个元素

for(int x: dll)
{
cout<<x<<ends;//-1 0 1 2
}


return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值