单链表删除节点(p->next)与p的区别

在插入链表的时候,while§而在删除链表的时候while(p->next)?这是为什么呢?因为删除算法中的循环条件(p->next && j<i-1)和插入算法中的循环条件(p && j<i-1)是有所区别的。因为插入操作中合法的输入操作有 n+1个,而删除操作中合法的删除位置只有n个,如果使用与插入相同的循环条件,则会出现引用空指针的情况,使删除操作失败。

链表插入

/*单链表的插入
 * 1、查找结点a_(i-1) 并由指针p指向该结点
 * 2、生成1个新结点s
 * 3、将新结点*s 数据域置为e
 * 4、将新结点*s 的指针域指向结点a_i
 * 5、将结点*p 的指针域指向新结点s
 * */
Status ListInsert(LinkList &L,int i,ElementType e){
    
    
    LinkList  p = L;
    int j = 0;
    while(p && j<i-1){
    
    
        p = p->next;
        j++;
    }
    if(!p || j>i-1) return ERROR;//查找第i-1个新结点,p指向该节点
    LNode* s = new LNode;
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

链表删除

/*单链表的删除
 * 1、查找结点a_(i-1) 并由指针p指向该节点
 * 2、临时保存待删除节点a_i 的地址在q中,以备释放
 * 3、将结点*p 的指针域指向a_i的直接后继结点
 * 4、释放结点a_i的空间
 * */

Status ListDelete(LinkList &L,int i){
    
    
    //带头结点的单链表L中,删除第i个元素
    LinkList p = L;
    int j =0;
    while((p->next) && j<i-1){
    
    
        p = p->next;
        j++;
    }
    if(!(p->next) || (j>i-1)) return ERROR;
    LNode *q = p->next;
    p->next = q->next;
    delete q;
    return OK;
}

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/123458327