1
+ #include " List_Node.hpp"
2
+ #pragma once
3
+ using namespace std ;
4
+
5
+ // 开始实现定义链表类
6
+ template <class T >
7
+ class Single_link_list {
8
+ public:
9
+ List_Node<T>* head; // 定义头节点
10
+ int length; // 实现记录链表长度
11
+
12
+ Single_link_list (); // 默认构造函数
13
+ Single_link_list (T val); // 有参构造函数
14
+ ~Single_link_list (); // 析构函数的声明
15
+
16
+ void get_link_list_length (); // 获取链表的长度
17
+ void show_link_list (); // 实现打印链表
18
+
19
+ List_Node<T>* get_link_ele_by_index (int index); // 通过下标获取元素
20
+ List_Node<T>* get_link_ele_by_value (T val); // 通过链表节点值实现获取元素
21
+
22
+ void push_back (T val); // 向链表末尾添加元素
23
+ void prepush_back (T val); // 向链表头部添加元素
24
+ void insert (int index, T val); // 实现向链表中插入元素
25
+
26
+ };
27
+
28
+
29
+ // 开始实现上面声明的方法
30
+ template <class T >
31
+ Single_link_list<T>::Single_link_list() {} // 默认构造函数的实现
32
+
33
+
34
+ template <class T >
35
+ Single_link_list<T>::Single_link_list(T val) {
36
+ // 开辟堆区实现存储元素
37
+ List_Node<T>* new_node = new List_Node (val);
38
+ List_Node<T>* temp = head;
39
+ if (this ->length == 0 ) {
40
+ this ->head = new_node;
41
+ }
42
+ else {
43
+ while (temp->next != nullptr ) {
44
+ temp = temp->next ;
45
+ }
46
+
47
+ temp = new_node;
48
+ }
49
+ this ->length ++;
50
+ }
51
+
52
+
53
+ template <class T >
54
+ void Single_link_list<T>::get_link_list_length() {
55
+ cout << " 链表长度为:" << this ->length << endl;
56
+ }
57
+
58
+
59
+ template <class T >
60
+ void Single_link_list<T>::show_link_list() {
61
+ List_Node<T>* temp = head;
62
+ while (temp != nullptr ) {
63
+ // 更新指针的指向
64
+ cout << temp->val << " " ;
65
+ temp = temp->next ;
66
+ }
67
+ cout << endl;
68
+ }
69
+
70
+
71
+ template <class T >
72
+ List_Node<T>* Single_link_list<T>::get_link_ele_by_index(int index) {
73
+ if (index < 0 || index >= length) {
74
+ return nullptr ;
75
+ }
76
+
77
+ List_Node<T>* temp = head;
78
+ for (int i = 0 ; i < index ; i++) {
79
+ temp = temp->next ;
80
+ }
81
+ return temp;
82
+ }
83
+
84
+
85
+ template <class T >
86
+ List_Node<T>* Single_link_list<T>::get_link_ele_by_value(T val) {
87
+
88
+ List_Node<T>* temp = head;
89
+ while (temp != nullptr ) {
90
+ if (temp->val == val) return temp;
91
+ temp = temp->next ;
92
+ }
93
+
94
+ return temp;
95
+ }
96
+
97
+
98
+ template <class T >
99
+ void Single_link_list<T>::push_back(T val) {
100
+ List_Node<T>* temp = head;
101
+ List_Node<T>* new_node = new List_Node (val);
102
+
103
+ if (length == 0 ) {
104
+ head = new_node;
105
+ this ->length ++;
106
+ return ;
107
+ }
108
+
109
+ while (temp->next != nullptr ) {
110
+ temp = temp->next ;
111
+ }
112
+ temp->next = new_node;
113
+ this ->length ++;
114
+ }
115
+
116
+
117
+ template <class T >
118
+ void Single_link_list<T>::prepush_back(T val) {
119
+ List_Node<T>* new_node = new List_Node (val);
120
+ new_node->next = this ->head ;
121
+ this ->length ++;
122
+ }
123
+
124
+
125
+ template <class T >
126
+ void Single_link_list<T>::insert(int index, T val) {
127
+ if (index <0 || index >length) {
128
+ return ;
129
+ }
130
+
131
+ else if (this ->length == 0 ) {
132
+ this ->prepush_back (val);
133
+ }
134
+ else if (index = this ->length - 1 ) {
135
+ this ->push_back (val);
136
+ }
137
+ else {
138
+ List_Node<T>* temp_insert_pre = head;
139
+ for (int i = 0 ; i < index - 1 ; i++) {
140
+ temp_insert_pre = temp_insert_pre->next ;
141
+ }
142
+ List_Node<T>* back = temp_insert_pre->next ;
143
+
144
+ List_Node<T>* new_node = new List_Node (val);
145
+
146
+ new_node->next = back;
147
+ temp_insert_pre->next = new_node;
148
+ }
149
+ this ->length ++;
150
+ }
0 commit comments