现在的位置: 首页 > 综合 > 正文

数据结构–带头尾结点的双链表

2013年04月13日 ⁄ 综合 ⁄ 共 3470字 ⁄ 字号 评论关闭

最近要考数据结构了,哎,这么大了还考试,真烦。既然自己干这行的,数据结构又是那么基础和必要的东西,所以决定把一些数据结构用C++重写一遍,也算是加深学习吧。

说实话,真是没怎么写过这么基础的数据结构,如果有什么缺陷请大家多多提意见。日后还会继续写其他的

今天,给List加入了迭代器,可能会在今后的使用中更通用化

 

 

  1#pragma once;
  2template<typename T>
  3struct mynode
  4{
  5    mynode()
  6        :pNext(NULL),
  7        pPrior(NULL){}
  8
  9    T data;
 10    mynode<T> * pNext;    
 11    mynode<T> * pPrior;
 12}
;
 13
 14template<typename T>
 15class mylist
 16{
 17public:
 18    struct Iterator
 19    {
 20        explicit Iterator(mynode<T>* p)
 21            :m_pCurrent(p)
 22        {}
 23        
 24
 25        Iterator& operator ++()
 26        {
 27            m_pCurrent = m_pCurrent->pNext;
 28            return *this;
 29        }

 30
 31        Iterator operator ++(int)
 32        {
 33            mynode<T>* p = m_pCurrent;
 34            m_pCurrent = m_pCurrent->pNext;
 35            return Iterator(p);
 36        }

 37
 38        Iterator& operator --()
 39        {
 40            m_pCurrent = m_pCurrent->pPrior;
 41            return *this;
 42        }

 43
 44        Iterator operator --(int)
 45        {
 46            mynode<T>* p = m_pCurrent;
 47            m_pCurrent = m_pCurrent->pPrior;
 48            return Iterator(p);
 49        }

 50
 51        bool operator == (const Iterator& it)
 52        {
 53            return m_pCurrent == it.m_pCurrent;
 54        }

 55
 56        bool operator != (const Iterator& it)
 57        {
 58            return !(*this == it);
 59        }

 60
 61        T& operator*()
 62        {
 63            return m_pCurrent->data;
 64        }

 65
 66        bool hasNext()
 67        {
 68            return m_pCurrent!= NULL && m_pCurrent->pNext != NULL;
 69        }

 70        friend class mylist;
 71    private:
 72        mynode<T>* m_pCurrent;
 73        Iterator(){};
 74    }
;    
 75    mylist()
 76    {
 77        m_pHead = new mynode<T>();
 78        m_pTail = new mynode<T>();
 79        
 80        m_pHead->pNext = m_pTail;
 81        m_pTail->pPrior = m_pHead;
 82        
 83    }

 84
 85    ~mylist()
 86    {
 87        _Destory();
 88    }

 89
 90    //向尾部插入新节点
 91    void push_back(const T & data)
 92    {
 93        _insert(m_pTail->pPrior, data);
 94    }

 95
 96
 97
 98    Iterator insert(Iterator pWhere, const T& data)
 99    {
100        if(!isNode(pWhere.m_pCurrent))
101        {
102            return Iterator(NULL);
103        }

104
105        return Iterator(_insert(pWhere.m_pCurrent, data));
106    }

107
108    //向任意位置之后插入新节点
109    
110    //删除指定位置的节点
111    bool remove(Iterator iWhere)
112    {
113        mynode<T>* pWhere = iWhere.m_pCurrent;
114        if(pWhere == NULL)
115        {
116            return false;
117        }

118
119        if(empty())
120        {
121            return false;
122        }

123
124        if(isHead(pWhere) || isTail(pWhere))
125        {
126            return false;
127        }

128        
129
130        if(!isNode(pWhere))
131        {
132            return false;
133        }

134
135        pWhere->pPrior->pNext = pWhere->pNext;
136        pWhere->pNext->pPrior = pWhere->pPrior;
137        
138
139
140        delete pWhere;
141
142        return true;
143    }

144
145    Iterator begin()
146    {
147        return Iterator(m_pHead->pNext);
148    }

149
150    Iterator end()
151    {
152        return Iterator(m_pTail);
153    }

154    
155
156    //查找指定数据在链表中的位置
157    Iterator find(const T &data)
158    {
159        if(empty())
160        {
161            return Iterator(m_pTail);
162        }

163
164        mynode<T>* p = m_pHead->pNext;
165
166        while(!isTail(p))
167        {
168            if(p->data ==

抱歉!评论已关闭.