c-如何删除链接列表中具有特定数据的所有节点



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

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;
}

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

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

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

removed的初始值将为0,以防元素被移除,则为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;
}

我找到了这个解决方案:

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

}

相关内容

  • 没有找到相关文章