数据结构之单链表C++版
文章目录
C++中有STL的list底层是双向链表,这里重新写一个单链表,就是写着玩。
包含的头文件
#include <iostream>
其他就是不用了,如果想严谨一点就再加一个new头文件
#include <new>
结构体描述链表节点
struct Node
{
int data;
Node* next;
Node(int data = 0):data(data),next(nullptr){
}
};
因为C++可以直接使用结构体名定义结构体变量,所以就是不用typedef来起别名了。
链表再封装
class List
{
public:
//构造函数
List()
{
this->size = 0;
this->headNode = nullptr;
}
//析构函数
~List()
{
clear(); //清理链表中的节点
delete[] this->headNode; //释放头节点内存
}
int getSize() {
return this->size; } //获取当前链表的大小
bool empty() {
return this->size == 0; } //判断链表是否为空链表
void push_front(int data); //头插法插入数据
void push_back(int data); //尾插法插入数据
void insertByPos(int pos, int data); //指定位置插入数据
void print_front(); //打印链表中的数据
void clear(); //清理链表中的节点
void pop_front(); //从链表头部开始删除节点
void pop_back(); //从链表尾部开始删除节点
void deleteByPos(int pos); //指定位置删除节点
bool scearch(int num); //查找链表中的数据
void changeData(int newNum, int pos); //指定位置修改数据
protected:
int size; //万金油参数,当前链表的大小
Node* headNode; //指向链表的头节点
};
这样一个链表就已经写好了,后面的事情就是一个个去实现链表中的成员函数。
各个成员函数的实现
只供参考使用
获取当前链表的大小
直接返回List类中的size数据成员,size数据成员在一开始调用构造函数的时候默认初始化为零,然后在增加和删除操作会对应的进行自增和自减操作。
int getSize() {
return this->size; }
判断链表是否为空链表
直接判断size成员是否为零,如果为零返回true不为零则返回false。
bool empty() {
return this->size == 0; }
头插法插入数据
从外界接收一个要插入的数据,然后在函数中动态申请一个节点的内存newNode,判断链表是否为空,如果为空就直接让链表的头节点指针指向newNode,如果不为空就采用先连接后移动头节点位置,防止断链。连接完成后不要忘记给size属性做自增运算。
void List::push_front(int data)
{
Node