Autor Tema: Creando un nodo en C++

0 Usuarios y 1 Visitante están viendo este tema.

19 Noviembre, 2009, 06:16 pm
Leído 24321 veces

Watt

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 328
  • Karma: +0/-0
  • Sexo: Masculino
  • Dos numeros manejan el mundo?
Hola que tal,  el tema es el siguiente cuando defino un nodo en C++ este esta compuesto por la parte info y un puntero al nodo siguiente, el tema es que en el main cuando creo un puntero a un nodo y quiero que este apunte a NULL simplemente me tira varios errores, que la verdad no los entiendo.

Este el codigo en cuestion es muy corto y solo es para probar.
Código: [Seleccionar]
#include<iostream>

using namespace std;

//Definimos lo que es un nodo
typedef struct
{
int info;
*nodo siguiente;
}nodo;

int main(void)
{
*nodo j;
j=NULL;

cin.get();

return 0;
}

Desde ya gracias y saludos.

20 Noviembre, 2009, 02:38 am
Respuesta #1

topo23

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 937
  • Karma: +0/-0
La forma correcta de declarar una estructura autoreferente en C es la siguiente:

Código: [Seleccionar]
struct nodo {
  int info;
  struct nodo* siguiente;
};
typedef struct nodo Nodo;
int main()
{
  Nodo* j = new Nodo;
  j->siguiente = new Nodo;
  Nodo* k = j->siguiente;
  j->siguiente = NULL;
  delete k;
  delete j;
  j = NULL;
  return 0;
}

.

20 Noviembre, 2009, 03:57 pm
Respuesta #2

Watt

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 328
  • Karma: +0/-0
  • Sexo: Masculino
  • Dos numeros manejan el mundo?
Hola topo, gracias por la respuesta, ahora he creado 3 funciones de lista, la primera es "crearLista" que solo devuelve un puntero NULL , la segunda es "esListaVacia" que solo te dice si el puntero apunta a NULL, hasta aqui funcionan bien, pero he creado otra que se llama primerElementoLista que lo que hace es justamente ponerle un nodo a la lista vacía, pero si ejecuto otra vez esta misma función no da error, que puede ser ?

Código: [Seleccionar]

#include<iostream>

using namespace std;

//Definimos lo que es un nodo
struct nodo {
  int info;
  struct nodo* siguiente;
};

//Defino mas corto el nombre para el nodo
typedef struct nodo Nodo;

//Defino lo que es un puntnodo
typedef Nodo* puntnodo;

/***FUNCIONES DE LISTA SIMPLE ENLAZADA***/


//Funcion crear Lista
puntnodo crearLista(void)
{
return NULL;
}

//Funcion de la lista vacia
bool esListaVacia(puntnodo j)
{
if( j == NULL )
   return true;
else
return false;
}

//Funcion para insertar primer elemento
void primerElementoLista(puntnodo j,int e)
{
if( esListaVacia(j)==true )
{
Nodo x; //Seria lo equivalente a el "getNodo"
x.info=e;
x.siguiente=NULL;
j=&x;  //Que "j" apunte a x , por eso le puse el "&"
}
else
cout << "ERROR, esta lista no esta vacia";
}

int main()
{
 
  puntnodo j = new Nodo;
  j=crearLista();              //Aca "j" apunta solo a NULL
  primerElementoLista(j,19);   //Aca "j" apunta a un nodo  que contiene el 19
  primerElementoLista(j,21);   //Esto deberia dar "error" y no da :S
 

 
 
  cin.get();
  return 0;
}



20 Noviembre, 2009, 08:26 pm
Respuesta #3

topo23

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 937
  • Karma: +0/-0
Código: [Seleccionar]
//Funcion para insertar primer elemento
void primerElementoLista(puntnodo j,int e)
{
if( esListaVacia(j)==true )
{
Nodo x; //Seria lo equivalente a el "getNodo"
x.info=e;
x.siguiente=NULL;
j=&x;  //Que "j" apunte a x , por eso le puse el "&"
}
else
cout << "ERROR, esta lista no esta vacia";
}

El problema es que estas pasando j por valor, en c++ si quieres modificar un objeto lo tienes que pasar por referencia, o un puntero.

Tienes el problema adicional que estas guardando la direccion de una variable temporaria, este objeto se va a destruir cuando termine la funcion, y tu variable va a quedar apuntado a cualquier lado.

Código: [Seleccionar]
//Funcion para insertar primer elemento
void primerElementoLista(puntnodo& j,int e)
{
if( esListaVacia(j)==true )
{
Nodo* x = new Nodo;
x->info=e;
x->siguiente=NULL;
j=x;
}
else
cout << "ERROR, esta lista no esta vacia";
}

.

21 Noviembre, 2009, 04:44 am
Respuesta #4

Watt

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 328
  • Karma: +0/-0
  • Sexo: Masculino
  • Dos numeros manejan el mundo?
Que te parece esta correcion ?

Código: [Seleccionar]

puntnodo crearLista(void)
{
return NULL;
}

//Funcion de la lista vacia
bool esListaVacia(puntnodo j)
{
if( j == NULL )
   return true;
else
return false;
}

void primerElemento(puntnodo *j,int e)
{
if( esListaVacia(*j) )
{
Nodo x;
x.info=e;
x.siguiente=NULL;
*j=&x;
}
else
{
cout << "ERROR, no es una lista vacia";
}

}

int main()
{
 
  puntnodo j = new Nodo;
  j=NULL;
  primerElemento(&j,20);
  primerElemento(&j,19);

  cout << "\nEs lista vacia (si da 1 si es,0 no)? " << esListaVacia(j) << "\n";

 
  delete(j);
  cin.get();
  return 0;
}


Compila se ejecuta y anda pero tira un error mientras se ejecuta que dice "Debug Assertion Failed", y tengo que abortar el programa.

P.D. Puse 2 veces la función "primerElemento" para ver si la segunda comunica que no puede hacerlo y justamente lo hace así que ahí anda bien, después me dice que la lista no esta vacía, eso también lo esperaba pero después salta ese error que te comente antes.

21 Noviembre, 2009, 05:49 am
Respuesta #5

topo23

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 937
  • Karma: +0/-0
Código: [Seleccionar]
if( esListaVacia(*j) )
{
Nodo x;
x.info=e;
x.siguiente=NULL;
*j=&x;
}
}

Como te indique antes x es una variable temporaria que se va a destruir cuando salgas de la funcion, entonces j queda apuntando a una direccion invalida.

Código: [Seleccionar]
int main()
{
 
  puntnodo j = new Nodo;
  j=NULL;
}

Hacer new Nodo no es necesario, porque inmediatamente lo sobre escribes con NULL.

Citar
Compila se ejecuta y anda pero tira un error mientras se ejecuta que dice "Debug Assertion Failed", y tengo que abortar el programa.

Fijate si tu IDE tiene una ventana llamada debug output, u output window, alli deberia aparecer mas informacion sobre el problema, por ejemplo el numero de linea/archivo donde sucede el assert, sin eso es muy dificil saber que esta pasando.
.

22 Noviembre, 2009, 04:01 pm
Respuesta #6

Watt

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 328
  • Karma: +0/-0
  • Sexo: Masculino
  • Dos numeros manejan el mundo?
Voy a reenplantear esto, como harias vos para insertar un primer elemento a la lista "j" que apunta a NULL.

Código: [Seleccionar]

int main()
{
     puntnodo j=crearLista(); //Seria lo mismo que poner j=NULL
     primerElemento(j,20);     //Aca "j" apunta a un nodo que contiene 20, y el siguiente de ese                                          /                                     //nodo es nulo
 }

Te parece correcto así ahora ?. Pase como puntero al puntero.

Código: [Seleccionar]

void primerElementoLista(puntnodo *j,int e)
{
puntnodo p=new Nodo;
p->info=e;
p->siguiente=NULL;
*j=p;
}


22 Noviembre, 2009, 08:59 pm
Respuesta #7

topo23

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 937
  • Karma: +0/-0
Te recomiendo este apunte para ver algo sobre "Tipos de Datos Abstractos", que es como se conocen este tipo de estructuras

http://www.ldc.usb.ve/~gabro/teaching/CI2126/TADPilaLista.pdf

Si buscas en google "Tipos de Datos Abstractos" vas a encontrar varios tutoriales instructivos.
.

22 Noviembre, 2009, 09:41 pm
Respuesta #8

Watt

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 328
  • Karma: +0/-0
  • Sexo: Masculino
  • Dos numeros manejan el mundo?
Si lo conozco bien el tad "listas", lo que pasa es que vi todas las funciones en pascal y las trato de pasar a C++.