[C con Clase] Duda con estructura dinamica

tataraperz koreano_87 en hotmail.com
Mie Ago 15 01:24:10 CEST 2007


From:  ori_ganduxe Ganduxé Pregona<oriol_ganduxe en hotmail.com>
Reply-To:  Lista de correo sobre C y C++ <cconclase en listas.conclase.net>
To:  cconclase en listas.conclase.net
Subject:  [C con Clase] Duda con estructura dinamica
Date:  Mon, 13 Aug 2007 07:25:34 +0000

>Buenas, soy nuevo en la lista y hace poco que he empezado con C++, así que
>no creo que les resulte muy dificil la duda que tengo:
>
>Estoy practicando el uso de estructuras dinamicas y he hecho una función
>para insertar un valor al final de la lista. El problema creo que se
>encuentra aquí pues si lo saco no me da error.
>El programa compila correctamente pero al reproducir me sale el tipico
>mensaje de "enviar errores" de windows. Muchas gracias por todo.
>
>void insertar_al_final(struct node *&p){
>
>node *nou_node;
>node *aux = p;
>
>nou_node = new node;
>
>      cout << "Inserta el valor: ";
>      cin >> nou_node->numero;
>
>      nou_node->seguent = NULL;
>
>      while(aux->seguent != NULL)         aux = aux->seguent;
>
>      aux->seguent = nou_node;
>
>}

El error esta en el parametro de la funcion, estas definiendo una estructura en la lista de parametros de la funcion insertar_al_final( ), para pasar estructuras como parametros simplemente necesitas poner el nombre de la estructura como si fuera cualquier tipo base(int,char,long,etc.). Quedaría así:

void insertar_al_final(node *&p){...}  

Donde "*&p" lo veo algo redundante, al momento de pasar un puntero si modificas el valor de esa direccion seria lo mismo que si pasaras la referencia, se modificaria la variable exterior a la funcion. Sería suficiente que declararas algo como:

void insertar_al_final(node *p){...} // pasa un puntero apuntando a una variable de tipo node

en caso de que la variable que vayas a pasar a la funcion no sea un puntero deberias declararla de la siguiente forma:

void insertar_al_final(node &p){...} //pasa una referencia de una variable de tipo node

No creo que definieras esa estructura a proposito en la lista de parametros de la función, porque en las lineas siguientes tienes declaraciones como "nou_node->segment","nou_node->numero",etc, que son variables que en ningun momento has declarado para esa estructura.

Luego:

>node *nou_node; //declara un puntero a una variable de tipo node
>node *aux = p; /*declara un puntero que apunta a la misma direccion que p,por lo > que modificaciones  permaneceran*/

>nou_node = new node; //reserva espacio para una variable de tipo node
>
>      cout << "Inserta el valor: ";
>      cin >> nou_node->numero; //numero guarda el valor que se inserte, ya sea en tipo int o char[] no lo se
>
>      nou_node->seguent = NULL; //el puntero a char(a menos eso supongo) seguent es una cadena vacia
>
>      while(aux->seguent != NULL)         aux = aux->seguent; 

loop infinito a menos que p->seguent contenga una cadena no nula, ademas la asignacion es invalida


>      aux->seguent = nou_node; //asignacion invalida;
>
>}

Entonces en conclusion los errores que tienes son la declaracion de parametros de la funcion, tienes un potencial loop infinito, y ademas las asignaciones que quieres realizar no son posibles a menos que sobracargues el operador de asignacion para que supiera como pasar de tipo node a X o viceversa, son invalidas:

aux = aux->seguent; 

no valido, el compilador no sabe pasar del tipo que tengas la variable seguent a tipo node.

Tambien te olvidaste de liberar la memoria dinamica que creaste, debias haber añadido algo asi:

delete nou_node;



Más información sobre la lista de distribución Cconclase