C++类模板实现双链表

/********************************线性表抽象类的定义***************************/
template <class dataType>
class list{
    public:
      virtual void empty()=0;   //清空线性表
      virtual int getLength()=0;   //求表的长度
      virtual void insert(int i,const dataType& x)=0;   //在表中第i个位置插入值为x的元素
      virtual void remove(int i)=0; //删除表中第i个位置的元素
      virtual int search(const dataType& x)=0;  //查找并返回值为x的元素在表中的位置
      virtual dataType visit(int i)=0;  //访问表中第i个元素的值
      virtual void traverse()=0;    //遍历线性表
};

/*******************************双链表类的定义********************************/
template <class dataType>
class dLinkList:public list<dataType>{  //公有继承自list类
    public:
        dLinkList();  //构造函数,创建对象时生成空链表
        void empty(); //清空链表(除头尾节点以外)
        int getLength(); //求链表的长度
        void insert(int i,const dataType& x); //在表中第i个位置插入值为x的元素
        void remove(int i);   //删除表中第i个节点
        int search(const dataType& x);    //查找并返回值为x的元素在表中的位置
        dataType visit(int i);    //访问表中第i个元素的值
        void traverse();  //将表中的元素逐一输出
        ~dLinkList(); //析构函数
    private:
        //定义节点
        struct node{
            dataType data;  //节点中保存的数据
            node* prior;    //节点的前驱
            node* next; //节点的后继
            node():prior(NULL),next(NULL){};    //构造函数
            node(dataType d):data(d),prior(NULL),next(NULL){};  //构造函数
        };

        node* head; //链表头
        node* tail; //链表尾
        int currentLength;    //链表长度
};

/*********************************双链表类的实现******************************/
template <class dataType>
dLinkList<dataType>::dLinkList(){
    head=new node;
    tail=new node;
    head->prior=NULL,head->next=tail;
    tail->prior=head;
    currentLength=0;

    cout<<"\nCreate list success!\n";
}

template <class dataType>
void dLinkList<dataType>::empty(){
    node* nowPos=head->next;
    while(nowPos!=tail){
        node* tmp=nowPos;
        nowPos=nowPos->next;
        delete tmp;
    }
    head->next=tail;
    tail->prior=head;
    currentLength=0;

    cout<<"\nEmpty list success!\n";
}

template <class dataType>
int dLinkList<dataType>::getLength(){
    return currentLength;
}

template <class dataType>
void dLinkList<dataType>::insert(int i,const dataType& x){
    if(i<0||i>currentLength){
        cout<<"\nThe index is out of range!\n";
        return;
    }

    node* add=new node(x);
    if(i==0){
        add->next=head->next,head->next->prior=add;
        add->prior=head,head->next=add;
    }
    else{
        //找到第i-1个节点
        node* nowPos=head->next;
        while(--i){
            nowPos=nowPos->next;
        }

        add->prior=nowPos,add->next=nowPos->next;
        nowPos->next->prior=add,nowPos->next=add;
    }
    ++currentLength;

    cout<<"\nInsert data success!\n";
}

template <class dataType>
void dLinkList<dataType>::remove(int i){
    if(i<0||i>=currentLength){
        cout<<"\nThe index is out of range!\n";
        return;
    }

    //找到第i个节点
    node* nowPos=head->next;
    while(i--){
        nowPos=nowPos->next;
    }

    nowPos->prior->next=nowPos->next;
    nowPos->next->prior=nowPos->prior;
    delete nowPos;
    --currentLength;

    cout<<"\nDelete data success!\n";
}

template <class dataType>
int dLinkList<dataType>::search(const dataType& x){
    node* nowPos=head;
    int i;
    for(i=0;i<currentLength;++i){
        nowPos=nowPos->next;
        if(nowPos->data==x) break;
    }
    if(i==currentLength) return -1;
    return i;
}

template <class dataType>
dataType dLinkList<dataType>::visit(int i){
    //i越界时抛出异常值0
    if(i<0||i>=currentLength){
        throw 0;
    }

    //找到第i个节点
    node* nowPos=head->next;
    while(i--){
        nowPos=nowPos->next;
    }

    return nowPos->data;
}

template <class dataType>
void dLinkList<dataType>::traverse(){
    if(currentLength==0){
        cout<<"\nThe list is empty!\n";
        return;
    }

    node* nowPos=head->next;
    cout<<nowPos->data;
    nowPos=nowPos->next;
    while(nowPos!=tail){
        cout<<" "<<nowPos->data;
        nowPos=nowPos->next;
    }
    cout<<endl;
}

template <class dataType>
dLinkList<dataType>::~dLinkList(){
    empty();
    delete head;
    delete tail;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值