Estás en: Inicio >> Foros >> Informática >> Programación
Programación /

[C] Listas

Participa en el tema [C] Listas en el foro Programación.
Les hago una consulta, el siguiente programa agrega 4 elementos a una lista y los ...

Buscar en este tema:
 
  •  
    nicronar escribió el 08/09/2005 a las 00:46 hs.
     
    ¿Mensaje inapropiado?
    #1 [C] Listas
    Les hago una consulta, el siguiente programa agrega 4 elementos a una lista y los ordena a medida que los va ingresando. Mi preguntas son: ¿Para qué en la función Insertar y Borrar se usa un puntero a puntero(**)?¿Por qué al llamar a las funciones Insertar y Borrar se pasa &lista (por qué se tiene que pasar de esa manera y no como lista solo)?. ¿Cuándo uno pasa un puntero a una función y cambia hacia donde apunta una vez que sale de esa función conserva el cambio (pasado por referencia)?Desde ya, Muchas Gracias.

    CÓDIGO
    http://http://c.conclase.net/edd/index.php?cap=001f#1_9 al final donde dice"Código del Ejemplo Completo"


    <H3>

    </H3>
    +
     
    0
    Me gusta
     
    http://www.psicofxp.com/forums/programacion.313/278722-c-listas.html
    | Más
  • Scalls escribió el 08/09/2005 a las 09:50 hs. ¿Mensaje inapropiado?

    #2 Re: Listas

    No veo donde use un puntero a puntero, lo que hace es pasar por referencia la lista &lista (& significa la direccion de memoria de lista) y la funcion borrar/insertar la trae con *lista (que significa el contenido de lista) y lista como fue pasada con la direccion de memoria para recojer el registro se debe usar el *lista. Si uno pasa un puntero por referencia y cambia a donde apunta conserva el cambio, si...

    Espero haberte respondido a corde,,, mucho no te entendi... cualquier cosa avisa
    Me gusta este mensaje
  • MaTT escribió el 08/09/2005 a las 12:01 hs. ¿Mensaje inapropiado?

    #3 Re: Listas

    pone bien el link al codigo, o escribilo en el post, sino no te podemos ayudar.
    la esxplicacion de xq usas el &lista ya te la dio Scalls, el ** se usa xq en tu lista en realidad, no hay elementos reales sino punteros, por eso, cuando queres acceder a un dato/elemento de la lista, ya sea para insertarlo o eliminarlo tenes q referirte como **lista(indice).

    saluT

    PD: subi el codigo
    Me gusta este mensaje
  • nicronar escribió el 08/09/2005 a las 13:56 hs. ¿Mensaje inapropiado?

    #4 Re: Listas

    Envío el Código, Gracias.
    Archivos adjuntos
    Tipo de archivo: txt Codigo.txt (2.6 KB, 25 vistas)
    Me gusta este mensaje
  • MaTT escribió el 08/09/2005 a las 18:03 hs. ¿Mensaje inapropiado?

    #5 Re: Listas

    ahora te respondo bien:

    ¿Para qué en la función Insertar y Borrar se usa un puntero a puntero(**)?
    tanto en insertar como en borrar veo un solo *, y esta bien asi

    ¿Por qué al llamar a las funciones Insertar y Borrar se pasa &lista (por qué se tiene que pasar de esa manera y no como lista solo)?
    xq las estas pasando por referencia, entonces tenes q pasarle la direccion de memoria.
    &lista te devuelve la direccion de memoria de lista cuando llamas a la funcion y pasas eso
    Insertar(&lista, 20); estas diciendole cual es la posicion de memoria donde esta lista
    si te fijas tu funcion es
    void Insertar(Lista *lista, int v)
    donde *lista indica q eso es un puntero a un objeto de tipo Lista, como habias pasado la direccion de memoria cuando la llamas desde el programa principal haciendo Insertar(&lista,20), esto entra al dato q esta en esa posicion de memoria y q es de tipo Lista
    supone q tu lista esta en la posicion de memoria esta en la posicion 0000:1234 de memoria
    Insertar (&lista, 20) esta pasando como parametros
    en int v, 20
    y en &lista, 0000:1234

    cuando la funcion toma estos parametros los lee asi:
    a v como 20
    y a *lista, lee 0000:1234 y ve q hay un objeto de tipo lista en esa posicion

    ¿Cuándo uno pasa un puntero a una función y cambia hacia donde apunta una vez que sale de esa función conserva el cambio (pasado por referencia)?
    si esta pasado por referencia si, xq cuando pasas por referencia pasas una direccion de memoria, como te explique en la anterrior, si vos en la funcion cambiarias &lista=0000:2345, y te fijas q hay en *lista, ves q contiene lo q este almacenado en esa direccion de memoria.

    espero haber explicado. cualquier cosa volve a explicar

    PD: trata de la proxima vez subir el codigo de forma legible

    Código:
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct _nodo
     {
      int valor; struct _nodo *siguiente;
     }tipoNodo;
    typedef tipoNodo *pNodo;
    typedef tipoNodo *Lista;
    
    /* Funciones con listas: */
    
    void Insertar(Lista *l, int v);
    void Borrar(Lista *l, int v);
    int ListaVacia(Lista l);
    void BorrarLista(Lista *);
    void MostrarLista(Lista l);
    
    int main()
    {
     Lista lista = NULL;
     pNodo p;
     Insertar(&lista, 20);
     Insertar(&lista, 10);
     Insertar(&lista, 40);
     Insertar(&lista, 30);
     MostrarLista(lista);
     Borrar(&lista, 10);
     Borrar(&lista, 15);
     Borrar(&lista, 45);
     Borrar(&lista, 30);
     Borrar(&lista, 40);
     MostrarLista(lista);
     BorrarLista(&lista);
     getchar();
     return 0;
    }
    
    void Insertar(Lista *lista, int v)
    {
     pNodo nuevo, anterior; /* Crear un nodo nuevo */
     nuevo = (pNodo)malloc(sizeof(tipoNodo));
     nuevo->valor = v; /* Si la lista está vacía */
     if(ListaVacia(*lista) || (*lista)->valor > v)
      { /* Añadimos la lista a continuación del nuevo nodo */
    	 nuevo->siguiente = *lista;
     /* Ahora, el comienzo de nuestra lista es en nuevo nodo */
    	*lista = nuevo;
      }
     else
      { /* Buscar el nodo de valor menor a v */
       anterior = *lista; /* Avanzamos hasta el último elemento o hasta que el siguiente tenga un valor mayor que v */
       while(anterior->siguiente && anterior->siguiente->valor <= v)
    	{
    	 anterior = anterior->siguiente; /* Insertamos el nuevo nodo después del nodo anterior */
    	}
       nuevo->siguiente = anterior->siguiente;
       anterior->siguiente = nuevo;
      }
    }
    
    void Borrar(Lista *lista, int v)
    {
     pNodo anterior, nodo;
     nodo = *lista;
     anterior = NULL;
     while(nodo && nodo->valor < v)
      {
       anterior = nodo;
       nodo = nodo->siguiente;
      }
     if(!nodo || nodo->valor != v)
       return;
     else
      { /* Borrar el nodo */
       if(!anterior) /* Primer elemento */
    	 *lista = nodo->siguiente;
       else /* un elemento cualquiera */
    	 anterior->siguiente = nodo->siguiente;
       free(nodo);
      }
    }
    
    int ListaVacia(Lista lista)
    {
     return (lista == NULL);
    }
    
    void BorrarLista(Lista *lista)
    {
      pNodo nodo;
      while(*lista)
       { nodo = *lista;
    	 *lista = nodo->siguiente;
    	 free(nodo);
       }
    }
    
    void MostrarLista(Lista lista)
    {
     pNodo nodo = lista;
     if(ListaVacia(lista))
       printf("Lista vacía\n");
     else
     {
      while(nodo)
       {
    	printf("%d -> ", nodo->valor);
    	nodo = nodo->siguiente;
       }
      printf("\n");
     }
    }
    
    SaluT
    Me gusta este mensaje
  • nicronar escribió el 09/09/2005 a las 15:00 hs. ¿Mensaje inapropiado?

    #6 Re: Listas

    Primero que nada, Muchas Gracias por su tiempo. Por lo que ví en el Código el tipo Lista ya es un puntero a TipoNodo, con lo que al definir una funcion como void Insertar(Lista *l, int v) l seria un puntero de tipo puntero a TipoNodo es decir un puntero de puntero. Otra duda es cuando paso un puntero como parametro. Por lo que yo tenía entendido al pasar el nombre del puntero y definir el protoripo de la funcion como Funcion(tipo_base *) ya te modificaba el puntero sin la necesidad de pasarlo con &. Bueno esas siguen siendo mis dudas. Desde ya, Muchas Gracias.
    Me gusta este mensaje
  • MaTT escribió el 11/09/2005 a las 18:30 hs. ¿Mensaje inapropiado?

    #7 Re: Listas

    Por lo que ví en el Código el tipo Lista ya es un puntero a TipoNodo, con lo que al definir una funcion como void Insertar(Lista *l, int v) l seria un puntero de tipo puntero a TipoNodo es decir un puntero de puntero.
    es cierto, l es un puntero a un puntero de tipo TipoNodo.

    Otra duda es cuando paso un puntero como parametro. Por lo que yo tenía entendido al pasar el nombre del puntero y definir el protoripo de la funcion como Funcion(tipo_base *) ya te modificaba el puntero sin la necesidad de pasarlo con &.
    no entiendo para q queres modificar el puntero, la cosa es asi, como la funcion esta definida como Funcion (tipo_base *), la funcion espera recibir una direccion de memoria. tu programa esta estructurado para trabajar con el puntero a una variable de tipo Lista, si no modificas el contenido de Funcion, en este caso seria Insertar y Borrar, tenes q poner el &. a ver si me explico:

    esta es la declaracion de la funcion:

    void Insertar (Lista *, int );

    esta es la funcion:

    void Insertar (Lista *lista, int v)
    {
    pNodo nuevo, anterior;
    nuevo = (pNodo)malloc(sizeof(tipoNodo));
    nuevo->valor = v;
    if(ListaVacia(*lista) || (*lista)->valor > v)
    {
    nuevo->siguiente = *lista; //nuevo->siguiente= lo q apunta lista.
    *lista = nuevo; //aca cambias el valor de lista.
    }
    else
    {
    anterior = *lista; //anterior = lo q apunta lista.
    while(anterior->siguiente && anterior->siguiente->valor <= v)
    {
    anterior = anterior->siguiente;
    }
    nuevo->siguiente = anterior->siguiente;
    anterior->siguiente = nuevo;
    }
    }

    el tema de la no omision del & esta en q en la funcion declaras *lista. y usas durante toda la funcion *lista, por eso no podes omitir el & cuando pasas el parametro desde tu programa cliente.

    saluT, espero haber explicado mejor
    Me gusta este mensaje
Estás en: Inicio >> Foros >> Informática >> Programación


Estadísticas del tema
  • 6 RESPUESTAS
  • 1707 VISTAS
  • 3 USUARIOS RESPONDIERON
 
Ir arriba
Contacto | Acerca de | Ayuda | Términos Legales | privacidad | Pautas de convivencia | Mapa de los foros | TrabajÁ con nosotros
©2008 Psicofxp.com S.A. - Todos los derechos reservados
Certifica IAB