关于双向链表的增删改查和排序的C++实现

2025-05-27 0 67

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表

由于双向链表可以方便地实现正序和逆序两个方向的插入、查找等功能,在很多算法中经常被使用,

这里用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;

}

以上这篇关于双向链表的增删改查和排序C++实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持快网idc。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 关于双向链表的增删改查和排序的C++实现 https://www.kuaiidc.com/74438.html

相关文章

发表评论
暂无评论