首先是结点类的定义:
#pragma once
class LNode
{
public:
int data;
class LNode* next;
};
其次是链表类的定义:
#pragma once
#include"LNode.h"
class LinkLIst
{
public:
LinkLIst(); //构造函数,同时进行初始化
~LinkLIst(); //析构函数
void InitiaList(); //初始化链表
void ListInsert_Head(); //头插
void ListInsert_Tail(); //尾插
void Insert(int pos, int n); //插入
void Delete(int pos,int &e); //删除
void Destroy(); //销毁
LNode* GetElem(int pos); //按位查找
void Print(); //打印链表
int GetLength(); //求表长
private:
LNode* m_head; //头结点
int m_length; //链表长度
};
我的LiskLink.cpp实现如下:
#include “LinkLIst.h”
#include
//初始化单链表
/*
- 初始化单链表,可以考虑将class定义为LinkList类型
- 结点LNode单独为一个类型
- 否则对于头指针在初步声明后不方便初始化,即this指针是否能在分配空间后改变??*(这个地方存疑)
- 而将头指针定义为LinkList类型,并且在成员变量中定义两个值
- 分别为head头指针以及length链表长度,
- 一方面很多设计链表长度的操作会简化,毕竟相当于c语言经典表示,c++多添加了一个链表信息
- 另一方面可以直接运用this->head进行初始化,绕开了对于this赋值的操作
*/
LinkLIst::LinkLIst()
{
InitiaList();
std::cout << “This is LinkList’s Construction Function!” << std::endl;
}
//初始化链表
void LinkLIst::InitiaList()
{
m_head = new LNode;
m_length = 0;
if (!m_head)
std::cout << "Allocate Failure!" << std::endl;
m_head->next = nullptr;
}
//头插法建立单链表
void LinkLIst::ListInsert_Head()
{
//先把可能分配的内存释放干净
Destroy();
InitiaList();
std::cout << "正在使用头插法建立单链表!" << std::endl;
std::cout << "请输入想要插入的数据(输入-999结束输入):" << std::endl;
int num;
std::cin >> num;
while (num != -999)
{
LNode* p = new LNode;
p->data = num;
p->next = m_head->next;
m_head->next = p;
m_length++;
std::cin >> num;
}
}
//尾插法建立单链表
void LinkLIst::ListInsert_Tail()
{
//先把可能分配的内存释放干净
Destroy();
InitiaList();
std::cout << "正在使用尾插法建立单链表!" << std::endl;
std::cout << "请输入想要插入的数据(输入-999结束输入):" << std::endl;
int num;
std::cin >> num;
LNode* rail = m_head;
while (num != -999)
{
LNode* temp = new LNode;
temp->data = num;
rail->next = temp;
rail = temp;
std::cin >> num;
}
}
//按位查找
LNode* LinkLIst::GetElem(int pos)
{
if (pos < 0 || pos>m_length)
{
std::cout << "Your Finding Location be out of border !" << std::endl;
return nullptr;
}
LNode* p = m_head;
int cnt = 0;
while (p!=nullptr && cnt < pos)
{
p = p->next;
cnt++;
}
return p;
}
//删除
void LinkLIst::Delete(int pos,int &e)
{
if (pos <= 0 || pos > m_length)
{
std::cout << "Your Delete Position be out of border !" << std::endl;
return;
}
else if (pos = m_length)
{
LNode* p = GetElem(pos - 1);
LNode* q = p->next;
e = q->data;
p->next = nullptr;
delete q;
m_length--;
}
else
{
LNode* p = GetElem(pos - 1);
LNode* q = p->next;
p->next = q->next;
e = q->data;
delete q;
m_length--;
}
}
//销毁单链表相当于从头遍历并删除每一个节点
void LinkLIst::Destroy()
{
int num = 0;
for (int i = 1; i <= m_length; i++)
Delete(i,num);
delete m_head;
}
//析构函数
LinkLIst::~LinkLIst()
{
Destroy();
std::cout << "This is Destruction Function!" << std::endl;
}
//插入一个新节点
void LinkLIst::Insert(int pos, int n)
{
if (pos <= 0 || pos > m_length + 1)
{
std::cout << "Your Insert Position be out of border " << std::endl;
return;
}
LNode* temp = new LNode;
temp->data = n;
LNode* p = GetElem(pos - 1);
if (pos == m_length + 1)
temp->next = nullptr;
else
temp->next = p->next;
p->next = temp;
m_length++;
}
void LinkLIst::Print()
{
LNode* p = m_head->next;
std::cout << "The length is " << m_length << std::endl;
int cnt = 0;
while (p != nullptr)
{
std::cout << p->data;
cnt++;
if (cnt != 10) std::cout << " ";
else
{
cnt = 0;
std::cout << std::endl;
}
p = p->next;
}
}
// 求表长
int LinkLIst::GetLength()
{
return m_length;
}