单链表的两种查找方式
目录
这里只探讨了:带头结点的情况
查找分为
按位查找 => 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 类型的数据,则不能用。