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


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  cambiar for a do-while
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: cambiar for a do-while  (Leído 5,574 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
cambiar for a do-while
« en: 1 Noviembre 2013, 23:28 pm »

Saludos tengo la siguiente funcion que tiene un for el cual quiero convertirlo a un do-while, pero no se bien como hacerlo

Código
  1. void imprimirLista(Nodo *cabeza)
  2. {
  3.    Nodo *p,*ult;
  4.    for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
  5.    {
  6.        printf("%s\t",p->nombre);
  7.        printf("%d\t",p->edad);
  8.        printf("%s\n\n",p->ciudad_residencia);
  9.    }
  10. }
  11.  
  12. Nodo *fin(Nodo *cabeza)
  13. {
  14.    Nodo *ptr = cabeza;
  15.    while(ptr->sig!= NULL)
  16.        ptr = ptr->sig;
  17.    return ptr;
  18. }

el principal problema es que no se donde poner el p = p->sig en el do while?? probe con lo siguiente pero me marca errores

Código
  1. void imprimirLista(Nodo *cabeza)
  2. {
  3.    Nodo *p,*ult;
  4.    p = cabeza;
  5.    ult = fin(cabeza);
  6.    do
  7.    {
  8.        printf("%s\t",p->nombre);
  9.        printf("%d\t",p->edad);
  10.        printf("%s\n\n",p->ciudad_residencia);
  11.        p = p->sig;
  12.    }while(p!=ult);
  13. }

gracias


« Última modificación: 1 Noviembre 2013, 23:32 pm por m@o_614 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: cambiar for a do-while
« Respuesta #1 en: 2 Noviembre 2013, 03:00 am »

Tu función "fin" esta mal implementada ya que reventara si la lista esta vacía y la función para imprimir una lista con un bucle for:
Código
  1. void imprimirLista(Nodo *cabeza)
  2. {
  3.   Nodo *p,*ult;
  4.   for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
  5.   {
  6.       printf("%s\t",p->nombre);
  7.       printf("%d\t",p->edad);
  8.       printf("%s\n\n",p->ciudad_residencia);
  9.   }
  10. }
Imprimirá el contenido de todos los nodos menos el ultimo, en lugar de la función "fin" es mejor simplemente la comparación habitual "p != NULL").

Tampoco es una buena idea utilizar un bucle "do .. while" para imprimir la lista ya que el programa reventara en el mismo caso (lista vacía).

Si no tienes un curso de calidad sobre listas vinculadas puedes descargar uno cortesía de la Universidad de Stanford.

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
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: cambiar for a do-while
« Respuesta #2 en: 2 Noviembre 2013, 06:27 am »

gracias rir3760, de hecho ya me habia fijado que la funcion no me imprime el ultimo elemento de la lista, por esto pense que era buena idea hacer un do-while() porque como la condicion se realiza al final si me imprimiria el ultimo elemento y ya despues se saldria. y pues tambien quedaria pendiente lo de verificar que no este vacia, la funcion me imprimiria correctamente si en la funcion fin cambiara el p->sig!= NULL por p!=NULL, tal como me dijiste :

Código
  1. void imprimirLista(Nodo *cabeza)
  2. {
  3.    Nodo *p,*ult;
  4.    for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
  5.       printf("%d\t",p->elemento);
  6. }
  7.  
  8. Nodo *fin(Nodo *cabeza)
  9. {
  10.    Nodo *ptr = cabeza;
  11.    while(ptr!=NULL)
  12.        ptr = ptr->sig;
  13.    return ptr;
  14. }

solo que como tambien quiero hacer un CASE  para que tenga la opcion de ingresarme por el final, entonces a fuerzas tengo que hacer la comparacion while(p->sig !=NULL) porque p seria el puntero que apunta al ultimo elemento que es el que necesito para ingresar por la cola,por eso pense que necesitaba el do while a fuerzas,porque quiero que la funcion fin me regrese el puntero que en su campo siguiente tiene NULL, no se si me di a entender en esto ultimo, de todos modos gracias
« Última modificación: 2 Noviembre 2013, 06:35 am por m@o_614 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: cambiar for a do-while
« Respuesta #3 en: 2 Noviembre 2013, 16:25 pm »

la funcion me imprimiria correctamente si en la funcion fin cambiara el p->sig!= NULL por p!=NULL, tal como me dijiste:

Código
  1. void imprimirLista(Nodo *cabeza)
  2. {
  3.    Nodo *p,*ult;
  4.    for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig)
  5.       printf("%d\t",p->elemento);
  6. }
  7.  
  8. Nodo *fin(Nodo *cabeza)
  9. {
  10.    Nodo *ptr = cabeza;
  11.    while(ptr!=NULL)
  12.        ptr = ptr->sig;
  13.    return ptr;
  14. }
Con todo respeto tu función "fin" no tiene sentido ya que ella siempre retornara NULL y para ese caso y como ya te comente antes simplemente usa "p != NULL".

solo que como tambien quiero hacer un CASE  para que tenga la opcion de ingresarme por el final
Para agregar un nodo al final de una lista bien la recorres hasta encontrar el ultimo o tomas nota de los nodos primero y ultimo cuando agregas/eliminas un nodo. En tu caso lo mejor por sencillo es utilizar la primera forma.

Y como ya te comente en mi mensaje anterior ponte a practicar el uso de listas, empieza con la introducción (Linked List Basics) y continuas con los ejercicios (Linked List Problems).

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como cambiar el registro de w98se para cambiar el lugar de un archivo de sistema
Windows
carlosega 5 5,394 Último mensaje 19 Enero 2011, 15:56 pm
por Randomize
cambiar de posicion en el grid al cambiar el recordset en tiempo de ejecucion
Programación Visual Basic
choquito 0 2,471 Último mensaje 25 Mayo 2007, 01:22 am
por choquito
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines