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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章