- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++实现双向链表(List)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
list是C++容器类中的“顺序存储结构”所包含的一种结构。list是非连续存储结构,具有双链表结构,支持前向/后向遍历,且支持高效的随机删除/插入.
实现代码如下:
**list.h** 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#pragma once
#include<stdio.h>
#include<assert.h>
#include<iostream>
using
namespace
std;
typedef
int
DataType;
struct
ListNode
{
ListNode* _next;
ListNode* _prev;
DataType _data;
ListNode(DataType x)
:_data(x)
, _next(NULL)
, _prev(NULL)
{}
};
|
**test.cpp** 。
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
|
#define _CRT_SECURE_NO_WARNINGS 1
#include "list.h"
class
List{
typedef
ListNode Node;
public
:
List()
:_head(
new
Node(DataType())){
_head->_next = _head;
_head->_prev = _head;
}
List(
const
List& l)
:_head(
new
Node(DataType())){
_head->_next = _head;
_head->_prev = _head;
Node* cur = l._head->_next;
while
(cur!=l._head){
PushBack(cur->_data);
cur = cur->_next;
}
}
List& operator=(
const
List& l){
if
(
this
!= &l){
//swap(_head, l._head);
}
return
*
this
;
}
~List(){
Node* cur = _head->_next;
while
(cur != _head){
Node* next= cur->_next;
delete
cur;
cur = next;
}
delete
_head;
_head = NULL;
}
void
PushBack(DataType x){
Node* prev = _head->_prev;
Node* new_node =
new
Node(x);
prev->_next = new_node;
new_node->_prev = prev;
_head->_prev = new_node;
new_node->_next = _head;
}
void
PushFront(DataType x){
//插在头结点之后
Node* cur = _head->_next;
Node* new_node =
new
Node(x);
new_node->_next = cur;
cur->_prev = new_node;
new_node->_prev = _head;
_head->_next = new_node;
}
void
PopBack(){
Node* delete_node = _head->_prev;
Node* cur = delete_node->_prev;
_head->_prev = cur;
cur->_next = _head;
delete
delete_node;
}
void
PopFront(){
Node* delete_node = _head->_next;
Node* cur = delete_node->_next;
_head->_next = cur;
cur->_prev = _head;
delete
delete_node;
}
Node* Find(DataType x){
Node* to_find = _head->_next;
while
(to_find != _head){
if
(to_find->_data == x){
return
to_find;
}
to_find = to_find->_next;
}
return
NULL;
}
void
Insert(Node* pos, DataType x){
//在pos位置前插入数据
assert
(pos);
Node* new_node =
new
Node(x);
Node* prev = pos->_prev;
new_node->_next = pos;
pos->_prev = new_node;
new_node->_prev = prev;
prev->_next = new_node;
}
void
Erase(Node* pos){
assert
(pos);
Node* prev = pos->_prev;
Node* next = pos->_next;
prev->_next = next;
next->_prev = prev;
delete
pos;
}
void
Print()
const
{
Node* cur = _head->_next;
cout <<
" _head->"
;
while
(cur!= _head){
cout << cur->_data <<
"->"
;
cur = cur->_next;
}
cout << endl;
Node* pos = _head->_prev;
while
(pos != _head){
cout << pos->_data <<
"<-"
;
pos = pos->_prev;
}
cout <<
"_head"
<< endl;
}
private
:
Node* _head;
};
void
TestList(){
List L;
L.PushBack(1);
L.PushBack(2);
L.PushBack(4);
L.PushBack(5);
L.PopBack();
L.Print();
ListNode* pos = L.Find(1);
printf
(
"pos->data:%d[%p]\n"
,pos->_data,pos);
pos = L.Find(2);
printf
(
"pos->data:%d[%p]\n"
, pos->_data, pos);
pos = L.Find(4);
printf
(
"pos->data:%d[%p]\n"
, pos->_data, pos);
printf
(
"\n"
);
L.Insert(pos, 3);
L.Print();
L.Erase(pos);
L.Print();
printf
(
"\n"
);
List L1;
L1.PushFront(4);
L1.PushFront(3);
L1.PushFront(2);
L1.PushFront(1);
L1.Print();
L1.PopFront();
L1.Print();
}
int
main(){
TestList();
return
0;
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://blog.csdn.net/getitstarted/article/details/80302142 。
最后此篇关于C++实现双向链表(List)的文章就讲到这里了,如果你想了解更多关于C++实现双向链表(List)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有 2 个类:User 和 UserPicture,它们具有 1:1 关系。 public class User { @Id @GeneratedValue(strategy=G
使用ssh转发时,我无法针对远程服务器使用cvs和ftp进行提交。是否可以让服务器对我的机器发起请求-我希望服务器上的Web应用程序调用我的机器上的REST方法。 谢谢。 尼古拉·G。 最佳答案 是的
我正在 Python 2.7.12 中实现双向 A* 算法,并在 Russell 和 Norvig 第 3 章的罗马尼亚 map 上进行测试。边具有权重,目的是找到两个节点之间的最短路径。 这是测试图
您能否建议一种映射或类似的数据结构,让我们可以轻松地相互获取值和键。也就是说,每个都可以用来寻找另一个。 最佳答案 Java 在其标准库中没有双向映射。 例如使用 BiMap 来自Google Gua
我想同步两个数据库运行时 服务器 A:安装了公共(public) IP 和 mysql 的 Amazon ec2。服务器B:这是局域网中带有mysql的私有(private)机器。 (IP是私有(pr
保存双向@OneToOne 映射时,hibernate 是否应该在两个表上都记录? 我有一个包含 applicant_id 列的表 interview,它引用了包含字段 interview_id 的
我喜欢新的 SwipeRefreshLayout!它看起来很棒,而且非常容易使用。但我想在两个方向上使用它。我有一个消息屏幕,我想通过从上到下滑动来加载旧消息,我想通过从下到上滑动来加载新消息。 这个
使用 ICS 4.0.1(愿意升级到 4.0.3)(不会 root 和重写 android 操作系统) 在接收到 android beam 后,是否可以将 NDEF 消息发送回 android 手机
我想知道处理这种 git 场景的最佳方法: Git 仓库:CoreProduct Git repo b: SpecificCustomerProduct 是从 a fork 出来的 到目前为止,我们一
这个问题在这里已经有了答案: How to implement an efficient bidirectional hash table? (8 个回答) 关闭2年前。 我在 python 中做这个
您能否推荐一种 map 或类似的数据结构,我们可以在其中轻松地从彼此获取值和键。也就是说,每个都可以用来寻找另一个。 最佳答案 Java 在其标准库中没有双向映射。 例如使用 BiMap 来自 Goo
Java中是否有类似双面列表的东西?也许第三方实现? 这里有一个小例子来证明我的想法。 原始状态: 答:0-1-2-3 | | | | 乙:0-1-2-3 删除 B 中的元素 1 后: 空值 | 答:
我有两个实体通过这样的双向 OneToOne 关联连接: @Entity class Parent { @NotNull String businessKey; @OneToO
我已将 Vagrant 配置为使用 Rsync 共享文件夹而不是(非常慢)vboxsf VirtualBox 默认提供的文件系统: Vagrant.configure("2") do |config|
@keyframes mgm { from { max-height: 250px; } to { max-height: 0px; } } .mgm {
我想了解有关使用双向 LSTM 进行序列分类时合并模式的更多详细信息,尤其是对于我还不清楚的“Concat”合并模式。 根据我对这个方案的理解: 在将前向和后向层的合并结果传递到 sigmoid 函数
我有兴趣将本地 git 存储库设置为远程存储库的镜像。我已经阅读了一些可能相关的帖子,但主要区别在于我需要对两个存储库进行读写访问。 大多数时候,用户会针对 Repo A 工作,但是有时他们会针对 R
我已经仔细阅读了文档 https://firebase.google.com/docs/database/web/read-and-write以及网上很多例子。但这里有一个脱节:在将对象添加到数据库时
这个问题已经有答案了: Hibernate bidirectional @ManyToOne, updating the not owning side not working (3 个回答) 已关闭
我知道有很多关于它的问题,但我找不到针对我的问题的好的答案。 我使用 Jboss 作为 7,Spring 和 Hibernate (4) 作为 JPA 2.0 提供程序,因此我有简单的 @OneToM
我是一名优秀的程序员,十分优秀!