一、单链表查找
LNode*LocateElem(LinkList L,ElemType e) //函数类型为LNode*类型,最后是返回一个指向节点地址的指针
{
p=L->next; // 因为是按数值查找,所以指向该节点的时候也能取出该节点的数据域中的数值,所以让P指向首元结点,因为首元结点是一个有数据的节点
while(p&&p->data!=e) //只要p不为NULL,或者该节点的数据域不为e,就让循环一直进行,若以p->data==e结束,说明为正常结束,已经找到了e的位置,此时p指向该位置
p=p->next; //若以p为NULL结束,说明此时已经超过了p的合法位置,p的合法位置为a1到an,如果p能循环到a(n+1),说明没有找到e,此时p的值为NULL
return p; //若成功找到,则范围该节点的地址,若没有找到,此时p的数值为NULL
}
二、单链表删除
Status LinkDelete(LinkList &L,int i) //Status为用户自定义类型,可以根据用户的需要确定Status的类型,直接用typedef重命名即可
{
p=L; j=0; //因为删除某个节点,需要得到该节点的地址,而该节点的地址可以通过上一个节点的指针域得到,所以需要指向前一个节点,因为p和j一一对应,所以j为0
while((p->next)&&(j<i-1)) //p的合法位置为头节点到a(n-1),所以到p->next为NULL的时候,说明此时p指向an,超出合法范围,是不合法的退出,说明此时i>n,才会使p可以循环到an
{
p=p->next;
j++;
}
if(!(P->next)||(j>i-1)) //如果以p->next=NULL结束,说明i的位置大于n,才会使P一直循环到an,此时i的位置不合法
return ERROR; //如果以j>i-1结束,因为j初始为0,说明i-1<0.可得i<1,此时i的位置也不合法
q=p->next; //需要再定义一个q节点,用来存储要删除的节点,以便之后释放空间,要删除节点的位置在上一个节点就是p的指针域中,所以把p->next给q
p->next=q->next; //删除第i个节点之后,还要把i-1和i+1连接起来,就是把i+1的地址放到i-1的指针域中,i+1的地址可以用q->next来表示
delete q; //之后要把要删除节点的空间释放掉,即可完成删除操作
return OK;
}
三、单链表插入
Status LinkList(LinkList &L,int i,ELemType e)
{
p=L;j=0; //因为是插入到第i个节点,所以我们需要得到第i个节点的地址,我们可以通过第i-1个节点的指针域来得到,所以p都要指向前一个节点,j与p要一致,所以j=0
while(p&&(j<i-1)) //因为p的合法位置为头节点到an,所以当p=NULL时,说明此时p指向a(n+1),是不合法的退出,说明此时i的位置大于n,也是不合法的 ,若是因为j=i-1退出循环的,说明此时p指向a(i-1),说明正确找到位置,是合法退出
{
p=p->next;
j++;
}
if(!p||j>i-1) //如果p==NULL结束,说明p指向a(n+1),是不合法的,只有当i>n时,才会使p一直循环到a(n+1)才结束
return ERROR; //如果是以j>i-1,因为j的初始数值为0,所以i-1<0,所以i<1,此时i的位置也是不合法的
s=new LNode; //s为新生成的节点,是我们要插入的节点,给新节点分配空间
s->data=e; //让新节点的数据域为e
s->next=p->next; //首先要先使新节点与第i个节点联系起来,就要使新节点的指针域放i的位置,i的位置可以由前一个节点找出,所以为p->next
p->next=s; //之后再把s与前一个节点联系起来,也就是把s的地址给前一个节点的指针域,注意二者位置不能互换,否则就会找不到第i个的位置
return OK;
}
四、时间算法复杂度
查找,删除,插入的时间算法复杂度均为Tn=O(n).
都可以通过先找出最好情况,就是第一次就能成功,再找出最坏情况,也就是最后一次才找到,之后以平均次数作为执行次数,从而算出时间算法复杂度