双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
由于双向链表可以方便地实现正序和逆序两个方向的插入、查找等功能,在很多算法中经常被使用,
这里用C++构造了一个双向链表,提供了对双向链表的插入、查找、删除节点、排序等功能,其中排序提供了插入排序和冒泡排序两种方式
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
|
#include<iostream>
using namespace std;
class Node //组成双向链表的节点
{
public :
int data;
Node * pNext;
Node * pLast;
};
class List //构造一个双向链表
{
private :
Node * pHead;
Node * pTail;
int length;
public :
List( int length) //创建双向链表
{
this ->length=length;
pHead= new Node();
pHead->pLast=NULL;
pTail=pHead;
for ( int i=0;i<length;i++)
{
Node * temp= new Node();
cout<< "please enter the no" <<i+1<< " Node's data:" ;
cin>>temp->data;
temp->pNext=NULL;
temp->pLast=pTail;
pTail->pNext=temp;
pTail=temp;
}
}
void traverseList() //正向遍历
{
Node * p=pHead->pNext;
while (p!=NULL)
{
cout<<p->data<<endl;
p=p->pNext;
}
}
void traverseListReturn() //逆向遍历
{
Node * p=pTail;
while (p->pLast!=NULL)
{
cout<<p->data<<endl;
p=p->pLast;
}
}
void sortList() //冒泡排序
{
Node * p= new Node();
Node * q= new Node();
int temp;
for (p=pHead->pNext;p->pNext!=NULL;p=p->pNext)
{
for (q=p->pNext;q!=NULL;q=q->pNext)
{
if (q->data<p->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
}
void sortListByInsertWay() //插入排序
{
if (pHead->pNext==NULL||pHead->pNext->pNext==NULL)
{
return ;
}
Node * p2=pHead->pNext->pNext;
Node * p1=pHead;
pHead->pNext->pNext=NULL;
while (p2)
{
Node * pN=p2->pNext;
while (p1->pNext)
{
if (p2->data<p1->pNext->data)
{
p2->pNext=p1->pNext;
p2->pLast=p1;
p1->pNext->pLast=p2;
p1->pNext=p2;
break ;
}
p1=p1->pNext;
}
if (p1->pNext==NULL)
{
p2->pNext=NULL;
p2->pLast=p1;
p1->pNext=p2;
}
p2=pN;
}
//重新查找pTail的位置
Node * pt=pHead;
while (pt->pNext)
{
pt=pt->pNext;
}
pTail=pt;
}
void changeList( int num, int position) //修改链表中指定位置的节点
{
Node * p=pHead->pNext;
if (position>length||position<=0)
{
cout<< "over stack !" <<endl;
return ;
}
for ( int i=0;i<position-1;i++)
{
p=p->pNext;
}
p->data=num;
}
void insertList( int num, int position) //插入数据
{
Node * p=pHead->pNext;
if (position>length||position<=0)
{
cout<< "over stack !" <<endl;
return ;
}
for ( int i=0;i<position-1;i++)
{
p=p->pNext;
}
Node * temp= new Node();
temp->data=num;
temp->pNext=p;
temp->pLast=p->pLast;
p->pLast->pNext=temp;
p->pLast=temp;
length++;
}
void clearList() //清空
{
Node * q;
Node * p=pHead->pNext;
while (p!=NULL)
{
q=p;
p=p->pNext;
delete q;
}
p=NULL;
q=NULL;
}
void deleteList( int position) //删除指定位置的节点
{
Node * p=pHead->pNext;
if (position>length||position<=0)
{
cout<< "over stack !" <<endl;
return ;
}
for ( int i=0;i<position-1;i++)
{
p=p->pNext;
}
p->pLast->pNext=p->pNext;
p->pNext->pLast=p->pLast;
delete p;
length--;
}
int getItemInList( int position) //查找指定位置的节点
{
Node * p=pHead->pNext;
if (position>length||position<=0)
{
cout<< "over stack !" <<endl;
return 0;
}
for ( int i=0;i<position-1;i++)
{
p=p->pNext;
}
return p->data;
}
~List()
{
Node * q;
Node * p=pHead->pNext;
while (p!=NULL)
{
q=p;
p=p->pNext;
delete q;
}
p=NULL;
q=NULL;
}
};
int main()
{
List l(3);
l.traverseList();
cout<< "AFTER SORT------------------------------------------------------" <<endl;
// l.sortList(); //冒泡排序
l.sortListByInsertWay(); //插入排序
l.traverseList();
cout<< "AFTER INSERT-----------------------------------------------------" <<endl;
l.insertList(55,1);
l.traverseList();
cout<< "AFTER DELETE-----------------------------------------------------" <<endl;
l.deleteList(1);
l.traverseList();
cout<< "Return Traverse---------------------------------------------" <<endl;
l.traverseListReturn();
cout<< "Find the Second Node's data:" <<l.getItemInList(2)<<endl;
return 0;
}
|
相关文章
猜你喜欢
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-29 99
-
Linux服务器建站:选择合适的Linux发行版有哪些考量?
2025-06-05 93 -
2025-06-04 64
-
2025-05-25 57
-
2025-05-29 56
热门评论