lnlidawei

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

[cpp]:  双向链表的实现

 

 

 

 

一、思路或者原理

 

 

  1、双向链表的实现思路:

    1.1、【链节】:【链节】是【链表】的基本单位;

    1.2、【链表】:由多个【链节】组成一个【链表】。

 

 

  2、【链节】(data class):【链节data】是组成【链表chains】的基本单元,【链节data】用于存储数据。

    2.1、【链节】内的数据成员:从当前【链节data】指向前一个【链节data】的指针(前向指针:point_previous);从当前【链节data】指向后一个【链节data】的指针(后向指针:point_next);数据存储(保存数据)

    2.2、【链节】内的函数成员:【链节data】的赋值;

    2.3、【双向链表】的核心点是【链节】的前后向指针(point_previous/point_next)。

 

 

  3、【双向链表】(chains class):

    3.1、【链表chains】的基本操作:创建【链节data】并赋值;在两个【链节data】之间建立连接关系;删除【链节data】;遍历【链表chains】

    3.2、【链表chains】基本数据对象:first(指向【链表chains】的第一个【链节data】);  last(指向【链表chains】的最后一个【链节data】);

    3.3、(析构函数~chain())删除【链节data】。

 

 

 

 

二、程序代码

  1 #include <iostream>
  2 
  3 
  4 //  unit of chains
  5 class data
  6 {
  7 public:
  8 
  9     data() = delete ;
 10 
 11     ~data()
 12     {
 13         std::cout << "[~data]#\t" << --data::dsize << std::endl ;
 14     }
 15     data(int e):val(e)
 16     {
 17         data::dsize++ ;
 18     }
 19 
 20     //  double chains
 21     data *pre = nullptr;
 22     data *next = nullptr;
 23 
 24     //  element of data
 25     int val = 0;
 26 
 27     //  count numbers of objects of 'data' type
 28     static unsigned int dsize ;
 29 };
 30 
 31 //  initialize count of object of 'data' type
 32 unsigned int data::dsize = 0 ;
 33 
 34 
 35 //  chain_of_data
 36 class chains
 37 {
 38 private:
 39 
 40     //  head pointer of object of chain_data 'type'
 41     data *first = nullptr ;
 42 
 43     //  tail pointer of object of chain_data 'type'
 44     data *last = nullptr ;
 45 
 46 public:
 47 
 48     //  initialize object of 'chains' type.
 49     //  initialize first element of 'data' type.
 50     chains(int e) 
 51     {
 52         if ( first == nullptr  &&  last == nullptr )
 53         {
 54             //  create first node of data type.
 55             data *first_data_node = new data(e) ;
 56 
 57             //  connect[data type]:  first_data_node->pre   to  nullptr. 
 58             first_data_node->pre = nullptr ;
 59 
 60             //  connect[chains type]:  chains_node->first  to  first_data_node. 
 61             first = first_data_node ;
 62 
 63             //  connect[chains type]:  chains_node->last  to  first_data_node. 
 64             last = first_data_node ;
 65         }
 66     }
 67 
 68     ~chains()
 69     {
 70         for ( ; first != nullptr ;   )
 71         {
 72             //  keep address of first_node pointing next node of data type. 
 73             data *keep = first ->next ;
 74 
 75             //  delete first node of data type.
 76             delete first ;
 77             
 78             //  connect[data type]:  first  =  first->next . 
 79             first = keep;
 80             
 81             std::cout << "[~chains]#\t work over. " << std::endl ;
 82         }
 83     }
 84 
 85     //  set element of 'data' type.
 86     void set_chains(int e)
 87     {
 88         if ( first != nullptr  &&  last != nullptr )
 89         {
 90             //  append object of data to the chains
 91 
 92             //  keep last object of data of the chains
 93             data *keep_current = last ;
 94 
 95             //  create new_node of data type;
 96             data *new_node = new data(e) ;
 97 
 98             //  connect[data type]:  last_node->next  to  new node. 
 99             keep_current->next = new_node ;
100 
101             //  connect[data type]:  new_node->pre  to  last. 
102             new_node->pre = keep_current ;
103 
104             //  connect[data type]:  new_node->next  to  nullptr. 
105             new_node->next = nullptr ;
106 
107             //  connect[chains type]:  chain_last  to  new_node. 
108             last = new_node ;
109         }
110     }
111 
112     //  loop chains from begin to end.
113     void loop_front_chains()
114     {
115         data *loop = nullptr ;
116         if ( first != nullptr )
117         {
118             loop = first ;
119             for ( ;  loop != nullptr ;  loop = loop->next )
120             {
121                 std::cout << "[loop_front]#\t" << loop->val << std::endl ;
122             }
123         }
124     }
125 
126     //  loop chains from end to begin.
127     void loop_back_chains()
128     {
129         data *loop = nullptr ;
130         if ( last != nullptr )
131         {
132             loop = last ;
133             for ( ;  loop != nullptr ;  loop = loop->pre )
134             {
135                 std::cout << "[loop_back]#\t" << loop->val << std::endl ;
136             }
137         }
138     }
139 };
140 
141 
142 int main()
143 {
144     chains g(0) ;
145     g.set_chains(1) ;
146     g.set_chains(2) ;
147     g.set_chains(3) ;
148     g.set_chains(4) ;
149     
150     g.loop_front_chains() ;
151     g.loop_back_chains();
152 
153     return 0 ;
154 }

 

 

 

 

三、运行结果

 1 [loop_front]#    0
 2 [loop_front]#    1
 3 [loop_front]#    2
 4 [loop_front]#    3
 5 [loop_front]#    4
 6 [loop_back]#    4
 7 [loop_back]#    3
 8 [loop_back]#    2
 9 [loop_back]#    1
10 [loop_back]#    0
11 [~data]#    4
12 [~chains]#     work over. 
13 [~data]#    3
14 [~chains]#     work over. 
15 [~data]#    2
16 [~chains]#     work over. 
17 [~data]#    1
18 [~chains]#     work over. 
19 [~data]#    0
20 [~chains]#     work over. 

 

 

 

 

四、参考资料:

 

  1、  数据结构、算法与应用(c++语言描述)edition 2  -- {作者:sartaj sahni;译者:王立柱,刘志宏; 出版社:机械工业出版社; 版次:2020.10,第1版第13次印刷 }

 

  2、  g++ prog.cc -Wall -Wextra -I/opt/wandbox/boost-1.83.0-gcc-13.2.0/include -std=gnu++2b

 

 

 

posted on 2024-02-14 09:16  lnlidawei  阅读(26)  评论(0编辑  收藏  举报