- 一、单链表的查找
- 二、代码实现
- 1.按位查找
- 2.按值查找
- 3.遍历的另一个应用,求表的长度
二、代码实现 1.按位查找与顺序表类似,单链表的查找也包括按位查找和按值查找。而且按值查找类似,都需要遍历线性表,然后一次对比数据的子变量。
与顺序表不同的是,由于顺序表是由数组实现的,可以无需遍历,可以直接按位查找,实际上,这也是与顺序表的本质有关,顺序表中逻辑结构相邻物理结构就一定相邻,所以根据位序,就可以确定数据元素的位置。但是单链表必须通过遍历,才能按位查找。
按位查找实际上在之前的按位插入,按值插入的操作中都已经实现过了,只不过有一些细节上的不同。
比如:按位查找不用用&
//按位查找,返回第i个元素(带头结点)
LNode * GetElem(Linklist L,int i){
if(i<0)
return NULL;
LNode *p; //指针p指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点,也就是结点的位序
p=L; //头结点是第零个结点
while(p!=NULL&&j //循环找到第i个结点
p=p->next;
j++;
}
return p; //返回指向对应结点的指针
}
2.按值查找这里的代码很简单,但是值得注意的是在这个查找函数中,返回值是对应数据元素的指针,要注意在单链表中,一个数据元素的指针就是它的名字,还有,返回值可以是任意的数据类型,这个点要注意,在使用其它人写的函数时间,要注意利用好这一点。
很容易可以看出单链表按位查找的时间复杂度是O(n),这也是所谓的按位插入和按位删除的操作的时间复杂度来源。
可以看出,在很多对于单链表的操作中,少不了对链表的遍历或者是按位查找,将这些代码封装起来更加简洁,还可以避免重复的代码,易于维护。
按值查找同样是需要对于单链表进行遍历,同时进行元素值的对比,当数据元素的类型是结构体类型的时候,需要对于结构体的数据域进行比较。(是不是叫子变量来着)
按值查找同样是需要提供头结点的指针,另外还需要提供查找的值,另外进行同样的遍历,依次对比就好了,同样要返回查找到的结点的指针。
//按值查找,找到数据域==e的结点,在数据结构这门各种可以这样写,但是在C语言对于结构体的比较中,这并不可行。
LNode *(LinkList L,int e){
LNode *p=L->next; //这里与按位查找不同,没有一个数位数的int变量,p指针也跳过了头结点
while(p->data!=e&&p!=NULL)
p=p->next;
return p; //找到后返回结点的指针
}
3.遍历的另一个应用,求表的长度上面的代码没有考虑到找不到的情况,其实直接在最后面增加一个return NULL,就好了 ,只要没有找到对应的结点,那就一律是没有找到,不管是什么不合法还是真的不存在。除非是需要特别区分。
求单链表的长度的一个方法就是遍历,相当于查找NULL的位置,代码如下
int Length(LinkList L){
int len = 0;
LNode *p=L;
while(p->next!NULL){
p=p->next;
len++;
}
return len;
}
只要能够遍历,就可以求数量、长度或者大小。
只要看得见,就知道有多长



