单链表按位序与指定结点 删除

按位序删除(带头结点)

#define NULL 0
#include

typedef struct LNode
{
    int data;
    struct LNode* next;
}LNode, * LinkList;

//按位序删除(带头结点)
bool ListInsert(LinkList& L, int i, int& e) {
    if (i < 1)
        return false;
    LNode* p = L;           //指针p指向当前扫描结点,目前指向头结点,是第0个
    int j = 0;              //当前p指向第几个结点
    while (p != NULL && j < i - 1)          //循环指到第i-1个结点
    {
        p = p->next;
        j++;
    }

    if (p == NULL)              //i值不合法
        return false;
    if (p->next == NULL)            //第i-1结点之后已无其他结点
        return false;
    LNode* q = p->next;              //令q指向即将删除结点
    e = q->data;                           //用e返回元素的值
    p->next = q->next;                //将*q结点从链中断开
    free(q);                          //释放结点的存储空间
    return true;
}

单链表按位序与指定结点 删除_第1张图片

指定结点的删除

//删除指定结点p
bool DeleteNode(LNode* p) {
    if (p == NULL)
        return false;
    LNode* q = p->next;                  //令q指向*p的后继结点
    p->data = p->next->data;        //和后继结点交换数据
    p->next = q->next;                   //将*q结点从链中断开
    free(q);                             //释放后继结点的存储空间
    return true;
}

单链表按位序与指定结点 删除_第2张图片
如果要删除的结点p是最后一个元素,代码不适用会报错

你可能感兴趣的:(数据结构,算法,c语言)