数据结构-01-链表数据结构之单链表
本文中的所有代码均在github上的项目中:List_DataStructure
一.链表:
1.1 链表的概念:
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分内容:一是存储数据元素的数据域,另一个是存储其他结点地址的指针域(不同种类的链表存储的结点地址不同)。
1.2 链表的种类:
链表根据每个结点存储的指向下一结点的链接不同而分为几类
单链表:结构最简单的链表,每个结点中都有指向下一结点的地址
双链表:对单链表做了部分加强,每个结点中都有两个地址,分别指向上一结点和下一结点
环形链表:尾结点中存储有头结点的地址,整个链表形成了一个封闭的环
二.单链表:
单链表又名单向链表,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取的方式,从头部开始遍历链表
2.1 单链表的基本结构:
单链表的开始是一个头指针,每个结点中都有指向下一结点的地址,尾结点中的地址为nullptr
单链表的C++实现:
1.首先创建单链表的结点类
template<typename Type> class SingleLinkedList;template<typename Type>
class SingleLinkedListNode
{
private://将链表类声明为友元friend typename SingleLinkedList<Type>;//构造函数和析构函数SingleLinkedListNode() :pnext(nullptr){}SingleLinkedListNode(const Type item, SingleLinkedListNode<Type> * next = nullptr) :data(item),pnext(next){}~SingleLinkedListNode() {pnext = nullptr;}
public://创建公共方法,用于获取结点中的数据Type GetData();SingleLinkedListNode<Type>&);
private://结点类的私有属性,结点数据和下一结点的地址Type data;SingleLinkedListNode * pnext;
};
2.创建单链表类
#include"SingleLinkedListNode.h"template <typename Type>
class SingleLinkedList
{
public://构造函数和析构函数SingleLinkedList() :head(new SingleLinkedListNode<Type>()){}~SingleLinkedList() {MakeEmpty();delete head;}//对单链表的基本操作void MakeEmpty();void Insert(Type item, int i = 0);void Remove(int i = 0);void RemoveAll(Type item);//返回单聊表的基本信息int length();Type Get(int i);//查找和排序SingleLinkedList<Type> * SequentialSearch(Type item);//基础功能void Print();
private://链表的头节点是私有的SingleLinkedListNode<Type> *head;};
3.创建一个单链表对象:
SingleLinkedList<int> list;
根据空参构造方法,创建单链表对象时初始化了一个私有的,没有数据的头结点*head
2.2 向单链表中插入数据:
单链表的一个可用的Insert( )方法版本:
该版本不用按照插入位置的不同(头尾体)而分情况实现,比较简洁
//向单链表中插入元素
template <typename Type>
void SingleLinkedList<Type>::Insert(Type item, int i = 0) {if (i < 0){cout << "请输入一个大于0的数" << endl;}SingleLinkedListNode<Type> *pmove = head;SingleLinkedListNode<Type> *pnode = new SingleLinkedListNode<Type>(item);//循环条件是j<i,且pmove的地址不能为空for (int j = 0; j < i&&pmove; j++){pmove = pmove->pnext;}//插入点越界if (pmove == nullptr){cout << "数据插入位置错误,单链表没那么长!" << endl;}pnode->pnext = pmove->pnext;pmove->pnext = pnode;
}
在中间部分插入数据
以中间部分插入为主讨论:
1,首先创建两个结点类型指针pmove 和pnode
2,将pmove指针移动到插入点,如上图,插入位置为a2,a3之间,pmove指向a2
3,变更结点中存储的地址以实现结点插入
pnode->pnext = pmove->pnext; //第一步
pmove->pnext = pnode; //第二步
第一步:待插入节点pnode的下一结点地址pnext指向a3,a3的地址为a2结点的下一结点地址pnext,也是pmove的pnext,即pmove->pnext
第二步:更改a2结点的下一结点地址pnext,使其指向待插入节点pnode
如上图所示,s为待插入节点pnode,p为插入点位置pmove
在头部插入数据
在尾部插入数据
测试单链表的插入方法:
int main() {SingleLinkedList<int> list;//向链表中插入20个数据for (int i = 0; i < 20; i++){list.Insert(i*4,i);}//在链表头部插入数据list.Insert(10,0);//在链表尾部插入数据list.Insert(100,21);list.Print();cin.get();return 0;
}
执行结果:
2.3 删除单链表中的数据:
执行原理与添加数据相似,创建两个结点类型指针pdel和pmove
pdel指向待删除元素,pmove指向待删除结点的前一个结点
//删除单链表中的元素
template <typename Type>
void SingleLinkedList<Type>::Remove(int i = 0) {if (i < 0){cout << "请输入一个大于0的数" << endl;}SingleLinkedListNode<Type> *pmove = head, *pdel;for (int j = 0; j < i&&pmove->pnext; j++){pmove = pmove->pnext;}if (pmove->pnext == nullptr){cout << "删除出错,链表没有那么长!" << endl;}pdel = pmove->pnext;pmove->pnext = pdel->pnext;delete pdel;
}
2.3 单链表的其他方法:
2.3.1 销毁单链表
析构函数调用了此方法
//删除单链表
template <typename Type>
void SingleLinkedList<Type>::MakeEmpty() {SingleLinkedListNode<Type> *pdel;while (head->pnext != nullptr){pdel = head->pnext;head->pnext = pdel->pnext;delete pdel;}
}
2.3.2 返回单链表长度
//返回单链表长度
template<typename Type>
int SingleLinkedList<Type>::length() {SingleLinkedListNode<Type> *pmove = head->pnext;int count = 0;while (pmove != nullptr) {pmove = pmove->pnext;count++;}return count;
}
2.3.3 打印单链表中的所有数据
//打印单链表中的所有数据
template<typename Type>
void SingleLinkedList<Type>::Print() {SingleLinkedListNode<Type> *pmove = head->pnext;cout << endl << "head";while (pmove != nullptr){cout << "->" << pmove->data;pmove = pmove->pnext;}cout << "-over" << endl;
}
数据结构-01-链表数据结构之单链表相关推荐
- 数据结构(05)— 线性单链表实战
1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...
- 数据结构实验之链表五:单链表的拆分-sdut
数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...
- SDUT_2122 数据结构实验之链表七:单链表中重复元素的删除
提交代码 数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Proble ...
- 【数据结构链表】之五单链表
一:链表基础 1.链表基础----------------摘录自百度百科 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中 ...
- 【数据结构】带头结点的单链表
文章目录 一.单链表的概念 二.结构体声明: 三.函数 1.购买节点 2.释放节点 3.单链表的初始化 4.判空函数 5.获取单链表有效值个数 6.按数据查询(返回含有此数据节点的前驱) 7.按数据查 ...
- 数据结构初阶——第三节-- 单链表
链表 1. 链表的概念及结构 1.1 链表的概念及结构 1.2 链表的实现(无头+单向+非循环链表增删查改实现) 1. 动态申请一个节点 2. 单链表打印 3. 单链表尾插 1. 找尾用 tail - ...
- 数据结构学习(C++)——单链表应用(一元多项式【1】) (转)
数据结构学习(C++)--单链表应用(一元多项式[1]) (转)[@more@] 总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了.但是很不幸,如果你和我一样看的是那本书,到 ...
- 【数据结构与算法】判断单链表是否有环的算法
带环链表 这里的带环单链表可不是环形单链表,这个环可能是我们不想要的,所以需要检测. 我们就不假设有一个打结状的环了,那样跑到哪里去也不清楚,这里的"带环链表",环必然是在末端. ...
- 数据结构开发(6):静态单链表的实现
0.目录 1.单链表的遍历与优化 2.静态单链表的实现 3.小结 1.单链表的遍历与优化 问题: 如何遍历单链表中的每一个数据元素? 当前单链表的遍历方法: 遗憾的事实: 不能以线性的时间复杂度完成单 ...
- 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)
文章目录 单链表定义 不带头结点单链表 带头结点单链表 头结点和头指针的区分 带头结点单链表优点 单链表定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 不带头 ...
最新文章
- 使用余弦相似度算法计算文本相似度-数学
- 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip
- this.name=name;和this.setName(name);的区别
- 让你分分钟理解 JavaScript 闭包
- Java TCP 编程简介
- Python多线程threading和多进程multiprocessing的区别及代码实现
- java p代表哪种数据类型_java数据类型(八种基本数据类型+三种引用类型)
- LG G8X官方图流出:LG双屏手机也意外曝光 或IFA发布
- 快速上手系列:传智播客Java基础笔记
- 遗传算法MATLAB工具包简介
- 英特尔:赔你15亿算了;Nvidia:反正我早就不做你那块了
- java8 32位和64位资源分享 Windows 版本:8u311
- 小米手环 / 运动手环 记步功能原理
- FEKO学习:偶极子天线仿真
- 推荐一款轻量级的支持Markdown的团队知识分享开源软件
- 万年历,阴阳历转换。
- word用宏修改文档中图片大小
- 注塑机计算机控制器,注塑机微机控制器,Microprocessor-based Controller for PIM,音标,读音,翻译,英文例句,英语词典...
- 重返帝国T0阵容搭配
- golang 学习 - chan以及chan的一下用例
热门文章
- java和基岩怎么联机_JAVA和基岩版要同步了
- 计算机速录学什么,学速录需要哪些能力
- mysql函数commit_phpmysqli_commit()函数和mysqli_autocommit()函数比较
- python中match用法_python re.match()用法相关示例
- SVN“Previous operation has not finished; run 'cleanup' if it was interrupted”错误修复方法
- Js/jQuery实时监听input输入框值变化
- 关于删库 恢复 (慎重使用,未亲测)
- mongo之$group+$addToSet
- mysql源码包的安装
- poj2828 Buy Tickets