elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Lista en C++ (Resuelto)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Lista en C++ (Resuelto)  (Leído 4,354 veces)
Franz1628

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Lista en C++ (Resuelto)
« 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.  


« Última modificación: 8 Julio 2011, 05:33 am por Franz1628 » En línea

Ve las cosas como son y no como tus emociones las colorean
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: Lista en C++
« Respuesta #1 en: 7 Julio 2011, 19:55 pm »

Tienes que hacer una prueba de escritorio con un diagrama de listas, sino te será dificil entenderlo.


En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Franz1628

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Re: Lista en C++
« Respuesta #2 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) :-\
En línea

Ve las cosas como son y no como tus emociones las colorean
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Lista en C++
« Respuesta #3 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: Lista en C++
« Respuesta #4 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.
En línea

Franz1628

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Re: Lista en C++
« Respuesta #5 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)

En línea

Ve las cosas como son y no como tus emociones las colorean
Franz1628

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Re: Lista en C++
« Respuesta #6 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 ;-)
En línea

Ve las cosas como son y no como tus emociones las colorean
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Resuelto]CMD Pipe en vb6
Programación Visual Basic
hepy_92 4 2,497 Último mensaje 26 Abril 2007, 14:30 pm
por byebye
resuelto
Programación Visual Basic
usuario oculto 2 2,390 Último mensaje 12 Enero 2009, 00:29 am
por usuario oculto
{Resuelto} [vbs] HTA.. ¬¬ « 1 2 »
Scripting
xassiz_ 10 8,437 Último mensaje 2 Octubre 2009, 21:50 pm
por kevlar
Cargar Lista de un fichero con fseek a una lista auxiliar en el programa.
Programación C/C++
samur88 1 3,319 Último mensaje 12 Mayo 2011, 23:25 pm
por samur88
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines