单链表实现

template <class Elem> class Link {
public:
    Elem element;
    Link *next;
    Link(const Elem& elemval, Link* nextval = NULL) {
        element = elemval;
        next = nextval;
    }
    Link(Link* nextval = NULL) { next = nextval; }
};

template <class Elem> class LList: public List<Elem> {
private:
    Link<Elem>* head;
    Link<Elem>* tail;
    Link<Elem>* fence;
    int leftcnt;
    int rightcnt;

    void init() {
        fence = tail = head = new Link<Elem>;
        leftcnt = rightcnt = 0;
    }

    void removeall() {
        while (head != NULL) {
            fence = head;
            head = head->next;
            delete fence;
        }
    }

public:
    LList(int size=DefaultListSize) { init(); }
    ~LList() { removeAll(); }
    void clear() { removeAll(); init(); }
    bool insert(const Elem&);
    bool append(const Elem&);
    bool remove(Elem&);

    void setStart() {
        fence = head;
        rightcnt += leftcnt;
        leftcnt = 0;
    }

    void setEnd() {
        fence = tail;
        leftcnt += rightcnt;
        rightcnt = 0;
    }

    void prev();
    void next() {
        if (fence != tail) {
            fence = fence->next;
            rightcnt--;
            leftcnt++;
        }
    }

    int leftLength() const { return leftcnt; }
    int rightLength() const { return rightcnt; // rightcnt是fence右边的元素个数}

    bool setPos(int pos);
    bool getValue(Elem& it) const {
        if (rightLength() == 0) return false;
        it = fence->next->element; // fence指向的是栅栏左边的最后一个元素
        return true;
    }

    void print() const;
};

template <class Elem>
bool LList<Elem>::insert(const Elem& item) {
    fence->next = new Link<Elem>(item, fence->next);
    if (tail == fence) tail = fence->next;
    rightcnt++;
    return true;
}

template <class Elem>
bool LList<Elem>::append(const Elem& item) {
    tail = tail->next = new Link<Elem>(item, NULL);
    rightcnt++;
    return true;
}


template <class Elem> bool LList<Elem>::remove(Elem& it) {
    if (fence->next == NULL) return false;
    it = fence->next->element;
    Link<Elem>* ltemp = fence->next;
    fence->next = ltemp->next;
    if (tail == ltemp) tail = fence;
    delete ltemp;
    rightcnt--;
    return true;
}

template <class Elem> void LList<Elem>::prev() {
    Link<Elem>* temp = head;
    if (fence == head) return;
    while (temp->next != fence) temp = temp->next;
    fence = temp;
    leftcnt--;
    rightcnt++;
}

template <class Elem> bool LList<Elem>::setPos(int pos) {
    if ((pos < 0) || (pos > rightcnt + leftcnt)) return false;
    fence = head;
    for (int i = 0; i<pos; ++i) fence = fence->next;
    return true;
}

template <class Elem> void LList<Elem>::print() const {
    Link<Elem>* temp = head;
    cout<<"< ";
    while (temp != fence) {
        cout << temp->next->element << " ";
        temp = temp->next;
    }

    cout<< "| ";
    while (temp->next != NULL) {
        cout << temp->next->element << " ";
        temp = temp->next;
    }

    cout << ">\n"; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值