zoukankan      html  css  js  c++  java
  • 双向链表的实现——c++

    c++实现双向链表 :

      1 #ifndef DOUBLE_LINK_HXX
      2 #define DOUBLE_LINK_HXX
      3 
      4 #include <iostream>
      5 using namespace std;
      6 
      7 template<class T> 
      8 struct DNode 
      9 {
     10     public:
     11         T value;
     12         DNode *prev;
     13         DNode *next;
     14     public:
     15         DNode() { }
     16         DNode(T t, DNode *prev, DNode *next) {
     17             this->value = t;
     18             this->prev  = prev;
     19             this->next  = next;
     20            }
     21 };
     22 
     23 template<class T> 
     24 class DoubleLink 
     25 {
     26     public:
     27         DoubleLink();
     28         ~DoubleLink();
     29 
     30         int size();
     31         int is_empty();
     32 
     33         T get(int index);
     34         T get_first();
     35         T get_last();
     36 
     37         int insert(int index, T t);
     38         int insert_first(T t);
     39         int append_last(T t);
     40 
     41         int del(int index);
     42         int delete_first();
     43         int delete_last();
     44 
     45     private:
     46         int count;
     47         DNode<T> *phead;
     48     private:
     49         DNode<T> *get_node(int index);
     50 };
     51 
     52 template<class T>
     53 DoubleLink<T>::DoubleLink() : count(0)
     54 {
     55     // 创建“表头”。注意:表头没有存储数据!
     56     phead = new DNode<T>();
     57     phead->prev = phead->next = phead;
     58     // 设置链表计数为0
     59     //count = 0;
     60 }
     61 
     62 // 析构函数
     63 template<class T>
     64 DoubleLink<T>::~DoubleLink() 
     65 {
     66     // 删除所有的节点
     67     DNode<T>* ptmp;
     68     DNode<T>* pnode = phead->next;
     69     while (pnode != phead)
     70     {
     71         ptmp = pnode;
     72         pnode=pnode->next;
     73         delete ptmp;
     74     }
     75 
     76     // 删除"表头"
     77     delete phead;
     78     phead = NULL;
     79 }
     80 
     81 // 返回节点数目
     82 template<class T>
     83 int DoubleLink<T>::size() 
     84 {
     85     return count;
     86 }
     87 
     88 // 返回链表是否为空
     89 template<class T>
     90 int DoubleLink<T>::is_empty() 
     91 {
     92     return count==0;
     93 }
     94 
     95 // 获取第index位置的节点
     96 template<class T>
     97 DNode<T>* DoubleLink<T>::get_node(int index) 
     98 {
     99     // 判断参数有效性
    100     if (index<0 || index>=count)
    101     {
    102         cout << "get node failed! the index in out of bound!" << endl;
    103         return NULL;
    104     }
    105 
    106     // 正向查找
    107     if (index <= count/2)
    108     {
    109         int i=0;
    110         DNode<T>* pindex = phead->next;
    111         while (i++ < index) {
    112             pindex = pindex->next;
    113         }
    114 
    115         return pindex;
    116     }
    117 
    118     // 反向查找
    119     int j=0;
    120     int rindex = count - index -1;
    121     DNode<T>* prindex = phead->prev;
    122     while (j++ < rindex) {
    123         prindex = prindex->prev;
    124     }
    125 
    126     return prindex;
    127 }
    128 
    129 // 获取第index位置的节点的值
    130 template<class T>
    131 T DoubleLink<T>::get(int index) 
    132 {
    133     return get_node(index)->value;
    134 }
    135 
    136 // 获取第1个节点的值
    137 template<class T>
    138 T DoubleLink<T>::get_first() 
    139 {
    140     return get_node(0)->value;
    141 }
    142 
    143 // 获取最后一个节点的值
    144 template<class T>
    145 T DoubleLink<T>::get_last() 
    146 {
    147     return get_node(count-1)->value;
    148 }
    149 
    150 // 将节点插入到第index位置之前
    151 template<class T>
    152 int DoubleLink<T>::insert(int index, T t) 
    153 {
    154     if (index == 0)
    155         return insert_first(t);
    156 
    157     DNode<T>* pindex = get_node(index);
    158     DNode<T>* pnode  = new DNode<T>(t, pindex->prev, pindex);
    159     pindex->prev->next = pnode;
    160     pindex->prev = pnode;
    161     count++;
    162 
    163     return 0;
    164 }
    165 
    166 // 将节点插入第一个节点处。
    167 template<class T>
    168 int DoubleLink<T>::insert_first(T t) 
    169 {
    170     DNode<T>* pnode  = new DNode<T>(t, phead, phead->next);
    171     phead->next->prev = pnode;
    172     phead->next = pnode;
    173     count++;
    174 
    175     return 0;
    176 }
    177 
    178 // 将节点追加到链表的末尾
    179 template<class T>
    180 int DoubleLink<T>::append_last(T t) 
    181 {
    182     DNode<T>* pnode = new DNode<T>(t, phead->prev, phead);
    183     phead->prev->next = pnode;
    184     phead->prev = pnode;
    185     count++;
    186 
    187     return 0;
    188 }
    189 
    190 // 删除index位置的节点
    191 template<class T>
    192 int DoubleLink<T>::del(int index) 
    193 {
    194     DNode<T>* pindex = get_node(index);
    195     pindex->next->prev = pindex->prev;
    196     pindex->prev->next = pindex->next;
    197     delete pindex;
    198     count--;
    199 
    200     return 0;
    201 }
    202 
    203 // 删除第一个节点
    204 template<class T>
    205 int DoubleLink<T>::delete_first() 
    206 {
    207     return del(0);
    208 }
    209 
    210 // 删除最后一个节点
    211 template<class T>
    212 int DoubleLink<T>::delete_last() 
    213 {
    214     return del(count-1);
    215 }
    216 
    217 #endif
    View Code

    本文来自http://www.cnblogs.com/skywang12345/p/3561803.html 

  • 相关阅读:
    l1-013
    将博客搬至CSDN
    Educational Codeforces Round 25
    大组合数取余模板【Lucas定理】
    Exams(二分求左界+贪心)
    Cutting (暴力 + 滚动哈希判字符串匹配)
    Cubes(DFS+剪枝)
    Codeforces Round #409 (Div. 2)
    【复习挖坑】dp + 图
    n & n-1 和 n & -n
  • 原文地址:https://www.cnblogs.com/msymm/p/9750800.html
Copyright © 2011-2022 走看看