Skip to content

Commit ff4a331

Browse files
committed
feat: cpp single link list and upload README.md
0 parents  commit ff4a331

File tree

5 files changed

+218
-0
lines changed

5 files changed

+218
-0
lines changed

.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.vscode
2+
.idea
3+
output
4+
5+
*.exe

README.md

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
* main.cpp 是整个程序运行的主入口
2+
* Single_list_link.hpp 定义了模板化的链表
3+
* List_Node.hpp 定义的是模板节点
4+
5+
* 本次算法的实现需要知道的技术含有:
6+
* 熟悉使用指针
7+
* 熟悉C++ 的面向对象的思维模式
8+
* 熟悉泛型编程的思想
9+
* 同时最重要的是理解模块化,分文件的开发模式的实现
10+
11+
* 后续该项目可以实现添加的其他方法
12+
* 添加运算符重载,让链表可以通过 `[]` 来进行访问内部的每一个元素
13+
* 添加拷贝函数,同时重载 `=` ,来实现后续的便捷的拷贝操作
14+
15+
* 为什么使用模板编程和面向对象的思维模式呐???
16+
* 是因为面向对象的思维模式有助于后续代码复用性的提升,使用面向对象思维中的封装的特性
17+
* 使用泛型编程的好处,使用泛型编程,我们后续的的操作更加的自由,我们的数据结构可以实现存储的值更加丰富
18+
* 同时也可以提高了我们代码的复用率

Single_link_list/List_Node.hpp

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#pragma once
2+
#include<iostream>
3+
using namespace std;
4+
5+
// 开始实现定义链表节点
6+
template<class T>
7+
class List_Node {
8+
public:
9+
// 定义节点类中的方法
10+
List_Node(T val);
11+
~List_Node();
12+
13+
// 定义节点的属性
14+
T val;
15+
List_Node* next;
16+
};
17+
18+
19+
template<class T>
20+
List_Node<T>::List_Node(T val) {
21+
this->val = val;
22+
next = nullptr;
23+
}
24+
25+
26+
template<class T>
27+
List_Node<T>::~List_Node() {
28+
cout << "析构完成" << endl;
29+
}

Single_link_list/Single_List_Link.hpp

+150
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
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+
}

Single_link_list/main.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#include<iostream>
2+
#include "Single_List_Link.hpp"
3+
using namespace std;
4+
5+
void test() {
6+
Single_link_list<int>* single_link_list = new Single_link_list(10);
7+
8+
single_link_list->get_link_list_length();
9+
single_link_list->show_link_list();
10+
}
11+
12+
13+
int main() {
14+
test();
15+
return 0;
16+
}

0 commit comments

Comments
 (0)