单链表的两种查找方式

目录

按位查找

按值查找


 

这里只探讨了:带头结点的情况

 

查找分为 

按位查找 =>  GetElem(L,i)   获取表中第i个位置元素的值。
按值查找 =>  LocateElem(L,e)   在表中查找具有给定关键值的元素。

 

 

按位查找

单链表的两种查找方式

思路: 明确函数返回值类型,代码实质在于定位到第i个结点,而定位操作在单链表按位序增加或者删除都已经实践过!

 

分析(边界情况):

当 i=0 时,这里将头结点视为了第0个结点。此时执行会跳过while循环,直接执行return p,即返回头结点。

如果 i 的值大于实际长度,while 循环会在 p=NULL 是跳出循环,最终返回的是NULL。结合第一个 if 判断语句可以看出当 i 值不合法的时候,最终返回的值就是一个 NULL。因此别人调用这个基本操作的时候,只需要判断此次返回值是不是等于 NULL 就可以知道这次的按位查找操作是否执行成功! 

 

 边界情况是写代码的时候必须考虑到的,要让代码具备健壮性!

单链表的两种查找方式

 

 

结合之前学习的 后插操作,在要求第 i 个位置插入元素 e 的时候,就可以采用(封装的)基本操作来完成。

单链表的两种查找方式

封装好处: 代码简介+更易维护。

 

这同时解释了为什么之前要进行一个 p==NULL 的判断,怎么会有人传入一个空指针呢?  因为空指针并不是人输入的,是执行过程中的封装函数产生的,而开始执行的参数输入有可能导致中间封装函数的空指针产生。

单链表的两种查找方式

 

=> 尽可能提高代码的健壮性是很有必要的,不要觉得这些边边角角的判断很麻烦,这些边界情况才是程序最容易出 bug 的地方

 

 

 

按值查找

单链表的两种查找方式

当函数调用者接收到 NULL 的时候,说明并不存在要查找的 e;

图中代码假设类型是 Int  类型所以可用 !=  ,如果是 struct 类型的数据,则不能用。

 

 

单链表的两种查找方式