C语言—链表的查找

链表的查找的基本思路


查找功能是我认为在这些功能里最重要的那个,我们以后想要得到的插入和删除

,都是建立在链表的查找之上果你想删除或者插入但是你却连位置都没有,这

就很尴尬了,所以链表查找我觉得挺重要的,也是挺难理解的,因为只要理解这

个后面的插入和删除功能,你自己很快就写出来了,接下来开始,我们应该想想

你想找到一个结构体,你拿什么找他? 只能使用它自己的成员,而且独一无二

,如果是学生管理系统是学生的学号,如果是坐标的管理系统呢就是独一无二的

坐标,所以参数你自己把握好,我这里写的是坐标管理系统,所以呢,我的参数

用的是坐标。我们先得想想查找这个函数需要哪些参数,首先应该有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 = p;


现在分析过程,其实我们只需要分析当第一个就是我们要找的有效节点,或者压根

没找到的情况 如果第一个有效节点就是我们要找的,这时候没有对q赋值,此时的q

是垃圾数据,但是我们后期 是要返回q的,所以我们首先给q赋值,*p=NULL。这样

就可以防止返回垃圾数据。 当p->next为NULL 没还找到(此时p指向末节点的前驱结

点) ,这个时候还是没有找到相等的 ,然后再进行赋值让q=p的值此时 p经过赋值后

变成了NULL(p=p->next),然后循环停止, 所以q最终的值是指向链表的末节点,

p的最终的值为NULL。 现在大致情况分析清楚了如下

 ==>当第一个就是我们要找的有效节点,此时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
//若指定点为除了第一个以外的其他节点,则该函数的返回值为目标的前一个指定点。
//若指定点不存在,则该函数的返回值指向末节点。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值