【问题标题】:How to delete all nodes with a particular data of linked list如何删除具有链表特定数据的所有节点
【发布时间】:2020-11-16 02:55:51
【问题描述】:

我有下一个问题。我有删除一个值为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;
}

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

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

    但使用下面的代码,您的代码改动很小

    要删除同一元素的所有条目,您可以通过添加一个额外的参数 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;
    }
    

    【讨论】:

      【解决方案2】:

      我找到了这个解决方案:

      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;
      

      }

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 2019-04-14
        • 1970-01-01
        • 2019-12-05
        • 2022-01-05
        相关资源
        最近更新 更多