c++单链表的实现以及一些基本操作

这篇博客介绍了C++中链表类的实现,包括构造函数、析构函数以及链表的初始化、头插法、尾插法、按位查找、删除、插入和打印等基本操作。通过实例展示了如何使用头插法和尾插法建立单链表,并提供了按位置查找和删除节点的方法。
摘要由CSDN通过智能技术生成

首先是结点类的定义:

#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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虐鼠无情麻子刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值