从链表中删除元素

Delete an element from a linked list

本文关键字:元素 删除 链表      更新时间:2023-10-16

我想做一个方法,从列表中删除称为"archivo"的元素,如果cantLineas=0,该方法删除一切刚刚好,但我不能使它把指针指向NULL时列表已被完全删除。下面是我写的代码:

struct archivo
{
    char * nombre;
    int cantLineas;
    archivo * sig;
};

void borrarArchivos(archivo * listaArchivos){
    archivo * ant=NULL;
    while(listaArchivos!=NULL){
        if(listaArchivos->cantLineas==0){
            if(ant!=NULL){
                ant->sig=listaArchivos->sig;
                delete listaArchivos;
                listaArchivos=ant->sig;
            }else{
                ant=listaArchivos;
                listaArchivos=listaArchivos->sig;
                delete ant;
                ant=NULL;
            } 
            if(ant==NULL && listaArchivos==NULL){
                listaArchivos=NULL;
            }
        }else{
            ant=listaArchivos;
            listaArchivos=listaArchivos->sig;
        }
    }
}

您通过值传递指针listArchivos,您必须通过引用传递它。为了实现这一点,你必须传递一个双指针或对指针的引用(见下面的代码):

双重指针:

void borrarArchivos(archivo **listaArchivos) {
    archivo *ant=NULL;
    while(*listaArchivos!=NULL){
        if((*listaArchivos)->cantLineas==0){
            if(ant!=NULL){
                ant->sig=(*listaArchivos)->sig;
                delete *listaArchivos;
                *listaArchivos=ant->sig;
            }else{
                ant=*listaArchivos;
                *listaArchivos=(*listaArchivos)->sig;
                delete ant;
                ant=NULL;
            } 
            if(ant==NULL && *listaArchivos==NULL){
                *listaArchivos=NULL;
            }
        }else{
            ant=*listaArchivos;
            *listaArchivos=(*listaArchivos)->sig;
        }
    }
}

指针引用:

void borrarArchivos(archivo *&listaArchivos){
    archivo * ant=NULL;
    while(listaArchivos!=NULL){
        if(listaArchivos->cantLineas==0){
            if(ant!=NULL){
                ant->sig=listaArchivos->sig;
                delete listaArchivos;
                listaArchivos=ant->sig;
            }else{
                ant=listaArchivos;
                listaArchivos=listaArchivos->sig;
                delete ant;
                ant=NULL;
            } 
            if(ant==NULL && listaArchivos==NULL){
                listaArchivos=NULL;
            }
        }else{
            ant=listaArchivos;
            listaArchivos=listaArchivos->sig;
        }
    }
}

更好的是,使用c++ STL的强大功能,使用智能指针代替原始的C指针,并利用STL容器(如std::vector)来管理和存储对象。