C++超详细分析单链表的实现与常见接口

 更新时间:2022年03月24日 10:28:58   作者:程序猿教你打篮球  
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,本章带你分析单链表的实现与常见接口

相信如果看完了上期顺序表的小伙伴应该发现了顺序表的诸多缺点:

🤒 中间/头部的插入删除,时间复杂度为O(N)!

😑 增容需要申请新的空间,拷贝数据,释放旧空间,会有不少的消耗。

🙄 增容一般是呈倍增长,势必会有一定的空间浪费。

链表的OJ题会单独出一期的哦!

那么,如何解决以上的问题呢?

🤨 那么什么是链表呢?—— 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

 实际中要实现的链表的结构非常多样,以下情况组合起来就有8种链表结构:

1. 单向、双向         2. 带头、不带头            3. 循环、非循环

我们只讲最简单和最复杂的,毕竟一句老话,冬天到了春天还会远吗?🎄

今天我们讲无头单向非循环链表,下期讲带头双向循环链表 !

好的,有了上面的认识正式进入我们本期的学习💪。

无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结 构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

 我们来看到单链表的架构:

 🎨 单链表和顺序表不一样,我们是需要的时候动态申请一个节点空间就够了!

SLTNode* BuySListNode(SLTDataType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
		return NULL;//做空指针判断
	newnode->data = x;
	newnode->next = NULL;
 
	return newnode;
}

这里我们利用malloc函数开辟了一个SLTNode大小的空间(得用SLTNode* 来接收),malloc和realloc一样如果开辟失败会返回空指针,所以这我们需要先做判断!不为空则把数据放入data,并且把指向下一个节点的 next 置空!并且返回新节点的地址!(这里如果不明白则需要补充结构体,指针,动态内存开辟的知识)

🎋 首先我们还是来实现单链表的头部插入数据!

这里我们可以看到,不带哨兵位(带头链表)链表需要改变头指针位置,下期我们学带头双向循环链表就可以不用双指针了!

🧵 下面是我们的单链表尾部插入数据!

🧶 接着来实现单链表头部删除数据!

 🛒 下面来到单链表的尾部删除数据!

👓 在指定元素前插入节点!

 这个我们首先需要找到指定节点元素的地址!

 接下来就是实现我们的指定元素前插入节点的函数了!

同理我们接着来实现删除指定元素的节点!

最后其实还有一个修改节点数据,这个看了上期的顺序表实现起来就很简单,留给你们自己研究去啦!学好编程多想,多敲代码准没错! 

        那么以上这就是我们无头单向非循环链表的常见接口了,如果你看完感觉比较吃力看不懂的话,建议多去回顾下c语言指针,结构体,动态内存这几张的内容!当你能把这个单链表理解透彻了,下一期的带头双向循环链表也很容易理解的,代码实现起来更轻松,加油吧!

最后还是那句话😎我们一起快乐编程不头秃!

gitee(码云):Mercury. (zzwlwp) - Gitee.com  

到此这篇关于C++超详细分析单链表的实现与常见接口的文章就介绍到这了,更多相关C++ 单链表的实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入浅析C++多态性与虚函数

    深入浅析C++多态性与虚函数

    多态是指同样的消息被不同的对象接收时导致不同的行为。本文通过实例代码给大家介绍了C++多态性与虚函数的相关知识,感兴趣的朋友一起看看吧
    2020-02-02
  • C语言中递归的实际应用与经典问题

    C语言中递归的实际应用与经典问题

    函数以及函数的递归调用是学习C语言必须要掌握的内容,且递归作为经典的算法思想被广泛应用于程序设计中,下面这篇文章主要给大家介绍了关于C语言中递归的实际应用与经典问题的相关资料,需要的朋友可以参考下
    2021-09-09
  • C语言中static的使用方法实例详解

    C语言中static的使用方法实例详解

    static一般用于修饰局部变量,全局变量,函数,下面这篇文章主要给大家介绍了关于C语言中static用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Qt实现制作简单的计算器

    Qt实现制作简单的计算器

    计算器是我们生活中很常见的东西,它可以由多种语言多种方式来实现。本文主要介绍的是利用Qt实现的简易计算器的制作,文中的示例代码讲解详细,需要的可以参考一下
    2022-12-12
  • C++调用python(执行py文件)的全过程

    C++调用python(执行py文件)的全过程

    这篇文章主要给大家介绍了关于C++调用python(执行py文件)的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-12-12
  • C语言实现通讯录的方法(包括静态版本和动态版本)

    C语言实现通讯录的方法(包括静态版本和动态版本)

    本文给大家分享C语言实现通讯录的方法(包括静态版本和动态版本),针对每种方法给大家介绍的非常详细,需要的朋友参考下吧
    2021-09-09
  • C++ 指针常量和常量指针的区别小结

    C++ 指针常量和常量指针的区别小结

    在C++学习使用过程中,每个人都不可避免地使用指针,而且都或多或少的接触过常量指针或指针常量,本文主要介绍了C++ 指针常量和常量指针的区别小结,感兴趣的可以了解一下
    2023-12-12
  • C++下如何将TensorFlow模型封装成DLL供C#调用

    C++下如何将TensorFlow模型封装成DLL供C#调用

    这篇文章主要介绍了C++下如何将TensorFlow模型封装成DLL供C#调用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 深入分析:C++模板究竟会使代码膨胀吗

    深入分析:C++模板究竟会使代码膨胀吗

    今天和同事说到C++模板会使代码膨胀, 可同事觉得不会。 同事的依据是: 如果模板会使代码膨胀, 那么ATL和WTL里为什么还要大量使用模板? 同样功能 ,ATL和WTL编译出的可执行文件可比MFC编译的要小的多
    2013-04-04
  • C++中getline()和get()的方法浅析

    C++中getline()和get()的方法浅析

    大家都知道作为C++获取输入流的方法,几乎在任何一本资料书上getline()方法和get()方法都作为入门级的方法进行讲述,即便如此,笔者在学习C++的过程中仍经常忘记这二者的使用要点,可能也有C++的初学者对这两个方法还心存疑虑,本篇文章就这两个方法的使用进行简要阐述。
    2016-10-10

最新评论