数据结构双向链表C++实现

#include <iostream>
#include <stdexcept>
using namespace std;
template<class ElemType>
class dblist
{
public:
    dblist();               //构造函数
    ~dblist();              //析构函数
    bool insert(int pos, ElemType e); //在pos位置插入e,插入成功返回true。否则返回false
    bool del(int pos, ElemType &e);   //在pos位置删除元素,用e返回
    bool del(int pos);   //在pos位置删除元素,用e返回
    bool empty() const;               //判断链表是否为空
    int  length() const;              //返回链表的长度
    ElemType& operator[] (int index) throw(out_of_range);//返回index位置的值
private:
    class dbnode           //结点类型
    {
    public:
        dbnode() {}
        dbnode(ElemType elem, dbnode *pre, dbnode *nex) : data(elem), prev(pre), next(nex){}    //构造函数
        ElemType data;          //结点数据
        dbnode *prev;           //前驱结点
        dbnode *next;           //后继结点
    };
    dbnode *head;           //定义一个头结点
    int len;             //链表的长度
};
template<class ElemType>
dblist<ElemType>::dblist() : len(0)
{
    head = new dbnode();
    head -> prev = head;
    head -> next = head;
}
template<class ElemType>
dblist<ElemType>::~dblist()
{
    head -> prev -> next = NULL; //断开循环链表的链接。
    dbnode *p;
 while(head -> next)
    {
        p = head -> next;
        head -> next = head -> next -> next;
        delete p;
    }
    delete head;
}
template<class ElemType>
bool dblist<ElemType>::insert(int pos, ElemType e)
{
    if(pos < 0 || pos > len)
        return false;
    dbnode *temp = head;
    for(int i = 0; i < pos; ++i)
        temp = temp -> next;
    dbnode *new_node = new dbnode(e, temp, temp -> next);
    new_node -> prev -> next = new_node;
    new_node -> next -> prev = new_node;
    ++len;
    return true;
}
template<class ElemType>
bool dblist<ElemType>::del(int pos, ElemType &e)
{
    if(pos < 0 || pos >= len)
        return false;
    dbnode *temp = head;
    for(int i = 0; i <= pos; ++i)
        temp = temp -> next;
    temp -> prev -> next = temp -> next;
    temp -> next -> prev = temp -> prev;
    e = temp -> data;
    delete temp;
    --len;
    return true;
}
template<class ElemType>
bool dblist<ElemType>::del(int pos)
{
    ElemType e;
    del(pos, e);
}
template<class ElemType>
bool dblist<ElemType>::empty() const
{
    return len == 0;
}
template<class ElemType>
int  dblist<ElemType>::length() const
{
    return len;
}
template<class ElemType>
ElemType& dblist<ElemType>::operator[] (int index) throw(out_of_range)
{
    if(index < 0 || index >= len)
        throw out_of_range("out of range");
    dbnode *temp = head;
    for(int i = 0; i <= index; ++i)
        temp = temp -> next;
    return temp -> data;
}
int main()
{
    return 0;
}

转载于:https://my.oschina.net/u/196018/blog/383772

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值