• Sábado 14 de Diciembre de 2024, 17:53

Autor Tema:  Inicializar Un Nodo...  (Leído 3441 veces)

JrcsDev

  • Miembro MUY activo
  • ***
  • Mensajes: 245
  • Nacionalidad: ve
    • Ver Perfil
    • http://codigo7.wordpress.com/
Inicializar Un Nodo...
« en: Domingo 8 de Junio de 2008, 18:52 »
0
Tengo un nodo de la siguiente forma

Código: Text
  1.  
  2. typedef struct _nodo {
  3.      int dato;
  4.      struct _nodo *sgt;
  5. } tipoNodo, tipoLista;
  6.  
  7.  

para crear un nuevo nodo uso:
Código: Text
  1.  
  2. tipoNodo *Nuevo;
  3.  
  4.  

mi pregunta es... cómo debo inicializarlo??? he visto que por allí el uso del NEW, pero tambien he visto que usan el sizeof.... Espero me ayuden con esto... Gracias!
Sígueme en Twitter]
Donar comida a los chicos necesitados!
Todo lo puedo en Cristo que me fortalece...

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Inicializar Un Nodo...
« Respuesta #1 en: Domingo 8 de Junio de 2008, 21:23 »
0
Cita de: "x3mjr"
mi pregunta es... cómo debo inicializarlo??? he visto que por allí el uso del NEW, pero tambien he visto que usan el sizeof.... Espero me ayuden con esto... Gracias!

Eso depende, si estas usando C, debes usar malloc/free con sizeof, si usas C++, debes usar new/delete. Mi recomendacion seria el utilizar new/delete, pero eso depende de que estes viendo si C, o C++.

El sizeof te da el tamaño en memoria del dato/estructura, por ejemplo, si haces:

sizeof(int);

por lo regular te dara 2, porque 2 bytes es el tamaño de los int en memoria, en tu caso:

sizeof(tipoNodo)

te daria 4, 2 bytes del int, y 2 bytes del apuntador al nodo.

malloc necesita saber el tamaño de la memoria que debera apartar, es la razon de usar sizeof con malloc,  new no lo necesita, automaticamente sabe cuanta memoria apartar segun el tipo de dato.

Resumiendo, si usas C:

Código: Text
  1.  
  2. // Asignar espacio en memoria para el nodo
  3. tipoNodo *Nuevo = (tipoNodo*) malloc(sizeof(tipoNodo));
  4. // Liberar la memoria
  5. free(Nuevo);
  6.  
  7.  

Si usas C++
Código: Text
  1.  
  2. // Asignar espacio en memoria para el nodo
  3. tipoNodo *Nuevo = new tipoNodo;
  4. // Liberar la memoria
  5. delete Nuevo;
  6.  
  7.  

Hay otras ventajas del uso de new/delete sobre malloc/free, pero lo mejor es que busques tu mismo la respuesta en un libro de C/C++ ;)

Saludos :hola:

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

JrcsDev

  • Miembro MUY activo
  • ***
  • Mensajes: 245
  • Nacionalidad: ve
    • Ver Perfil
    • http://codigo7.wordpress.com/
Re: Inicializar Un Nodo...
« Respuesta #2 en: Domingo 8 de Junio de 2008, 21:51 »
0
Perfecto! estoy usando C++... gracias por tu ayuda xD ahora me surge otra duda... tengo un apuntador LISTA... ese debo iniciarlizarlo como LISTA=NULL???? o tambien debo hacer tipoLista LISTA=new tipoLista;????
Sígueme en Twitter]
Donar comida a los chicos necesitados!
Todo lo puedo en Cristo que me fortalece...

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Inicializar Un Nodo...
« Respuesta #3 en: Domingo 8 de Junio de 2008, 23:36 »
0
Pues lo mejor es inicializarlo con NULL, que significa nulo, es una forma de comprobar que no apunta a nada, una vez que quieras comenzar a guardar datos, entonces si, debes usar new, para asignarle espacio, mientras no uses new, tu variable no tiene espacio asignado, y es un error tratar de guardar datos en el, si lo haces, puedes corromper la memoria.

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

JrcsDev

  • Miembro MUY activo
  • ***
  • Mensajes: 245
  • Nacionalidad: ve
    • Ver Perfil
    • http://codigo7.wordpress.com/
Re: Inicializar Un Nodo...
« Respuesta #4 en: Lunes 9 de Junio de 2008, 20:21 »
0
Bueno, intentando e intentando... he logrado esto... pero por más que ingrese NODOS... cuando visualizo la lista, me aparece vacia... alguien puede ayudarme a dectar el error? gracias...

Código: Text
  1. #include<stdio.h>
  2. #include<iostream.h>
  3. #include<stdlib.h>
  4. typedef struct Tnodo{
  5.   int dato;
  6.   Tnodo *sgt;
  7. };
  8.  
  9. void menu();
  10. void imprimir(Tnodo *);
  11. void agregar1(Tnodo *);
  12. Tnodo *lista;
  13. char k;
  14. void main()
  15. {  lista=NULL;
  16.  
  17.   while (k!='7')
  18.   {   menu();
  19.     cin >> k;
  20.     if (k=='1')
  21.       agregar1(lista);
  22.     if (k=='5')
  23.       imprimir(lista);
  24.  
  25.   }
  26. }
  27. void menu()
  28. {   system("cls");
  29.   cout << "[MENU PRINCIPAL]" << endl;
  30.   cout << "1 >> AGREGAR NODO AL PRINCIPIO" << endl;
  31.   cout << "2 >> AGREGAR NODO AL FINAL" << endl;
  32.   cout << "3 >> AGREGAR NODO EN UN LUGAR ESPECIFICO" << endl;
  33.   cout << "4 >> ELIMINAR NODO" << endl;
  34.   cout << "5 >> IMPRIMIR LISTA" << endl;
  35.   cout << "6 >> VACIAR LISTA" << endl;
  36.   cout << "7 >> SALIR" << endl;
  37.   cout << "  >> [OPCION]: ";
  38.  
  39. }
  40. void agregar1(Tnodo *L)
  41. {   Tnodo *n=new Tnodo;
  42.   n=NULL;
  43.   n->dato=3;
  44.   n->sgt=L;
  45.   L=n;
  46. }
  47. void imprimir(Tnodo *L)
  48. {   Tnodo *I=new Tnodo;
  49.   I=L;
  50.   while (I)
  51.   {   cout << I->dato << endl;
  52.     I=I->sgt;
  53.   }
  54. }
  55.  

NOTA: solo he hecho esos 2 procedimientos, pero no me funcionan... y pues... no detecto el error, y he probado muchas cosas... incluso, el procedimiento agregar lo puse para q agregara un nodo con un 3... pero aun no me muestra nada... a quien pueda ayudarme, o se tome el tiempo para ver mi código, gracias!
Sígueme en Twitter]
Donar comida a los chicos necesitados!
Todo lo puedo en Cristo que me fortalece...

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Inicializar Un Nodo...
« Respuesta #5 en: Martes 10 de Junio de 2008, 03:12 »
0
Pues me temo que no, la insercion no es asi, al insertar un nodo es necesario "mover" los apuntadores, no basta con crear el nodo con new, tu como programador eres el encargado de "insertar" el nodo en el lugar correcto, esto puede variar, segun hagas insercion al frente, insercion en medio, o insercion al final de la lista, en el caso de insertar al frente debes:

1. Usar una variable que apunte al primer elemento de la lista, supongamos que llamas a esa variable cabeza, antes de insertar elementos, o sea, cuando la lista este vacia, debes hacer cabeza igual a null, eso te indicara que la lista esta vacia, valga la redundancia.

2. Creas el nodo.

3. haces que nodo->siguiente apunte al primer elemento de la lista (o sea, a cabeza)

4. haces que cabeza apunte al nuevo nodo

5. repites del 2 al 4, cada vez que insertes un nodo nuevo.

Código: Text
  1.  
  2. void agregar1(Tnodo **L)
  3. {  
  4.   Tnodo *n=new Tnodo;
  5.   n->dato=3;
  6.   n->sgt=*L;
  7.   *L=n;
  8. }
  9. void imprimir(Tnodo *L)
  10. {  
  11.   while (L!= NULL)
  12.   {  
  13.     cout << L->dato << endl;
  14.     L=L->sgt;
  15.   }
  16. }
  17.  
  18.  

En la wikipedia puedes encontrar mas informacion y un codigo en C para insercion al frente.

http://es.wikipedia.org/wiki/Lista_%28estructura_de_datos%29
El resto de inserciones busca en google, seguro encontraras ejemplos ;)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

Blind564

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Inicializar Un Nodo...
« Respuesta #6 en: Martes 10 de Junio de 2008, 03:37 »
0
pues para empezar en tu metodo de agrega1 tu cabecera de la lista tienes que pasarla por referencia ya que al momento de salir del metodo tu cabecera no sufre cambios y es por eso que tu lista siempre apunta a null y despues de eso ya puedes seguir las sugerencias de la repuesa anterior.

espero que te sirva de algo esto.

tu declarion del metodo seria algo asi:

void Agrega1(TNodo **Cabecera) y asi tu variable podra ser modificada dentro del metodo

JrcsDev

  • Miembro MUY activo
  • ***
  • Mensajes: 245
  • Nacionalidad: ve
    • Ver Perfil
    • http://codigo7.wordpress.com/
Re: Inicializar Un Nodo...
« Respuesta #7 en: Martes 10 de Junio de 2008, 05:05 »
0
Gracias Amigos! ahora sí funciona, seguí todas sus recomendaciones... Se les agradece...  :D
Sígueme en Twitter]
Donar comida a los chicos necesitados!
Todo lo puedo en Cristo que me fortalece...