zoukankan      html  css  js  c++  java
  • 数据结构(C++)之Double Linked List实践

      1 //double linked list (type int),the position starts from 0
      2 #include <iostream>
      3 using namespace std;
      4 
      5 //Class Node
      6 class Node
      7 {
      8 public:
      9     Node();
     10     Node(int val);
     11     ~Node();
     12 
     13     void setVal(int val);
     14     int getVal();
     15 
     16     Node* prior;   //指向前节点指针
     17     Node* next;   //指向后节点指针
     18 
     19 private:
     20     int val = 0;
     21 };
     22 
     23 Node::Node()
     24 {
     25 }
     26 
     27 Node::Node(int val)
     28 {
     29     this->val = val;
     30     prior = next = nullptr;
     31 }
     32 
     33 Node::~Node()
     34 {
     35 }
     36 
     37 void Node::setVal(int val)
     38 {
     39     this->val = val;
     40 }
     41 
     42 int Node::getVal()
     43 {
     44     return this->val;
     45 }
     46 
     47 //Class DoubleLinkedList
     48 class DLlist
     49 {
     50 public:
     51 
     52     DLlist(int size);
     53     ~DLlist();
     54 
     55     int getSize();
     56 
     57     void insert(int num, int pos);   //在两节点间插入,插入位置的前后节点必须都存在
     58 
     59     void deleteList(int pos);   //删除节点,删除位置的前后节点必须都存在
     60 
     61     void addFirst(int element);     //pushFront
     62 
     63     void addLast(int element);   //pushBack
     64 
     65     int removeFirst();
     66 
     67     int removeLast();
     68 
     69     int returnNth(int pos);
     70 
     71     bool isEmpty();
     72 
     73     void printList();
     74 
     75 
     76     void Clear();
     77 
     78 private:
     79     int size = 0;
     80     Node* head;  //指向头节点的指针
     81     Node* tail;     //指向尾节点的指针
     82 
     83     Node* GetPointer(int pos);   //查找节点
     84 
     85 };
     86 
     87 DLlist::DLlist(int size)
     88 {
     89     this->size = size;
     90     head = new Node;
     91     head->prior = nullptr;
     92     head->next = nullptr;
     93     tail = head;
     94     for (int i = 0; i < this->size; i++)
     95     {
     96         int v;
     97         cout << "Enter the value of No. " << i + 1 << " Node: ";
     98         cin >> v;
     99         if (i == 0)
    100         {
    101             head->setVal(v);
    102         }
    103         else
    104         {
    105             Node* temp = new Node;
    106             temp->setVal(v);
    107             temp->next = nullptr;
    108             temp->prior = tail;
    109             tail->next = temp;
    110             tail = temp;
    111         }
    112     }
    113 }
    114 
    115 DLlist::~DLlist()
    116 {
    117     Clear();
    118 }
    119 
    120 int DLlist::getSize()
    121 {
    122     return this->size;
    123 }
    124 
    125 void DLlist::insert(int num, int pos)
    126 {
    127     Node* temp = new Node;
    128     Node* position;
    129     temp->setVal(num);
    130     position = GetPointer(pos);
    131     (position->prior)->next = temp;
    132     temp->next = position;
    133     temp->prior = position->prior;
    134     position->prior = temp;
    135     size++;
    136 }
    137 
    138 void DLlist::deleteList(int pos)
    139 {
    140     Node* position;
    141     position = GetPointer(pos);
    142     (position->prior)->next = position->next;
    143     (position->next)->prior = position->prior;
    144     delete position;
    145     size--;
    146 }
    147 
    148 void DLlist::addFirst(int element)
    149 {
    150     if (head == nullptr)
    151     {
    152         head->setVal(element);
    153         head->prior = nullptr;
    154         head->next = nullptr;
    155         tail = head;
    156         size++;
    157     }
    158     else
    159     {
    160         /*我们要在头结点前再插入一个结点,需要先创建一个新的结点,将头结点的值保存在新节点,然后让新节点的下
    161         个结点指向头结点的下一个结点,再让新节点的prior指向头结点,这样就将新节点与原来的链表融合了,然后我
    162         们将头结点的数据换成element即可*/
    163 
    164         Node* temp = new Node;
    165         temp->setVal(head->getVal());
    166         temp->next = head->next;
    167         temp->prior = head;
    168         if (size > 1)
    169         {
    170             (head->next)->prior = temp;
    171         }
    172         head->next = temp;
    173         head->setVal(element);
    174         size++;
    175     }
    176 }
    177 
    178 void DLlist::addLast(int element)
    179 {
    180     if (head == nullptr)
    181     {
    182         head->setVal(element);
    183         head->prior = nullptr;
    184         head->next = nullptr;
    185         tail = head;
    186         size++;
    187     }
    188     else
    189     {
    190         Node* temp = new Node;
    191         temp->setVal(tail->getVal());
    192         temp->prior = tail->prior;
    193         temp->next = tail;
    194         if (size - 1 != 0)
    195         {
    196             (tail->prior)->next = temp;
    197         }
    198         tail->prior = temp;
    199         tail->setVal(element);
    200         size++;
    201     }
    202 }
    203 
    204 int DLlist::removeFirst()
    205 {
    206     int v = head->getVal();
    207 
    208     head = head->next;
    209     if (size > 1)
    210     {
    211         head->prior = nullptr;
    212     }
    213 
    214     size--;
    215     return v;
    216 }
    217 
    218 int DLlist::removeLast()
    219 {
    220     int v = tail->getVal();
    221 
    222     tail = tail->prior;
    223     if (size>1)
    224     {
    225         tail->next = nullptr;
    226     }
    227 
    228     size--;
    229     return v;
    230 }
    231 
    232 int DLlist::returnNth(int pos)
    233 {
    234     return GetPointer(pos)->getVal();
    235 }
    236 
    237 bool DLlist::isEmpty()
    238 {
    239     if (size == 0)
    240     {
    241         return true;
    242     }
    243     else
    244     {
    245         return false;
    246     }
    247 }
    248 
    249 void DLlist::printList()
    250 {
    251     for (int i = 0; i < size; i++)
    252     {
    253         cout << "No. " << i + 1 << " = " << GetPointer(i)->getVal() << endl;
    254     }
    255 }
    256 
    257 void DLlist::Clear()
    258 {
    259     while (head != nullptr)
    260     {
    261         Node * temp = head->next;
    262         delete head;
    263         head = temp;
    264     }
    265     tail = nullptr;
    266     size = 0;
    267 }
    268 
    269 Node* DLlist::GetPointer(int pos)
    270 {
    271     Node* pNode = nullptr;
    272     if (pos<0 || pos>size - 1)
    273     {
    274         cout << "Out of range! " << endl;
    275         return nullptr;
    276     }
    277     else
    278     {
    279         pNode = head;
    280         for (int i = 0; i < pos; i++)
    281         {
    282             pNode = pNode->next;
    283         }
    284         return pNode;
    285     }
    286 }
    287 
    288 int main()
    289 {
    290     DLlist d(3);
    291     cout << endl;
    292     cout << "Size: " << d.getSize() << endl;
    293     d.printList();
    294     cout << endl;
    295 
    296     cout << "Insert 10 at position 1" << endl;
    297     d.insert(10, 1);
    298     cout << "Size: " << d.getSize() << endl;
    299     d.printList();
    300 
    301     cout << endl;
    302     cout << "Addfirst 100" << endl;
    303     d.addFirst(100);
    304     cout << "Now No.1's value= " << d.returnNth(0) << endl;
    305     d.printList();
    306 
    307     cout << endl;
    308     cout << "Remove last" << endl;
    309     d.removeLast();
    310     d.printList();
    311 
    312     cout << endl;
    313     cout << "Remove first" << endl;
    314     d.removeFirst();
    315     d.printList();
    316 
    317     cout << endl;
    318     d.Clear();
    319     cout << "Use Clear()" << endl;
    320     cout << "isEmpty: " << boolalpha << d.isEmpty() << endl;
    321 
    322     system("pause");
    323     return 0;
    324 }

    取消int类型,加入模板

      1 //double linked list ,the position starts from 0
      2 #include <iostream>
      3 #include <iomanip>
      4 using namespace std;
      5 
      6 //Class Node
      7 template <typename T>
      8 class Node
      9 {
     10 public:
     11     Node();
     12     Node(T val);
     13     ~Node();
     14 
     15     void setVal(T val);
     16     T getVal();
     17 
     18     Node* prior;   //指向前节点指针
     19     Node* next;   //指向后节点指针
     20 
     21 private:
     22     T val ;
     23 };
     24 
     25 template<typename T>
     26 Node<T>::Node()
     27 {
     28     this->val = T();
     29 }
     30 
     31 template<typename T>
     32 Node<T>::Node(T val)
     33 {
     34     this->val = val;
     35     prior = next = nullptr;
     36 }
     37 
     38 
     39 template<typename T>
     40 Node<T>::~Node()
     41 {
     42 }
     43 
     44 
     45 template<typename T>
     46 void Node<T>::setVal(T val)
     47 {
     48     this->val = val;
     49 }
     50 
     51 template<typename T>
     52 T Node<T>::getVal()
     53 {
     54     return this->val;
     55 }
     56 
     57 //Class DoubleLinkedList
     58 template<typename T>
     59 class DLlist
     60 {
     61 public:
     62 
     63     DLlist(int size);
     64     ~DLlist();
     65 
     66     int getSize();
     67 
     68     void insert(T num, int pos);   //在两节点间插入,插入位置的前后节点必须都存在
     69 
     70     void deleteList(int pos);   //删除节点,删除位置的前后节点必须都存在
     71 
     72     void addFirst(T element);     //pushFront
     73 
     74     void addLast(T element);   //pushBack
     75 
     76     T removeFirst();
     77 
     78     T removeLast();
     79 
     80     T returnNth(int pos);
     81 
     82     bool isEmpty();
     83 
     84     void printList();
     85 
     86 
     87     void Clear();
     88 
     89 private:
     90     int size = 0;
     91     Node<T>* head;  //指向头节点的指针
     92     Node<T>* tail;     //指向尾节点的指针
     93 
     94     Node<T>* GetPointer(int pos);   //查找节点
     95 
     96 };
     97 
     98 template<typename T>
     99 DLlist<T>::DLlist(int size)
    100 {
    101     this->size = size;
    102     head = new Node<T>;
    103     head->prior = nullptr;
    104     head->next = nullptr;
    105     tail = head;
    106     for (int i = 0; i < this->size; i++)
    107     {
    108         T v;
    109         cout << "Enter the value of No. " << i + 1 << " Node: ";
    110         cin >> v;
    111         if (i == 0)
    112         {
    113             head->setVal(v);
    114         }
    115         else
    116         {
    117             Node<T>* temp = new Node<T>;
    118             temp->setVal(v);
    119             temp->next = nullptr;
    120             temp->prior = tail;
    121             tail->next = temp;
    122             tail = temp;
    123         }
    124     }
    125 }
    126 
    127 template<typename T>
    128 DLlist<T>::~DLlist()
    129 {
    130     Clear();
    131 }
    132 
    133 template<typename T>
    134 int DLlist<T>::getSize()
    135 {
    136     return this->size;
    137 }
    138 
    139 template<typename T>
    140 void DLlist<T>::insert(T num, int pos)
    141 {
    142     Node<T>* temp = new Node<T>;
    143     Node<T>* position;
    144     temp->setVal(num);
    145     position = GetPointer(pos);
    146     (position->prior)->next = temp;
    147     temp->next = position;
    148     temp->prior = position->prior;
    149     position->prior = temp;
    150     size++;
    151 }
    152 
    153 template<typename T>
    154 void DLlist<T>::deleteList(int pos)
    155 {
    156     Node<T>* position;
    157     position = GetPointer(pos);
    158     (position->prior)->next = position->next;
    159     (position->next)->prior = position->prior;
    160     delete position;
    161     size--;
    162 }
    163 
    164 template<typename T>
    165 void DLlist<T>::addFirst(T element)
    166 {
    167     if (head == nullptr)
    168     {
    169         head->setVal(element);
    170         head->prior = nullptr;
    171         head->next = nullptr;
    172         tail = head;
    173         size++;
    174     }
    175     else
    176     {
    177         /*我们要在头结点前再插入一个结点,需要先创建一个新的结点,将头结点的值保存在新节点,然后让新节点的下
    178         个结点指向头结点的下一个结点,再让新节点的prior指向头结点,这样就将新节点与原来的链表融合了,然后我
    179         们将头结点的数据换成element即可*/
    180 
    181         Node<T>* temp = new Node<T>;
    182         temp->setVal(head->getVal());
    183         temp->next = head->next;
    184         temp->prior = head;
    185         if (size > 1)
    186         {
    187             (head->next)->prior = temp;
    188         }
    189         head->next = temp;
    190         head->setVal(element);
    191         size++;
    192     }
    193 }
    194 
    195 template<typename T>
    196 void DLlist<T>::addLast(T element)
    197 {
    198     if (head == nullptr)
    199     {
    200         head->setVal(element);
    201         head->prior = nullptr;
    202         head->next = nullptr;
    203         tail = head;
    204         size++;
    205     }
    206     else
    207     {
    208         Node<T>* temp = new Node<T>;
    209         temp->setVal(tail->getVal());
    210         temp->prior = tail->prior;
    211         temp->next = tail;
    212         if (size - 1 != 0)
    213         {
    214             (tail->prior)->next = temp;
    215         }
    216         tail->prior = temp;
    217         tail->setVal(element);
    218         size++;
    219     }
    220 }
    221 
    222 template<typename T>
    223 T DLlist<T>::removeFirst()
    224 {
    225     T v = head->getVal();
    226 
    227     head = head->next;
    228     if (size > 1)
    229     {
    230         head->prior = nullptr;
    231     }
    232 
    233     size--;
    234     return v;
    235 }
    236 
    237 template<typename T>
    238 T DLlist<T>::removeLast()
    239 {
    240     T v = tail->getVal();
    241 
    242     tail = tail->prior;
    243     if (size>1)
    244     {
    245         tail->next = nullptr;
    246     }
    247 
    248     size--;
    249     return v;
    250 }
    251 
    252 template<typename T>
    253 T DLlist<T>::returnNth(int pos)
    254 {
    255     return GetPointer(pos)->getVal();
    256 }
    257 
    258 template<typename T>
    259 bool DLlist<T>::isEmpty()
    260 {
    261     if (size == 0)
    262     {
    263         return true;
    264     }
    265     else
    266     {
    267         return false;
    268     }
    269 }
    270 
    271 template<typename T>
    272 void DLlist<T>::printList()
    273 {
    274     for (int i = 0; i < size; i++)
    275     {
    276         cout << "No. " << i + 1 << " = " <<setiosflags(ios::fixed)<<setprecision(2)<<GetPointer(i)->getVal() << endl;
    277     }
    278 }
    279 
    280 template<typename T>
    281 void DLlist<T>::Clear()
    282 {
    283     while (head != nullptr)
    284     {
    285         Node<T>* temp = head->next;
    286         delete head;
    287         head = temp;
    288     }
    289     tail = nullptr;
    290     size = 0;
    291 }
    292 
    293 template<typename T>
    294 Node<T>* DLlist<T>::GetPointer(int pos)
    295 {
    296     Node<T>* pNode = nullptr;
    297     if (pos<0 || pos>size - 1)
    298     {
    299         cout << "Out of range! " << endl;
    300         return nullptr;
    301     }
    302     else
    303     {
    304         pNode = head;
    305         for (int i = 0; i < pos; i++)
    306         {
    307             pNode = pNode->next;
    308         }
    309         return pNode;
    310     }
    311 }
    312 
    313 int main()
    314 {
    315     DLlist<double> d(3);
    316     cout << endl;
    317     cout << "Size: " << d.getSize() << endl;
    318     d.printList();
    319     cout << endl;
    320 
    321     cout << "Insert 10.0 at position 1" << endl;
    322     d.insert(10.0, 1);
    323     cout << "Size: " << d.getSize() << endl;
    324     d.printList();
    325 
    326     cout << endl;
    327     cout << "Addfirst 100.0" << endl;
    328     d.addFirst(100.0);
    329     cout << "Now No.1's value= " << d.returnNth(0) << endl;
    330     d.printList();
    331 
    332     cout << endl;
    333     cout << "Remove last" << endl;
    334     d.removeLast();
    335     d.printList();
    336 
    337     cout << endl;
    338     cout << "Remove first" << endl;
    339     d.removeFirst();
    340     d.printList();
    341 
    342     cout << endl;
    343     d.Clear();
    344     cout << "Use Clear()" << endl;
    345     cout << "isEmpty: " << boolalpha << d.isEmpty() << endl;
    346 
    347     system("pause");
    348     return 0;
    349 }
  • 相关阅读:
    Python if语句
    Pyhton数据类型总结
    Flask系列之自定义中间件
    Flask系列之蓝图中使用动态URL前缀
    python+Nginx+uWSGI使用说明
    python之threading.local
    python之偏函数
    Flask系列之源码分析(一)
    Python扩展之类的魔术方法
    Flask系列(十一)整合Flask中的目录结构(sqlalchemy-utils)
  • 原文地址:https://www.cnblogs.com/0Nullptr/p/6622673.html
Copyright © 2011-2022 走看看