He estado tratando de escribir un algoritmo de la ruta más corta, dijkstras algoritmo, encontrar la ruta más corta para los dos primeros vértices funciona bien. Me encuentro con el problema al intentar borrar una lista enlazada y una cola de prioridad.

class llNode {
public:
    int id;
    int source;
    int weight;
    llNode* next;
    llNode(int key, int distance, int from) {
        id=key;
        weight=distance;
        source=from;
        next = NULL;
    }
};


class lList {
private:
    llNode* root;
    llNode* end;

    void clearAll(llNode* toClear);


public:
    lList() {
        root = NULL;
    }

    void add(llNode* toAdd) {
        if ( root == NULL) {
            root = toAdd;
            end = toAdd;
            return;
        }

        end->next = toAdd;
        end=end->next;
    }

    bool isFound(int key) {
        for(llNode* ii= root; ii != NULL ; ii=ii->next) {
            if ( ii->id == key) {
                return true;
            }
        }

        return false;
    }

    void clearAll();

};

void lList::clearAll() {
clearAll(root);
}

void lList::clearAll(llNode* toClear) {
if(toClear == NULL) {
    return;
}

clearAll(toClear->next);

toClear=NULL;

}

Junto con estos métodos claros traté simplemente la raíz de conjunto NULL y yo también lo intentó atravesar la lista y utilizando el eliminar en cada elemento. Estoy teniendo suerte con cualquiera de estos métodos. De la raíz se mantiene establece una ubicación no válida y me da errores de infracción de acceso.

Hay algo sencillo que simplemente no estoy viendo? Cómo se podría ir sobre la eliminación de cada elemento de una lista enlazada?

  • Ya que se trata de punteros, usted podría hacer que las root.next y end.next ambos apuntan a la root.
InformationsquelleAutor Beamer180 | 2012-04-06

2 Comentarios

  1. 5

    Que usted necesita para ir a través de cada elemento y eliminar
    Pseudo Código

    Set pointer to root
    While(pointer !=null)
    {
      temp=pointer->next;
      delete[] pointer;
      pointer = temp;
    }
    • error tipográfico? did you mean pointer = temp->next?
    • yup gracias
    • Tenga en cuenta que asignar un puntero a la temperatura, a continuación, elimine ese puntero.
    • ahora su diciendo eliminar no se puede convertir de llNode void*
    • Probar ahora. usted debe implementar un destructor para el nodo de la clase
    • Usted todavía necesita para establecer root a NULL cuando haya terminado.
    • Gracias, gracias, gracias! Lol, por alguna razón, no pude averiguar cómo hacerlo!

  2. -2

    Configuración root a NULL va a borrar toda la lista.

    void lList::clearAll() {
         root = NULL;
    }

    Usted dijo que se trató de esto. ¿Cómo es tu infracción de acceso sucediendo en este escenario?

    Cuidado: mi código contiene probablemente una pérdida de memoria! Usted probablemente tendrá que caminar a través de la lista y cancelar la asignación de cada elemento, a menos que su memoria se recupera mediante algún otro mecanismo.

    • ¿Cómo funciona la configuración de la raíz a NULL eliminar de la lista!
    • Esto hace que la lista vacía. Como en isFound volverá false para cualquier entrada.
    • Esto es absolutamente la respuesta incorrecta. Has dejado colgando punteros y pérdidas de memoria y todo tipo de cosas desagradables aquí sólo por la pérdida de una referencia a la raíz de tu lista, para no mencionar la palabra «eliminar» es incorrecta. Has más precisamente PERDIDO su lista
    • La OP del problema es una infracción de acceso, no una pérdida de memoria. Vamos a tratar de resolver el problema antes de arreglar todo lo que está mal. En cualquier caso, hasta que alguien me muestra la asignación de punto de llNodes, que no puedo resolver la pérdida de memoria correctamente.
    • Tienes razón, el OP es acerca de una infracción de acceso, sin embargo a decir que es el camino correcto para eliminar una lista es quitar el nodo raíz no es correcto y conduce a malas prácticas y futuros problemas por el camino.
    • todo depende de cómo llNodes son asignados, y, en particular, que es responsable de la eliminación de ellos. Yo soy un fan de mantener las asignaciones y elimina juntos, lo que significa que no me gusta tener este código delete la llNodes porque no new ellos. La persona que llama debe controlar que, o debe ser explícitamente delegadas a este código como parte de la API. Tal vez el autor de la llamada asignado una parte de ellos con new[]? No se puede hacer sin hacer suposiciones acerca de un código que no puede ver. Eso es lo que mi Cuidado: comentario es acerca de.
    • Tienes razón, usted debe mantener la asignación y eliminación localizada, sin EMBARGO, dejar caer la raíz, significa que ha perdido el resto de su lista. Ese es el problema.
    • código ha perdido el resto de la lista. Eso no significa que la persona que llama ha perdido todas las referencias. Si la persona que llama ha delegado la eliminación de esta clase, entonces sí, usted necesita para caminar la lista y eliminar todos los elementos. Pero tal vez la persona que llama tiene algunos asignado estáticamente llNodes? Tal vez ellos fueron asignados en una piscina de la memoria y que será lanzado después de que ha hecho uso de la lista? Tal vez el llNode es sólo un campo de una estructura más grande, y las estructuras se mantienen en alguna otra estructura de datos? Las posibilidades son infinitas…
    • Mi punto es que él definitivamente tiene que preocuparse acerca de la cancelación, pero dado que el código que he visto yo no puedo decirle cómo hacerlo. Yo apenas le advierten que se necesita para pensar acerca de ello.

Dejar respuesta

Please enter your comment!
Please enter your name here