线性表之单链表(上)

创建新结点

继续单链表的其他接口函数之前,先定义一个创建新结点的函数,方便后续使用。

SLTNode* CreateListNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));newnode->data = x;newnode->next = NULL;return newnode;
}

单链表的头插函数

相比于之前的尾插函数,头插函数较简单

代码实现

void SListPushFront(SLTNode ** pphead,SLTDataType x)
{SLTNode * newnode = CreateListNode(x);newnode->next = *pphead;*pphead = newnode;
}

实现思路

单链表的尾删函数

在写单链表尾删函数时,应该进行分类讨论。

分类讨论

一是链表为空时;二是链表中只有一个结点时;三是链表中大于等于2个结点时。

为什么要分类讨论呢?我们从第三种情况往回分析就可以得到答案了:

讨论完第三种情况的尾删了。看看第二种情况,这种思路是否可行:

因此将这两种情况分开来讨论的。

第一种情况则是出于严谨,没有结点时,不进行尾删。

代码实现

void SListPopBack(SLTNode** pphead)
{//第一种情况if (*pphead == NULL){return;}//或者-> /*assert(*pphead != NULL);*///第二种情况if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}//第三种情况else{SLTNode* prev = NULL;SLTNode* tail = *pphead;while (tail->next){prev = tail;tail = tail->next;}free(tail);tail = NULL;prev->next = NULL;}
}

单链表的头删函数

代码实现

void SListPopFront(SLTNode ** pphead)
{assert(*pphead != NULL);SLTNode *next = (*pphead)->next;free(*pphead);*pphead = next;
}

实现思路

单链表的查找函数

代码实现

SLTNode* SListFind(SLTNode* phead,SLTDataType x)
{SLTNode* cur = phead;while(cur){if(cur->data == x){return cur;}else{cur = cur->next;}}return NULL;
}

单链表查找的思路是很简单的,直接进行遍历就可以了。

需要考虑的是,当查找的目标不止存在一个时应该怎么处理:

查找多个相同目标

//假设我们要查找头结点为plist的单链表中数据是2的结点,且不止一个。
SLTNode* pos = SListFind(plist,2);
int i = 1;
while(pos) //判断pos返回的值是否为NULL,为NULL则证明已找不到
{printf("第%d个pos结点:%p->%d\n",i++,pos,pos->data);pos = SListFind(pos->next,2);//在pos的下一个位置开始查找
}

同时,运用这个函数返回值的特性,可以顺便实现修改数据的作用

修改指定结点的数据

//以之前的情景为例,我们把找到的2改为20
pos = SListFind(plist,2);
if(pos)
{pos->data = 20;
}

pos位置前一个结点插入数据

实现思路

代码实现

void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{SLTNode* newnode = CreateListNode(x);if (*pphead == pos) //当要在第一个位置的前面插入数据时,则为头插{//用头插的思路来写即可newnode->next = *pphead;*pphead = newnode;}else {//找到pos的前一个位置SLTNode* posPrev = *pphead;while (posPrev->next != pos){posPrev = posPrev->next;}posPrev->next = newnode;newnode->next = pos;}
}

pos位置后一个结点插入数据

代码实现

//在pos的后面插入,这个更适合用于单链表,效率也更高一些
void SListInsertAfter(SLTNode* pos, SLTDataType x)
{SLTNode* newnode = CreateListNode(x);newnode->next = pos->next;pos->next = newnode;
}

pos位置删除结点

代码实现

void SListErase(SLTNode** pphead, SLTNode* pos)
{if (*pphead == pos){//直接使用头删函数SListPopFront(pphead);}else{SLTNode* prev = *pphead;while (prev->next != pos)//与之前类似,找结点{prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}
}

pos位置后删除结点

void SListEraseAfter(SLTNode* pos)
{assert(pos->next);SLTNode* next = pos->next;pos->next = next->next;free(next);//next = NULL;
}

单链表的销毁

void SListDestory(SLTNode** pphead)
{assert(pphead);SLTNode* cur = *pphead;while (cur){SLTNode* next = cur->next;free(cur);cur = next;}*pphead = NULL;
}

end


学习自:比特徐靖杭——数据结构与算法课程

数据结构和算法学习记录——线性表之单链表(下)-头插函数、尾删函数、头删函数、查找函数、pos位置插入删除数据、单链表销毁相关推荐

  1. 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查

    03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...

  2. 【数据结构与算法】之线性表的应用和操作

    数据结构概念 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合. 数据结构的逻辑结构:数据对象中数据元素之间的相互关系,分为线性结构.树形结构.图形结构以及集合结构. 数据结构的物理结构:数 ...

  3. 数据结构与算法2:线性表的顺序存储与链式存储

    文章目录 线性表 定义 线性表的抽象数据类型(Abstract Data Type) 线性表的顺序存储结构 线性表的链式存储结构 单链表(single linked list) 静态链表 (stati ...

  4. 【数据结构与算法基础】线性表

    写在前面 挺早之前看的数据结构和算法了,但是最近刷LeetCode上题目的时候发现还不是很熟练(都忘光了....),于是狠心再来一遍.边整理边刷题,用的教材是北大裘宗燕的<数据结构与算法pyth ...

  5. [数据结构与算法] 学习记录合辑 (07) 图

    该合辑为笔者自b站自学的"C++数据结构与算法"课程学习记录,旨在将重要的学习要点.思考内容与部分代码进行记录,以便后续自行翻看,亦可给其他读者带来一些参考 内容基于笔者自身的理解 ...

  6. 头歌实践教学平台数据结构与算法:02线性表

    针对数据结构02线性表在头歌平台练习过程中的完成代码,关卡数目较多,每题思路单独在每一关中解释.如有其他需求请留言. 第一关 可以把问题转换为:遍历B中的元素,如果该元素不在A中,则把该元素插入到A中 ...

  7. 头歌实践教学平台数据结构与算法:02线性表——反转链表(拓展)

    针对数据结构02线性表--反转链表(拓展)在头歌平台练习过程中的完成代码,每题思路单独在每一关中解释.如有其他需求请留言. 第一关 已知一个带头结点的单链表L,将L反转并返回反转后的单链表.要求将L的 ...

  8. 数据结构与算法笔记(二) 线性表(数组描述)

    c++常用的数据描述方法是数组描述和链式描述,线性表可以用来说明这两方法,先介绍数组描述的线性表.后面再介绍链式描述的线性表. C++ STL容器vector和list相当于线性表的数组描述和链式描述 ...

  9. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)

    查找: 给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败 查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序 动态查找表:查找的同时做修改操作( ...

  10. 数据结构与算法:06 线性表

    06 线性表 知识结构: 1. 线性表的定义与操作 1.1 线性表的定义 线性表(Linear List)是由n(n≥0)n (n≥0)n(n≥0)个相同类型的数据元素a0,a1,⋯,an−1a_0, ...

最新文章

  1. java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时
  2. 一个很简短的 JS 生成器入门和用法参考
  3. Netty内置处理器以及编解码器
  4. java怎样实现自定义过滤关键词_SpringSecurity学习之自定义过滤器的实现代码
  5. 玩转算法之面试-第六章(栈和队列)
  6. Topcoder Asia Programming Competition
  7. 最新SMB僵尸网络利用了7个NSA工具,而WannaCry只用了两个……
  8. Red Hat Linux 启动流程图
  9. 医院信息化项目实施工作总结
  10. 多电脑切换器(KVM切换器)工作原理
  11. LintCode_新手必编程50题(1-3阶段)解答与分析
  12. HTML视频学习教程,让你实战入门前端
  13. GraphQL 学习笔记
  14. Spring SpringBoot中使用Mybatis-plusDemo1
  15. 助力高校科研信息化升级,让高校更“高效”
  16. ASP.NET中防止Access数据库下载
  17. SiT3807:高性能单端压控振荡器VCXO
  18. (经典Flash游戏)Zoom Keeper
  19. python 生成html文件浏览器,pycharm中怎么生成HTML文档并在浏览器查看HTML文档
  20. 2020-03-29

热门文章

  1. 传统企业转型会员电商的模式分享
  2. HTML5交互式导图怎么通过MindManage导出
  3. [计算机图形学]蒙特卡洛积分与路径追踪(前瞻预习/复习回顾)
  4. 【Java闭关修炼】Spring-IOC介绍
  5. MOSFET击穿问题
  6. spz女皇--武则天
  7. 练习小游戏 简化版贪吃蛇
  8. 首席新媒体商学院创始人黎想:用户增长裂变指南
  9. html5 数据显示,显示数据表里的内容《 HTML5:Web SQL 》
  10. postgreSql查询表里有字段却找不到字段原因