本文实例讲述了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
|
/*
双向循环链表
*/
#include <iostream>
using namespace std;
//结构体构造链表的指针域和数据域
struct ChainNode
{
int data; //节点数据
ChainNode *left; //节点的前驱指针
ChainNode *right; //节点的后继指针
};
////////////创建n个双向循环链表 并返回链表头指针/////////
ChainNode* CreateNode(int n)
{
ChainNode *head = NULL; //链表头节点
ChainNode *pCur=NULL,*pNew=NULL; //当前节点,新建节点
//初始化头结点的前驱和后继节点都为NULL
if (n<1) //没有节点 返回头节点
{
return head;
}
//创建头节点并将器左右指针指向空
head = new ChainNode;
head->left = NULL;
head->right = NULL;
head->data = 0;
pCur = head;
//为防止指针互指带来的混乱,用pCur节点保存了头节点 也表示当前指针移动到了头指针
//创建n个节点 并连接成链表
for (int i=0; i<n; i++)
{
pNew = new ChainNode; //创建一个新节点
cout<<"请输入数据:";
cin>>pNew->data;
pCur->right = pNew; //头指针的右指针指向新建节点
pNew->left = pCur; //新建节点的左指针执行头节点
pNew->right = NULL; //用于最后和头指针进行交换
pCur = pNew; //指针往下移动
}
//最后将头指针的左指针指向最后一个节点,
//最后一个节点的有指针指向头指针,构成循环
head->left = pCur;
pCur->right = head;
return head;
}
//////////////输出链表头节点///////////////////////
void OutList(ChainNode *head) //参数为头指针 从头指针开始
{
cout<<"链表元素输出如下:"<<endl;
ChainNode *pCur = head->right;
//重第一个节点开始输出
//没有指向空节点,则链表没结束 输出链表元素
while (pCur->right != head)
{
cout<<pCur->data<<" ";
pCur = pCur->right;
//当前节点指向下一个节点 可以遍历链表
}
cout<<pCur->data<<endl;
//输入最后一个元素,它的右指针执行head
}
///////在双向循环链表后添加n个节点//////
ChainNode* AddNode(ChainNode* head, int n)
{
ChainNode *pNew,*pCur;
//新添加节点和当前节点
pCur = head;
//移动到最节点
while (pCur->right != head)
{
pCur = pCur->right;
//当前节点往下移动 一直移到最后一个节点
}
//新添加n个节点并插入链表
for (int i=0; i<n; i++)
{
pNew = new ChainNode;
cout<<"输入要添加的节点元素:";
cin>>pNew->data;
pCur->right = pNew; //头指针的右指针指向新建节点
pNew->left = pCur; //新建节点的左指针执行头节点
pNew->right = NULL; //用于最后和头指针进行交换
pCur = pNew; //指针往下移动
}
//最后将头指针的左指针指向最后一个节点,
//最后一个节点的有指针指向头指针,构成循环
head->left = pCur;
pCur->right = head;
return head;
}
/////在双向循环链表中删除一个节点///////
ChainNode* DeleteNode(ChainNode* head, unsigned num)
//删除第num个节点
{
ChainNode *pNew,*pCur,*temp;
//新添加节点和当前节点 ,临时交换节点
pCur = head;
int ncount = 0;
//移动到第num-1个节点
while (1)
{
ncount++;
pCur = pCur->right; //当前节点往下移动
if (num == ncount)
{
break; //此时pCur还是指向了第num个节点
}
}
//当前节点的前一个节点的右指针 指向 当前节点的下一个节点
//当前节点的下一个节点的左指针 指向 当前节点的上一个节点 构成连接
//最后 删除当前节点
(pCur->left)->right = pCur->right;
(pCur->right)->left = pCur->left;
delete pCur;
return head;
}
int main()
{
int num;
//创建num个节点并显示
cout<<"输入要创建的链表节点个数:";
cin>>num;
ChainNode *head = CreateNode(num);
OutList(head);
//往链表后添加n个节点
int addnum;
cout<<"输入要添加的节点个数:";
cin>>addnum;
AddNode(head, addnum);
OutList(head);
//删除链表的第del个元素
int del;
cout<<"输入要删除的第几个位置的节点:";
cin>>del;
DeleteNode (head, del);
OutList(head);
system("pause");
return 0;
}
|
希望本文所述对大家的C++程序设计有所帮助。
相关文章
猜你喜欢
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
- ASP.NET自助建站系统的域名绑定与解析教程 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-25 82
-
2025-05-29 50
-
2025-05-29 39
-
2025-05-27 79
-
2025-05-29 101
热门评论

