链表的查找的基本思路
查找功能是我认为在这些功能里最重要的那个,我们以后想要得到的插入和删除
,都是建立在链表的查找之上如果你想删除或者插入但是你却连位置都没有,这
就很尴尬了,所以链表查找我觉得挺重要的,也是挺难理解的,因为只要理解这
个后面的插入和删除功能,你自己很快就写出来了,接下来开始,我们应该想想
你想找到一个结构体,你拿什么找他? 只能使用它自己的成员,而且独一无二
,如果是学生管理系统是学生的学号,如果是坐标的管理系统呢就是独一无二的
坐标,所以参数你自己把握好,我这里写的是坐标管理系统,所以呢,我的参数
用的是坐标。我们先得想想查找这个函数需要哪些参数,首先应该有oldrows和oldcols。
这里还不顾,因为是在你这个链表上操作,那么你先得把链表给我对吧。所以有
三个参数(point head, int oldrows, int oldcols)。现在我们考虑如何找,从
前往后用一个指针分别指向链表的每一个结构体判断oldrows和oldcols是否相等
但是这里注意了,我们不管以后的插入删除听起来是想要这个点的位置,其实最
重要的是找到他的前驱结点举个例子删除功能,因为找到它的前驱结点才能把它
"架空",修改掉前驱结点的next值,然后才可以大方的把它的空间释放。后面会提
到。所以我们知道现在呢我们还需要有一个指针来记录它的前驱结点,现在我们的
思路基本明确了,一个负责查找的指针,一个负责记录前驱结点的指针。
图中红箭头是开始循环的时候,蓝箭头是循环一次后的结果。
for (p = head.next; p && ((p->cols != oldcols) || (p->rows != oldrows)); p = p->next)
==>当第一个就是我们要找的有效节点,此时q指针为NULL
==>第一个以后所有找到有效节点,此时q的指针指向该节点的前驱结点。
==>没找到此时指针指向末节点。
程序的实现
point *found(point head, int oldrows,int oldcols)
{
point *p;
point *q = NULL;
for (p = head.next; p && ((p->cols != oldcols) || (p->rows != oldrows)); p = p->next)
q = p;
return q;
//若指定点为第一个,返回值为NULL
//若指定点为除了第一个以外的其他节点,则该函数的返回值为目标的前一个指定点。
//若指定点不存在,则该函数的返回值指向末节点。
}