单向链表的操作(C++类的简单实现)
首先创建对象Node用来保存数据和指针:
Node.h
#pragma once
class Node
{
public:
int data;
Node* next;
};
接下来对链表对象进行封装
list.h:
#pragma once
#include"Node.h"
class list
{
private:
Node* head;//保留头指针
Node* tempt;//保留当前所在位置
int length;//链表长度
public:
list();//默认构造函数
~list();//析构函数
void apend(int num);//链表数据末尾追加
void show();//链表的输出
void find_index(int index);//按索引查找
void delete_index(int index);//按索引进行删除
void insert_index(int index, int num);//按索引插入数据
};
list类的实现
list.cpp
#include<iostream>//测试代码
#include<cstdlib>
#include "list.h"
list::list()
{
head = new Node;//参数的初始化
tempt = head;//当前指针指向head
head->next = nullptr;//必须添加头文件#include<cstdlib>
length = 0;
std::cout << "初始化完成" << std::endl;//确定类是否创建成功
}
void list::apend(int num)
{
if (length == 0) {
head->data = num;
length++;
}
else {
tempt->next = new Node;//申请空间
tempt = tempt->next;//后挪当前指针
tempt->data = num;//赋值
tempt->next = nullptr;//末尾空指针
length++;
}
}
void list::show()
{
if (length == 0)
std::cout << "该列表为空" << std::endl;
else if (length == 1)
std::cout << head->data << std::endl;//在该种算法下考虑length为1的情况
else {
Node* temp = head;//保存head信息
int i = 1;
while (i<=length)//采用nullptr方式会出现问题最后一个扫描不到
{
std::cout << temp->data << ' ';
temp = temp->next;
i++;
}
std::cout << std::endl;
}
}
void list::find_index(int index)
{
if (length == 0)
std::cout << "该列表为空" << std::endl;
else if (index > length)
std::cout << "超出索引值" << std::endl;
else {
if (index == 1)//该种链表对首部需要单独考虑
std::cout << head->data << std::endl;
else {
int i = 1;
Node* temp = head;//从首部开始移动查询
while (i != index)
{
temp = temp->next;
i++;
}
std::cout << temp->data << std::endl;
}
}
}
void list::delete_index(int index)
{
if (length == 0)
std::cout << "该列表为空" << std::endl;
else if (index > length)
std::cout << "超出索引值" << std::endl;
else {
if (index == 1) {
Node* Need_delet = head;
head = head->next;
delete Need_delet;
length--;
}
else {
int i = 1;
Node* temp = head;//从首部开始移动查询
while (i != index - 1)
{
temp = temp->next;
i++;
}
Node* Need_delet = temp->next;//保存删除的节点地址
temp->next = Need_delet->next;//将index-1节点接入index+1
delete Need_delet;//删除当前节点
length--;//总体长度减一
}
}
}
/*
* 说明按索引后插入
* index在第几个后面插入
* num表示插入的数据
*/
void list::insert_index(int index, int num)
{
if (index == 1) {
Node* insert_node = new Node;//为插入的节点分配空间
insert_node->data = num;
insert_node->next = head->next;
head->next = insert_node;
length++;
}
else {
int i = 1;
Node* temp = head;//从首部开始移动查询
while (i != index)
{
temp = temp->next;
i++;
}
Node* insert_node = new Node;//为插入的节点分配空间
insert_node->data = num;
insert_node->next = temp->next;
temp->next = insert_node;
length++;
}
}
list::~list()
{
if (length == 0||length==1) { //当前处理模式下1也是特殊情况
delete head;
std::cout << "空间已经释放" << std::endl;//确定空间是否释放
}
else {
while (head->next != nullptr) {
Node* temp = head;//保留当前方便删除
head = head->next;
delete temp;
}
delete head;
std::cout << "所以节点已经释放" << std::endl;
}
}
测试代码
test.cpp
#include<iostream>
#include"list.h"
using namespace std;
int main() {
list node;
node.apend(1);
node.apend(2);
node.apend(3);
node.apend(4);
node.apend(5);
node.show();
node.delete_index(3);
node.show();
node.insert_index(2,3);
node.show();
//node.find_index(2);
//node.~list();
return 0;
}