双向链表的C++实现

来源:互联网 发布:老虎为什么数量少 知乎 编辑:程序博客网 时间:2024/06/06 05:05

出处:http://blog.csdn.NET/hongkangwl/article/details/22286469

首先定义节点的结构

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">struct node   
  2. {  
  3.     int date;  
  4.     node* prev;  
  5.     node* next;  
  6. };  
  7. </span>  

老样子,建立双链表的类

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">class doublelink  
  2. {  
  3. public:  
  4.     int doublelink_insert(doublelink* ptr,int position,int member);  
  5.     int doublelink_erase(doublelink* ptr, int position);  
  6.     void doublelink_display(doublelink* ptr, int num);  
  7.     int doublelink_getlength(doublelink* ptr);  
  8.     doublelink()  
  9.     {  
  10.         root = new node;  
  11.         root->prev = NULL;  
  12.         root->next = NULL;  
  13.         length = 0;  
  14.   
  15.     }  
  16. protected:  
  17. private:  
  18.     int length;  
  19.     node* root;  
  20. };</span>  

插入元素

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1.   
[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">int doublelink::doublelink_insert(doublelink *ptr, int position, int member)  
  2. {  
  3.     node* nodeinsert = new node;  
  4.     nodeinsert->date = member;  
  5.     if (ptr->doublelink_getlength(ptr) == 0)  
  6.     {  
  7.         root->next = nodeinsert;  
  8.         nodeinsert->prev = nodeinsert;  
  9.         nodeinsert->next = nodeinsert;  
  10.         ptr->length++;  
  11.         return 0;  
  12.     }   
  13.     else  
  14.     {  
  15.         if (position == 0)  
  16.         {  
  17.             /*  root->next->prev = nodeinsert; 
  18.             nodeinsert->prev = root->next->prev; 
  19.             nodeinsert->next = root->next; 
  20.             root->next->prev = nodeinsert;*/  
  21.             nodeinsert->prev = root->next->prev;  
  22.             nodeinsert->next = root->next;  
  23.             root->next->prev->next = nodeinsert;  
  24.             root->next->prev = nodeinsert;  
  25.             root->next = nodeinsert;  
  26.             ptr->length++;  
  27.             return 0;  
  28.         }   
  29.         else  
  30.         {  
  31.             node* current =  root->next;  
  32.             for (int i = 0; i < position; i++)  
  33.             {  
  34.                 current = current->next;  
  35.             }  
  36.             nodeinsert->next = current;  
  37.             nodeinsert->prev = current->prev;  
  38.             current->prev->next = nodeinsert;  
  39.             //nodeinsert->next = nodeinsert;   
  40.             current->prev = nodeinsert;  
  41.             ptr->length++;  
  42.             return 0;  
  43.         }  
  44.     }  
  45. }</span>  


删除一个元素,注意0位置上的

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">int doublelink::doublelink_erase(doublelink* ptr, int position)  
  2. {  
  3.     if (ptr->doublelink_getlength(ptr) == 0)  
  4.     {  
  5.         cout<<"链表为空,oop!!"<<endl;  
  6.         return 0;  
  7.     }   
  8.     else  
  9.     {  
  10.         if (ptr->doublelink_getlength(ptr) == 1)  
  11.         {  
  12.             ptr->root->next = NULL;  
  13.             ptr->length--;  
  14.         }   
  15.         else  
  16.         {  
  17.             node* deletenode = root->next;  
  18.             for (int i = 0 ; i < position; i++)  
  19.             {  
  20.                 deletenode = deletenode->next;  
  21.             }  
  22.             deletenode->prev->next = deletenode->next;  
  23.             deletenode->next->prev = deletenode->prev;  
  24.             delete deletenode;  
  25.             ptr->length--;  
  26.         }  
  27.     }  
  28. }</span>  

完整实现代码和测试结果

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">#include <iostream>  
  2. using namespace std;  
  3. struct node   
  4. {  
  5.     int date;  
  6.     node* prev;  
  7.     node* next;  
  8. };  
  9.   
  10. class doublelink  
  11. {  
  12. public:  
  13.     int doublelink_insert(doublelink* ptr,int position,int member);  
  14.     int doublelink_erase(doublelink* ptr, int position);  
  15.     void doublelink_display(doublelink* ptr, int num);  
  16.     int doublelink_getlength(doublelink* ptr);  
  17.     doublelink()  
  18.     {  
  19.         root = new node;  
  20.         root->prev = NULL;  
  21.         root->next = NULL;  
  22.         length = 0;  
  23.   
  24.     }  
  25. protected:  
  26. private:  
  27.     int length;  
  28.     node* root;  
  29. };  
  30. int doublelink::doublelink_erase(doublelink* ptr, int position)  
  31. {  
  32.     if (ptr->doublelink_getlength(ptr) == 0)  
  33.     {  
  34.         cout<<"链表为空,oop!!"<<endl;  
  35.         return 0;  
  36.     }   
  37.     else  
  38.     {  
  39.         if (ptr->doublelink_getlength(ptr) == 1)  
  40.         {  
  41.             ptr->root->next = NULL;  
  42.             ptr->length--;  
  43.         }   
  44.         else  
  45.         {  
  46.             node* deletenode = root->next;  
  47.             for (int i = 0 ; i < position; i++)  
  48.             {  
  49.                 deletenode = deletenode->next;  
  50.             }  
  51.             deletenode->prev->next = deletenode->next;  
  52.             deletenode->next->prev = deletenode->prev;  
  53.             delete deletenode;  
  54.             ptr->length--;  
  55.         }  
  56.     }  
  57. }  
  58. void doublelink::doublelink_display(doublelink* ptr, int num)  
  59. {  
  60.     node* current = root->next;  
  61.     for (int i = 0; i < num; i++)  
  62.     {  
  63.         cout<<current->date<<" ";  
  64.         current = current->next;  
  65.     }  
  66.     cout<<endl;  
  67. }  
  68. int doublelink::doublelink_getlength(doublelink* ptr)  
  69. {  
  70.     return ptr->length;  
  71. }  
  72. int doublelink::doublelink_insert(doublelink *ptr, int position, int member)  
  73. {  
  74.     node* nodeinsert = new node;  
  75.     nodeinsert->date = member;  
  76.     if (ptr->doublelink_getlength(ptr) == 0)  
  77.     {  
  78.         root->next = nodeinsert;  
  79.         nodeinsert->prev = nodeinsert;  
  80.         nodeinsert->next = nodeinsert;  
  81.         ptr->length++;  
  82.         return 0;  
  83.     }   
  84.     else  
  85.     {  
  86.         if (position == 0)  
  87.         {  
  88.             /*  root->next->prev = nodeinsert; 
  89.             nodeinsert->prev = root->next->prev; 
  90.             nodeinsert->next = root->next; 
  91.             root->next->prev = nodeinsert;*/  
  92.             nodeinsert->prev = root->next->prev;  
  93.             nodeinsert->next = root->next;  
  94.             root->next->prev->next = nodeinsert;  
  95.             root->next->prev = nodeinsert;  
  96.             root->next = nodeinsert;  
  97.             ptr->length++;  
  98.             return 0;  
  99.         }   
  100.         else  
  101.         {  
  102.             node* current =  root->next;  
  103.             for (int i = 0; i < position; i++)  
  104.             {  
  105.                 current = current->next;  
  106.             }  
  107.             nodeinsert->next = current;  
  108.             nodeinsert->prev = current->prev;  
  109.             current->prev->next = nodeinsert;  
  110.             //nodeinsert->next = nodeinsert;   
  111.             current->prev = nodeinsert;  
  112.             ptr->length++;  
  113.             return 0;  
  114.         }  
  115.     }  
  116. }  
  117.   
  118.   
  119. int main()  
  120. {  
  121.   
  122.     doublelink* doublelink_ptr = new doublelink;  
  123.     for (int i = 0; i < 10; i++)  
  124.     {  
  125.         doublelink_ptr->doublelink_insert(doublelink_ptr,0,i);  
  126.     }  
  127.     doublelink_ptr->doublelink_display(doublelink_ptr,20);  
  128.     doublelink_ptr->doublelink_erase(doublelink_ptr,2);  
  129.     doublelink_ptr->doublelink_display(doublelink_ptr,20);  
  130.     return 0;  
  131. }</span>  

测试正确~~


0 0
原创粉丝点击