C语言实现单链表节点的删除(不带头结点)

     对单链表节点进行增删改查是最基本的操作,这篇博客将会来实现对节点的删除。其他的操作可参考《C语言实现链表的基本操作》这篇博客。删除某个节点有两个类型:

(1)删除i某个位置的节点;

(2)判断x值是否在链表中,若存在则删除该节点;

实例代码已经上传至 https://github.com/chenyufeng1991/DeleteLinkedList 。

核心代码如下:

//删除pos位置的节点
Node *deletePosElement(Node *pNode,int pos){

    //需要一个头结点来维护
    Node *pHead;

    Node *pMove;
    int i = 1;
    if (pos <= 0 || pos > sizeList(pNode)) {
        printf("%s函数执行,输入pos值非法,删除节点失败\n",__FUNCTION__);
        return NULL;
    }

    pHead = pNode;
    pMove = pNode;
    //单独考虑删除第一个节点
    if (pos == 1) {

        pMove = pMove->next;
        pNode = pMove;
        free(pHead);

        printf("%s函数执行,删除pos=1位置元素成功\n",__FUNCTION__);
        return pNode;
    }

    while (pMove != NULL) {
        if (i == pos - 1) {
            break;
        }
        i++;
        pMove = pMove->next;
    }

    free(pMove->next);
    pMove->next = pMove->next->next;

    printf("%s函数执行,删除pos=%d位置元素成功\n",__FUNCTION__,pos);

    return pNode;
}

//判断x值是否在链表中,若存在则删除该节点
Node *deleteXElement(Node *pNode,int x){

    //一前一后两个指针,pMovePre是pMove的前一个节点
    Node *pMovePre;
    Node *pMove;

    if (pNode == NULL) {
        printf("%s函数执行,链表为空,删除x=%d失败\n",__FUNCTION__,x);
        return NULL;
    }

    pMovePre = pNode;
    pMove = pMovePre->next;

    //单独考虑第一个节点
    if (pMovePre->element == x) {
        pNode = pMove;
        free(pMovePre);
        return pNode;
    }

    while (pMove != NULL) {
        if (pMove->element == x) {
            //找到该节点的前一个节点
            pMovePre->next = pMove->next;
            free(pMove);
            break;
        }
        //同步前进
        pMove = pMove->next;
        pMovePre = pMovePre->next;
    }

    if (pMove == NULL) {
        printf("%s函数执行,不存在x=%d,删除数据失败\n",__FUNCTION__,x);
        return pNode;
    }

    printf("%s函数执行,删除x=%d成功\n",__FUNCTION__,x);
    return pNode;
}



已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页