[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
本文由 lnlidawei 原创、整理、转载,本文来自于【博客园】; 整理和转载的文章的版权归属于【原创作者】; 转载或引用时请【保留文章的来源信息】:https://www.cnblogs.com/lnlidawei/p/18015045