本文中的所有代码均在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-链表数据结构之单链表相关推荐

  1. 数据结构(05)— 线性单链表实战

    1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...

  2. 数据结构实验之链表五:单链表的拆分-sdut

    数据结构实验之链表五:单链表的拆分 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 输入N个 ...

  3. SDUT_2122 数据结构实验之链表七:单链表中重复元素的删除

    提交代码 数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Proble ...

  4. 【数据结构链表】之五单链表

    一:链表基础 1.链表基础----------------摘录自百度百科 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中 ...

  5. 【数据结构】带头结点的单链表

    文章目录 一.单链表的概念 二.结构体声明: 三.函数 1.购买节点 2.释放节点 3.单链表的初始化 4.判空函数 5.获取单链表有效值个数 6.按数据查询(返回含有此数据节点的前驱) 7.按数据查 ...

  6. 数据结构初阶——第三节-- 单链表

    链表 1. 链表的概念及结构 1.1 链表的概念及结构 1.2 链表的实现(无头+单向+非循环链表增删查改实现) 1. 动态申请一个节点 2. 单链表打印 3. 单链表尾插 1. 找尾用 tail - ...

  7. 数据结构学习(C++)——单链表应用(一元多项式【1】) (转)

    数据结构学习(C++)--单链表应用(一元多项式[1]) (转)[@more@] 总算到了这里,这时,你会很得意的说,辛辛苦苦学的单链表总算知道能干点什么了.但是很不幸,如果你和我一样看的是那本书,到 ...

  8. 【数据结构与算法】判断单链表是否有环的算法

    带环链表 这里的带环单链表可不是环形单链表,这个环可能是我们不想要的,所以需要检测. 我们就不假设有一个打结状的环了,那样跑到哪里去也不清楚,这里的"带环链表",环必然是在末端. ...

  9. 数据结构开发(6):静态单链表的实现

    0.目录 1.单链表的遍历与优化 2.静态单链表的实现 3.小结 1.单链表的遍历与优化 问题: 如何遍历单链表中的每一个数据元素? 当前单链表的遍历方法: 遗憾的事实: 不能以线性的时间复杂度完成单 ...

  10. 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)

    文章目录 单链表定义 不带头结点单链表 带头结点单链表 头结点和头指针的区分 带头结点单链表优点 单链表定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 不带头 ...

最新文章

  1. 使用余弦相似度算法计算文本相似度-数学
  2. 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip
  3. this.name=name;和this.setName(name);的区别
  4. 让你分分钟理解 JavaScript 闭包
  5. Java TCP 编程简介
  6. Python多线程threading和多进程multiprocessing的区别及代码实现
  7. java p代表哪种数据类型_java数据类型(八种基本数据类型+三种引用类型)
  8. LG G8X官方图流出:LG双屏手机也意外曝光 或IFA发布
  9. 快速上手系列:传智播客Java基础笔记
  10. 遗传算法MATLAB工具包简介
  11. 英特尔:赔你15亿算了;Nvidia:反正我早就不做你那块了
  12. java8 32位和64位资源分享 Windows 版本:8u311
  13. 小米手环 / 运动手环 记步功能原理
  14. FEKO学习:偶极子天线仿真
  15. 推荐一款轻量级的支持Markdown的团队知识分享开源软件
  16. 万年历,阴阳历转换。
  17. word用宏修改文档中图片大小
  18. 注塑机计算机控制器,注塑机微机控制器,Microprocessor-based Controller for PIM,音标,读音,翻译,英文例句,英语词典...
  19. 重返帝国T0阵容搭配
  20. golang 学习 - chan以及chan的一下用例

热门文章

  1. java和基岩怎么联机_JAVA和基岩版要同步了
  2. 计算机速录学什么,学速录需要哪些能力
  3. mysql函数commit_phpmysqli_commit()函数和mysqli_autocommit()函数比较
  4. python中match用法_python re.match()用法相关示例
  5. SVN“Previous operation has not finished; run 'cleanup' if it was interrupted”错误修复方法
  6. Js/jQuery实时监听input输入框值变化
  7. 关于删库 恢复 (慎重使用,未亲测)
  8. mongo之$group+$addToSet
  9. mysql源码包的安装
  10. poj2828 Buy Tickets