warnings

Iniciado por m@o_614, 21 Diciembre 2012, 01:08 AM

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

rir3760

Para imprimirlos en orden inverso se puede desarrollar una función recursiva, mas o menos así:
void imprimir_rev(struct nodo *p)
{
   if (p != NULL){
      imprimir_rev(p->sig);
     
      /* Imprimir informacion del nodo apuntado por p */
   }
}


Un saludo
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

muchas gracias twins y rir3760 por sus respuestas, disculpen si pregunto mucho lo que pasa es que este tema de punteros es de los que más se me dificulta

ahora quiero que en vez de que me ingrese los elementos por la cabeza me los ingrese por el final, pero tengo una duda, ya se que tengo que tener un puntero que recorra la lista desde la cabeza hasta que apunte a NULL (o sea el final) pero no se si hacerlo así:

NODO *ultimo;
    ultimo=*cabeza;
    while(ultimo->sig!=NULL)
       ultimo=ultimo->sig;


o así

NODO *ultimo;
    ultimo=*cabeza;
    while(ultimo!=NULL)
       ultimo=ultimo->sig;

en uno último tiene campo siguiente y en el otro no

rir3760

Cita de: m@o_614 en 29 Diciembre 2012, 00:19 AM
NODO *ultimo;
    ultimo=*cabeza;
    while(ultimo->sig!=NULL)
       ultimo=ultimo->sig;
Con esto el programa revienta al procesar una lista vacía.

Cita de: m@o_614 en 29 Diciembre 2012, 00:19 AMNODO *ultimo;
    ultimo=*cabeza;
    while(ultimo!=NULL)
       ultimo=ultimo->sig;
Y aquí no se actualizaría correctamente si, de nuevo, la lista esta vacía.

Para insertar un nodo al final:
void insertar_ultimo(struct nodo **p, struct nodo *nodo)
{
   while (*p != NULL)
      p = &(*p)->sig;
   
   *p = nodo;
}

Donde el primer argumento es la dirección en memoria de la variable que almacena la dirección en memoria del primer nodo (Ouch!), usualmente "&primero". El segundo argumento es la dirección en memoria del nodo a insertar.

Por ultimo y en el caso ideal cada función debe realizar una sola operación, por ejemplo la función que agrega pide los datos y llama a las funciones para 1) Crear un nodo y 2) Insertarlo en la lista.

Un saludo
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

saludos

tenías razón si tronaba el programa al querer insertar por el final ya que la lista está vacia, lo que hice fue primero comprobar si estaba vacía, ahora el programa ya compila perfectamente pero me gustaría agregar la función

int vacia(NODO *cabeza)
{
    if(cabeza==NULL)
       return 1;
    else
       return 0;
}


dentro de mi otra función, como una llamada para verificar si hay o no más elementos en la lista

void insertar_final(NODO **cabeza,int x)
{
    NODO *ultimo;
    if(*cabeza==NULL)//Aquí checa si está vacía
        *cabeza = crear_nodo(x);
    else
    {
        ultimo=*cabeza;
        while(ultimo->sig!=NULL)
           ultimo=ultimo->sig;

        ultimo->sig = crear_nodo(x);
        ultimo = ultimo->sig;
        ultimo->sig = NULL;
    }
}


pero el problema es que cabeza la tengo como doble puntero **cabeza y no sabría como hacerlo aunque en si ya imprime lo que le pido

gracias y feliz áño nuevo ;D