从链表中删除元素

时间:2014-05-03 18:28:22

标签: c++ arrays pointers delete-operator singly-linked-list

如果cantLineas = 0,我想创建一个从列表中删除名为“archivo”的元素的方法,该方法正确地删除所有内容,但是当列表被完全删除时我无法将指针置为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;
        }

    }
}

1 个答案:

答案 0 :(得分:0)

您正在传递指针listArchivos by value, you have to pass it by reference。为了实现这一点,你必须传递一个双指针或一个指针的引用(见下面的代码):

双指针:

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的强大功能并使用smart pointers而不是原始C指针,并利用像std::vector这样的STL容器来管理和存储对象。