首页 > 解决方案 > 如何删除具有链表特定数据的所有节点

问题描述

我有下一个问题。我有删除一个值为int的链表节点的功能,但是我需要用这个值删除链表中的所有nothes,我该怎么做?,这里是删除一个具有该值的节点的功能

    nodoLista* borrarMesLista(nodoLista* lista, int mes){
    nodoLista* seg;
    nodoLista* ante;
    if(lista != NULL && mes == lista->dato.mes){
        nodoLista* aux = lista;
        lista = lista->sig;
        free(aux);
    }else{
        seg=lista;
        while(seg != NULL && mes != seg->dato.mes){
            ante=seg;
            seg= seg->sig;
        }

        if(seg != NULL){
            ante->sig = seg->sig;
            free(seg);
        }
    }
    return lista;
}

标签: clinked-list

解决方案


这不是一个非常有效的方法,还有其他很好的方法可以做到这一点。

但是在下面使用您将对您的代码进行最小的更改

要删除同一元素的所有条目,您可以borrarMesLista通过添加一个额外的参数来稍微修改您的函数removed,该参数可用于确定是否删除了一个元素。

的初始值removed将是0,如果一个元素被删除,那么 make removed = 1

nodoLista* borrarMesLista(nodoLista* lista, int mes, int *removed){
    nodoLista* seg;
    nodoLista* ante;
    if(lista != NULL && mes == lista->dato.mes){
        nodoLista* aux = lista;
        lista = lista->sig;
        free(aux);
        *removed = 1;
    }else{
        seg=lista;
        while(seg != NULL && mes != seg->dato.mes){
            ante=seg;
            seg= seg->sig;
        }

        if(seg != NULL){
            ante->sig = seg->sig;
            free(seg);
           *removed = 1;
        }
    }
    return lista;
}

此外,当您打电话时,borrarMesLista您需要一些控制代码来控制此过程必须持续多长时间。只要列表中存在重复元素,此过程就会继续。

int removed = 0;
while( 1 )
{
    if(removed)
        removed = 0;
    lista = borrarMesLista(lista, mes, &removed);
    if(!removed)
        break;
}

推荐阅读