单链表的查找
① 链表不是随机存取结构
在链表中,即使知道被访问结点的序号i,也不能像顺序表中那样直接按序号i访问结点,而只能从链表的头指针出发,顺链域next逐个结点往下搜索,直至搜索到第i个结点为止。因此,链表不是随机存取结构。
② 查找的思想方法
计数器j置为0后,扫描指针p指针从链表的头结点开始顺着链扫描。当p扫描下一个结点时,计数器j相应地加1。当j=i时,指针p所指的结点就是要找的第i个结点。而当p指针指为null且j≠i时,则表示找不到第i个结点。
注意:
头结点可看做是第0个结点。
单链表的查找分为两种
1.按位查找
GetElem(L,i) :按位查找操作,获取L中第i个位置的元素的值
ListInsert(LinkList &L ,int i, ElemType e){
if(i < 1)
return false;
LNode *p; //指针p指向当前扫描到的节点
int j = 0; //当前p指向的是第几个节点
p = L; //L指向头结点,头结点是第0个节点
while(p != NULL && j < i-1){ //循环找到第i-1个节点
p = p -> next;
j++;
}
if(p == NULL)
return false;
LNode *s = (LNode *) malloc (sizeof(LNode));
s -> data = e;
s -> next = p -> next;
p -> next = s;
return true;
}
LNode * GetElem(LinkList L, int i){
if(i < 0)
return NULL;
LNode *p; //指针p指向当前扫描到的节点
int j = 0; //当前p指向的事第几个节点
p = L; //L指向头结点,头结点是第o个节点
while (p != NULL && j < i){ //循环找到第i个节点
p = p -> next;
j++;
}
retuen p;
}
2.按值查找
LocateElem(L,e): 按值查找操作,在表L中查找具有给定关键字的元素
//按值查找,找到数据域== e 的结点
LNode * LocateElem(LinkList L,ElemType e){
LNode *p = L -> next;
//从第一个结点开始查找新数据与为e的结点
while(p != NULL && p -> data != e)
p = p -> next;
return p; //找到后返回该结点指针,否则返回NULL
}
3.求表的长度
//求表的长度
int Length(LinkList L){
int len = 0; //统计表长
LNode *p = L;
while(p -> next != NULL){
p = p -> next;
}
return len;
}