c++双链表类模板

#pragma once

#include <iostream>
#include <string>

using namespace std;

template<typename T> class DblList;
template<typename T> class DblNode {
    T info;
    DblNode<T> *llink, *rlink;
public:
    DblNode(T data);
    DblNode();
    T Getinfo() { return info; }

    friend class DblList<T>;
};

template<typename T> DblNode<T>::DblNode() {
    llink = rlink = NULL;
}

template<typename T> DblNode<T>::DblNode(T data) {
    info = data;
    llink = rlink = NULL;
}

template<typename T> class DblList {
    DblNode<T> *head, *current;
public:
    DblList();
    ~DblList();
    void Insert(const T &data);
    DblNode<T> *Remove(DblNode<T> *p);
    void Print();
    int Length();
    DblNode<T> *Find(T data);
    void MakeEmpty();
};

template<typename T> DblList<T>::DblList() {
    head = new DblNode<T>();
    head->rlink = head->llink = head;
    current = NULL;
}

template<typename T> DblList<T>::~DblList() {
    MakeEmpty();
    delete head;
}

template<typename T> void DblList<T>::MakeEmpty() {
    DblNode<T> *tempP;
    while (head->rlink != head) {
        tempP = head->rlink;
        head->rlink = tempP->rlink;
        tempP->rlink->llink = head;
        delete tempP;
    }
    current = NULL;
}

template<typename T> void DblList<T>::Insert(const T &data) {
    current = new DblNode<T>(data);
    current->rlink = head;
    current->llink = head->llink;
    head->llink->rlink = current;
    head->llink = current;
}

template<typename T> DblNode<T> *DblList<T>::Remove(DblNode<T> *p) {
    current = head->rlink;
    while (current != head && current != p)
        current = current->rlink;
    if (current == head)
        current = NULL;
    else {
        p->rlink->llink = p->llink;
        p->llink->rlink = p->rlink;
        p->llink = p->rlink = NULL;
    }

    return current;
}

template<typename T> DblNode<T> *DblList<T>::Find(T data) {
    current = head->rlink;
    while (current != head && current->info != data)
        current = current->rlink;
    if (current == head)
        current = NULL;
    return current;
}

template<typename T> void DblList<T>::Print() {
    current = head->rlink;
    while (current != head) {
        cout << current->info << '\t';
        current = current->rlink;
    }
    cout << endl;
}

template<typename T> int DblList<T>::Length() {
    int count = 0;
    current = head->rlink;
    while (current != head) {
        count++;
        current = current->rlink;
    }
    return count;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值