欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言实现链表节点的删除

程序员文章站 2022-10-30 20:50:35
对链表节点进行增删改查是最基本的操作,这篇博客将会来实现对节点的删除。其他的操作可参考《c语言实现链表的基本操作》这篇博客。删除某个节点有两个类型: (1)删除i某个位置的节点; (2)判断x值是否...

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

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

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

核心代码如下:

//删除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;
}