-
Notifications
You must be signed in to change notification settings - Fork 0
/
nodelink
131 lines (124 loc) · 3.42 KB
/
nodelink
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
#include <iostream>
using namespace std;
class node {
private:
int num;
node* next;
public:
node(int _num) : num(_num), next(NULL) {}
void link(node* _next) { next = _next; }
node* getnext() { return next; }
int getnum() { return num; }
void operationnum(int _num) { num = _num; }
};
// 删除指定节点的函数
node* Delete_node(node* Last, node* De);
// 操作类
class oper {
private:
int i;
node* hand = NULL;
public:
// 构造函数,接收数组长度和数组并创建链表
oper(int n, int* arr) {
Createcode(n, arr);
}
node* gethand() { return hand; }
// 根据数组创建链表
void Createcode(int n, int* arr) {
node* p;
node* q;
for (i = 0; i < n; i++) {
p = new node(arr[i]);
if (hand == NULL) hand = p;
else q->link(p);
q = p;
}
p->link(NULL);
}
// 排序链表
void Sortnode() {
if (!hand || !hand->getnext()) return;
bool swapped=true; // 标记是否发生交换
node *p;
while (swapped){
swapped = false; // 初始化为未交换
p = hand;
while (p->getnext()) {
// 如果当前节点大于下一个节点,则交换它们
if (p->getnum() > p->getnext()->getnum()) {
int temp = p->getnum();
p->operationnum(p->getnext()->getnum());
p->getnext()->operationnum(temp);
swapped = true; // 标记发生了交换
}
p = p->getnext(); // 移动到下一个节点
}
}
}
// 显示链表中的所有节点
void Shownode() {
node *p;
p = hand;
while (p) {
cout << p->getnum() << " ";
p = p->getnext();
}
cout << endl;
}
// 删除重复节点
void Delete_repeatnode() {
node *p;
p = hand;
bool swapped=true;
while(swapped){
swapped=false;
while (p && p->getnext()) {
// 如果当前节点与下一个节点值相同,删除下一个节点
if (p->getnum() == p->getnext()->getnum()) {
Delete_node(p, p->getnext());
swapped= true;
} else {
p = p->getnext();
}
}
}
}
// 链接两个链表
void Link_node(node* tail) {
if (!tail) return;
node* p = hand;
while (p->getnext()) p = p->getnext();
p->link(tail);
}
// 析构函数,释放节点内存
~oper() {
node *p;
while (p){
p=hand->getnext();
p=Delete_node(hand,p);
}
}
};
// 删除节点函数的实现
node* Delete_node(node* Last, node* De) {
Last->link(De->getnext());
delete De;
return Last->getnext();
}
int main() {
int i = 5;
int a[] = {2, 2, 6, 4, 2};
int b[] = {3, 2, 1, 7, 2};
oper cn(i, a);
cn.Shownode(); // 显示第一个链表
oper bn(i, b);
bn.Shownode(); // 显示第二个链表
cn.Link_node(bn.gethand()); // 将两个链表连接
cn.Shownode(); // 显示连接后的链表
cn.Sortnode(); // 对链表进行排序
cn.Shownode(); // 显示排序后的链表
cn.Delete_repeatnode(); // 删除重复节点
cn.Shownode(); // 显示最终链表
return 0;
}