只提供常量阶接口的双链表类模板

来源:互联网 发布:背单词软件 免费 编辑:程序博客网 时间:2024/06/03 20:28

测试双链表所有接口的测试程序

// testcase.cpp : Defines the entry point for the console application.//#include <stdlib.h>#include <stdio.h>#include "LsDoublyLinkedList.h"void fnTestDbList(); ///< 测试CLsDoublyLinkedList<T>双链表的所有接口int main(int argc, char* argv[]){    fnTestDbList();    return 0;}void fnTestDbList(){    int i = 0;    int iTmp = 0;    CLsDoublyLinkedList<int> list;    CLsDoublyLinkedNode<int>* pNode = NULL;    CLsDoublyLinkedNode<int>* pNodeToDel = NULL;        for (i = 1; i < 10; i++)    {        pNode = list.addTail(i);        list.setAt(pNode, 100 + i);        iTmp = list.getAt(pNode);                   pNode = list.addHead(i + 200);        list.setAt(pNode, 100 + i);        iTmp = list.getAt(pNode);                if (0 == (i % 2))        {            pNodeToDel = pNode;            list.insert(pNode, 300 + i);        }    }        list.removeAt(pNodeToDel);    list.removeHead();    list.removeTail();        printf("[%d]\n", list.getLength());    pNode = list.getHead();    while(NULL != pNode)    {        printf("%d ", pNode->m_Elem);        pNode = pNode->m_pNext;    }        printf("\r\n");    pNode = list.getTail();    while(NULL != pNode)    {        printf("%d ", pNode->m_Elem);        pNode = pNode->m_pPrev;    }        printf("\r\n"); }


类模板定义与实现

// LsDoublyLinkedList.h: interface for the CLsDoublyLinkedList class.////////////////////////////////////////////////////////////////////////#if !defined(LSDOUBLYLINKEDLIST_H_82FEA8FE_F7B8_4CD7_A162_751580726632)#define LSDOUBLYLINKEDLIST_H_82FEA8FE_F7B8_4CD7_A162_751580726632#include <assert.h>#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/// ----------------------------------------------------------------------/// CLsDoublyLinkedNode 定义/// ----------------------------------------------------------------------/// LsDoublyLinkedList's Nodetemplate <typename T>struct CLsDoublyLinkedNode{    CLsDoublyLinkedNode(T Elem);    ~CLsDoublyLinkedNode();        T m_Elem; //数据元素    CLsDoublyLinkedNode<T>* m_pPrev; //前驱    CLsDoublyLinkedNode<T>* m_pNext; //后继};/// ----------------------------------------------------------------------/// CLsDoublyLinkedList 双链表 定义/// ----------------------------------------------------------------------template <typename T>class CLsDoublyLinkedList  {public:    CLsDoublyLinkedList();    virtual ~CLsDoublyLinkedList();    /// 只提供O(1)的接口^_^    CLsDoublyLinkedNode<T>* getTail() const;    CLsDoublyLinkedNode<T>* getHead() const;    inline bool isEmpty() const;    inline size_t getLength() const;  //表长    void clear();    CLsDoublyLinkedNode<T>* addTail(T newElem);    bool removeTail();    CLsDoublyLinkedNode<T>* addHead(T newElem);    bool removeHead();    T getAt(CLsDoublyLinkedNode<T>* pNode) const;    void setAt(CLsDoublyLinkedNode<T>* pNode, T newElem);    bool removeAt(CLsDoublyLinkedNode<T>* pNode);    bool insert(CLsDoublyLinkedNode<T>* pNode, T newElem);private:    CLsDoublyLinkedNode<T>* m_pHead;  //头结点    CLsDoublyLinkedNode<T>* m_pTail;  //尾结点    size_t m_nLength;};/// ----------------------------------------------------------------------/// CLsDoublyLinkedNode 实现/// ----------------------------------------------------------------------template <typename T>CLsDoublyLinkedNode<T>::CLsDoublyLinkedNode(T Elem):m_Elem(Elem),m_pNext(NULL),m_pPrev(NULL){}template <typename T>CLsDoublyLinkedNode<T>::~CLsDoublyLinkedNode(){}/// ----------------------------------------------------------------------/// CLsDoublyLinkedList 实现/// ----------------------------------------------------------------------template <typename T>inline size_t CLsDoublyLinkedList<T>::getLength() const{    return m_nLength;}template <typename T>inline bool  CLsDoublyLinkedList<T>::isEmpty() const{    return (NULL == m_pHead) ? true : false;}template <typename T>CLsDoublyLinkedList<T>::CLsDoublyLinkedList():m_pHead(NULL),m_pTail(NULL),m_nLength(0){}template <typename T>CLsDoublyLinkedList<T>::~CLsDoublyLinkedList(){    clear();}template <typename T>void CLsDoublyLinkedList<T>::clear(){    while (!isEmpty())    {        removeTail();    }}template <typename T>T CLsDoublyLinkedList<T>::getAt(CLsDoublyLinkedNode<T>* pNode) const{    T Rc = (T)0;    if (NULL != pNode)    {        return pNode->m_Elem;    }    return Rc;}template <typename T>void CLsDoublyLinkedList<T>::setAt(CLsDoublyLinkedNode<T>* pNode, T newElem){    if (NULL != pNode)    {        pNode->m_Elem = newElem;    }}template <typename T>bool CLsDoublyLinkedList<T>::insert(CLsDoublyLinkedNode<T>* pNode, T newElem){    CLsDoublyLinkedNode<T>* pNewNode = NULL;    CLsDoublyLinkedNode<T>* pPrev = NULL;    CLsDoublyLinkedNode<T>* pNext = NULL;    pPrev = pNode;    if (NULL == pPrev)    {        return false;    }    pNewNode = new CLsDoublyLinkedNode<T>(newElem);    pNext = pPrev->m_pNext;        /*    1 2 3 [6] 4 5    3.next = 6    4.prev = 6    6.prev = 3    6.next = 4          1 2 3 4 5 [6]    */    pPrev->m_pNext = pNewNode;    if (NULL != pNext)    {        pNext->m_pPrev = pNewNode;    }    pNewNode->m_pPrev = pPrev;    pNewNode->m_pNext = pNext;    m_nLength++;    return true;}template <typename T>bool CLsDoublyLinkedList<T>::removeTail(){    bool bRc = false;    CLsDoublyLinkedNode<T>* pPrev = NULL;    if (NULL == m_pHead)    {        return false;    }        //1 2 [3]    if (NULL != m_pTail)    {        pPrev = m_pTail->m_pPrev;        if (NULL != pPrev)        {            pPrev->m_pNext = NULL;        }        else        {            m_pHead = NULL;        }                delete m_pTail;        bRc = true;        m_pTail = pPrev;        m_nLength--;    }    return bRc;}template <typename T>bool CLsDoublyLinkedList<T>::removeHead(){    if (NULL == m_pHead)    {        return false;    }        //[1] 2 3    CLsDoublyLinkedNode<T>* pNext = m_pHead->m_pNext;    if (NULL != pNext)    {        pNext->m_pPrev = NULL;    }    else    {        m_pTail = NULL;    }        delete m_pHead;    m_nLength--;    m_pHead = pNext;    return true;}template <typename T>bool CLsDoublyLinkedList<T>::removeAt(CLsDoublyLinkedNode<T>* pNode){    CLsDoublyLinkedNode<T>* pDelNode = pNode;    CLsDoublyLinkedNode<T>* pPrev = NULL;    CLsDoublyLinkedNode<T>* pNext = NULL;    if ((NULL == m_pHead)         || (NULL == pDelNode))    {        return false;    }        /*    1 2 [3] 4 5     2.next = 4    4.prev = 2          [1] 2 3 4 5               1 2 3 4 [5]                  [1]    */    pPrev = pDelNode->m_pPrev;    pNext = pDelNode->m_pNext;    if (NULL != pPrev)    {        pPrev->m_pNext = pNext;    }    else    {        m_pHead = pNext;    }        if (NULL != pNext)    {        pNext->m_pPrev = pPrev;    }    else    {        m_pTail = pPrev;    }        delete pDelNode;    m_nLength--;        return true;}template <typename T>CLsDoublyLinkedNode<T>* CLsDoublyLinkedList<T>::addTail(T newElem){    CLsDoublyLinkedNode<T>* pNewNode = new CLsDoublyLinkedNode<T>(newElem);        //空表    if (NULL == m_pHead)    {        m_pHead = m_pTail = pNewNode;    }    else     {        //1 2 3 4 5 [6]        //5.next = 6    6.prev = 5  tail = 6        m_pTail->m_pNext = pNewNode;        pNewNode->m_pPrev = m_pTail;        m_pTail = pNewNode;    }    m_nLength++;    return pNewNode;}template <typename T>CLsDoublyLinkedNode<T>* CLsDoublyLinkedList<T>::addHead(T newElem){    CLsDoublyLinkedNode<T> *pNewNode = new CLsDoublyLinkedNode<T>(newElem);        //空表    if (NULL == m_pHead)    {        m_pHead = m_pTail = pNewNode;    }    else     {        //[6] 1 2 3 4 5         //1.prev = 6    6.next = 1  head = 6        m_pHead->m_pPrev = pNewNode;        pNewNode->m_pNext = m_pHead;        m_pHead = pNewNode;    }    m_nLength++;    return pNewNode;}template <typename T>CLsDoublyLinkedNode<T>* CLsDoublyLinkedList<T>::getTail() const{    return m_pTail;}template <typename T>CLsDoublyLinkedNode<T>* CLsDoublyLinkedList<T>::getHead() const{    return m_pHead;}#endif // !defined(LSDOUBLYLINKEDLIST_H_82FEA8FE_F7B8_4CD7_A162_751580726632)




0 0
原创粉丝点击