小白版单链表的查找、删除和删除过程(小白详细版)

一、单链表查找


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).

都可以通过先找出最好情况,就是第一次就能成功,再找出最坏情况,也就是最后一次才找到,之后以平均次数作为执行次数,从而算出时间算法复杂度

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值