Pregunta

Estoy escribiendo un programa en C ++ que implementa una lista doblemente enlazada que contiene un único carácter en cada nodo. Estoy insertando caracteres mediante la función de agregación:

doubly_linked_list adam;
adam.append('a');

Esta función se implementa como sigue:

//Append node
    node* append(const item c){

        //If the list is not empty...
        if(length){
            //maintain pointers to end nodes
            node* old_last_node = last;
            node* new_last_node = new node;

            //re-assign the double link and exit link
            old_last_node->next = new_last_node;
            new_last_node->back = old_last_node;
            new_last_node->next = NULL;

            //re-assign the last pointer
            last = new_last_node;
        }
        //If this is the first node
        else{
            //assign first and last to the new node
            last = first = new node;

            //assign nulls to the pointers on new node
            first->next = first->back = NULL;
        }

        //increase length and exit
        ++length;
        return last;
    }

Sin embargo, creo que hay un problema, tal vez con la forma en C ++ maneja caracteres. Cuando voy a imprimir mi lista, de alguna manera nunca consigo los caracteres a imprimir que he añadido a mi lista. Esto es lo que estoy utilizando para imprimir:

//Friendly output function
    friend std::ostream& operator << (std::ostream& out_s, const doubly_linked_list& source_list){
        //create iteration node pointer
        node* traverse_position = source_list.first;

        //iterate through, reading from start
        for(int i = 1; i <= source_list.length; ++i){
            //print the character
            out_s << (traverse_position->data);
            traverse_position = traverse_position->next;
        }

        //return the output stream
        return out_s;
    }

apenas consigo basura cuando lo imprimo. Se imprime caracteres que nunca adjuntas a mi lista - Ya sabes, sólo personajes simplemente desde algún lugar de la memoria. ¿Qué podría estar causando esto?

¿Fue útil?

Solución

Cuando se le asigna el valor c en la función append()? Temo que pueda haber concentrado demasiado en la parte lista doblemente enlazada y no lo suficiente en la parte de almacenamiento en datos. :)

Otros consejos

Como otros ya han mencionado, se le olvidó para almacenar los caracteres que supuestamente eran anexas. Es un error razonable hacer. Para evitar que en el futuro, puede dejar que el compilador de ayuda.

La mayoría de los compiladores ofrecen advertencias sobre cosas que son técnicamente bien, pero probablemente no son lo que realmente quiere hacer. En su caso, se declaró la c parámetro, pero nunca se utilizó. Con advertencias activada, el compilador podría haber dado cuenta de eso y le dijo que no la había usado. Que probablemente habría sido suficiente de un recordatorio para ti que no habían terminado de escribir esa función.

opción de GCC para permitir advertencias comunes es -Wall. (Eso es "W" para "advertencia", además de "todos", no tiene nada que ver con paredes Pero en realidad no es todos advertencias, tampoco.). Por ejemplo:

g++ -Wall list-program.cpp

Otros compiladores tienen opciones similares. Consulte la documentación del compilador para obtener más detalles.

En ninguna parte de su método append es lo que realmente colocar el elemento en el nuevo nodo. Cuando vaya a imprimir, sólo se imprime cualquier valor pasa a ser en la localización de memoria (un valor aleatorio).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top