Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Franz1628 en 7 Julio 2011, 19:49 pm



Título: Lista en C++ (Resuelto)
Publicado por: Franz1628 en 7 Julio 2011, 19:49 pm
Este es un ejemplo de insertar un nodo a una lista en forma ordenada pero en la parte de la funcion insertarNodo (en la parte de  "else" no veo como cambia el *cab para que se haya ingresado el NODO)

El codigo si funciona pero esa parte es la que no entiendo ,supongo que esta parte de :
neo->sgte = p->sgte;
p->sgte = neo;
"Pero esto como afectaria *cab ???"
Si alguien tiene alguna idea se lo agradecería  ;)

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <conio.h>
  5.  
  6. using namespace std;
  7.  
  8. typedef int TD;
  9.  
  10. struct NODO {
  11.   TD valor;
  12.   NODO *sgte;
  13. };
  14.  
  15. void crearLista(NODO **cab);
  16. void insertarNodo(NODO **cab, int dato);
  17. void mostrarLista(NODO *cab);
  18. int listaVacia(NODO *cab);
  19.  
  20.  
  21. int main()
  22. {
  23.   NODO *A;
  24.   crearLista(&A);
  25.  
  26.   insertarNodo(&A, 20);
  27.   insertarNodo(&A, 30);
  28.   insertarNodo(&A, 5);
  29.   insertarNodo(&A, 80);
  30.   insertarNodo(&A, 34);
  31.   insertarNodo(&A, 10);
  32.  
  33.   mostrarLista(A);
  34.  
  35.   system("PAUSE");
  36.   return 0;
  37. }
  38.  
  39. void crearLista(NODO **cab)
  40. {
  41.   *cab=NULL;
  42. }
  43. //Inserta elmentos en forma ordenada
  44. void insertarNodo(NODO **cab, int dato)
  45. {
  46.   //NODO nuevo, anterior;
  47.   NODO *neo, *p;
  48.  
  49.   neo = (NODO*)malloc(sizeof(NODO));
  50.   neo->valor = dato;
  51.  
  52.   // Si la lista está vacía
  53.   if(listaVacia(*cab) || (*cab)->valor > dato) {
  54.      //Añadimos la lista a continuación del nuevo nodo
  55.      neo->sgte = *cab;
  56.      //Ahora, la lista tiene un nuevo nodo
  57.      *cab = neo;
  58.   }
  59.   else {
  60.      // Buscar la posicion adecuiada para el nuevo  nodo
  61.      p = *cab;
  62.  
  63.      // Busca la posicion adecuada para dato
  64.      while(p->sgte && p->sgte->valor <= dato){
  65.         p = p->sgte;
  66.  
  67.      }  
  68.  
  69.      neo->sgte = p->sgte;
  70.      p->sgte = neo;
  71.   }
  72. }
  73.  
  74. void mostrarLista(NODO *cab)
  75. {
  76.   NODO *p = cab;
  77.  
  78.   if(listaVacia(p))
  79.      printf("Lista vacía\n");
  80.   else {
  81.      while(p) {
  82.         printf("%d -> ", p->valor);
  83.         p = p->sgte;
  84.     }
  85.     printf("\n");
  86.   }
  87. }
  88.  
  89. int listaVacia(NODO *cab)
  90. {
  91.   return (cab == NULL);
  92. }
  93.  
  94.  


Título: Re: Lista en C++
Publicado por: leogtz en 7 Julio 2011, 19:55 pm
Tienes que hacer una prueba de escritorio con un diagrama de listas, sino te será dificil entenderlo.


Título: Re: Lista en C++
Publicado por: Franz1628 en 7 Julio 2011, 20:13 pm
Bueno lo estoy haciendo en un papel algo asi

por ejemplo ya habiendo ingresado algunos valores

mi *cab tendria  10->13->

ahora al ingresar por ejemplo dato = 15 (pasaría esto)

entraría a la función insertarNodo  dando a neo->dato = 15  ahora entraría en la parte de else porque no es vacía la lista)

ahora dando p = *cab;   

"p"  sería  10->13->  (entonces p->sgte sería   13->  &&  p->sgte->dato sería 13 )

ahora entrando al while (entraria al while ya que  13 es <= 15)

entonces p = p->sgte   entonces  p sería 13->  (y p->sgte sería NULL  con esto ya no entra denuevo al while)

despues se hace:  neo->sgte = p->sgte;  (con esto neo->sgte = NULL)
y neo sería   15->  ya que  neo->dato le dimos 15
despues se hace:  p->sgte = neo; (con esto p->sgte = 15->)
con esto p sería 13->15->  y terminó

Pero donde cambia *cab ?? (se supone que eso hay que modificar !) (a menos que con el p estamos cambiando dentro del *cab )(no entiendo la verdad) :-\


Título: Re: Lista en C++
Publicado por: rir3760 en 7 Julio 2011, 20:16 pm
Este es un ejemplo de insertar un nodo a una lista en forma ordenada pero en la parte de la funcion insertarNodo (en la parte de  "else" no veo como cambia el *cab para que se haya ingresado el NODO)

El codigo si funciona pero esa parte es la que no entiendo ,supongo que esta parte de :
neo->sgte = p->sgte;
p->sgte = neo;
"Pero esto como afectaria *cab ???"
No lo afecta y ese es el punto.

En la función de inserción primero se revisa si el nuevo nodo debe colocarse como primero, si es así se utiliza "*cab" para modificar el puntero al primer nodo de la lista (la variable "A" de la función "main").

Si no debe insertarse como primero basta con actualizar los punteros "sig" del nodo que corresponda (alguno después del primero) y del nuevo nodo.

Un saludo


Título: Re: Lista en C++
Publicado por: Khronos14 en 7 Julio 2011, 20:20 pm
En C++ puedes usar *& en los parámetros de tus funciones, en vez de ** para pasar la referencia de un puntero.

Saludos.


Título: Re: Lista en C++
Publicado por: Franz1628 en 7 Julio 2011, 20:57 pm
p=*cab ; eso esta bien
Pero lo que no entiendo es que despues se le da a p = p->sgte y modificando el p se modifica el  *cab (eso es muy extraño)



Título: Re: Lista en C++
Publicado por: Franz1628 en 8 Julio 2011, 05:27 am
Bueno gracias a sus respuestas  ya entendí lo que pasaba
que el *cab era tenias todos los datos y era que solo tenia un dato y un puntero a otro nodo  :xD

Gracias ;-)