[C con Clase] Aclaracion punteros

Pablo Alejandro Herrero pablusplus en gmail.com
Mie Jul 20 16:04:01 CEST 2011


>
> un ejemplito de uso de punteros. Supongamos que quieres armar una
> estructura de datos dinámica, como ser una lista enlazada, doblemente
> enlazada, o un árbol, un grafo... en fin. Cada nodo está relacionado con
> otro de alguna manera, según que estructura sea. Una lista enlazada (simple)
> se vé así:
>
>           ┌─────┐
>           │nodo0│
>           └──┬──┘
>           ┌──┴──┐
>           │nodo1│
>           └──┬──┘
>           ┌──┴──┐
>           │nodo2│
>           └──┬──┘
>           ┌──┴──┐
>           │nodo3│
>           └──┬──┘
>           ┌──┴──┐
>           │nodo4│
>           └──┬──┘
>>             NULL
>
> bueno, el punto es que la linea que une un nodo con otro se implementa
> usando un puntero autorreferencial. Como es eso? Cuando se define la
> estructura, se agrega un puntero del mismo tipo que la estructura que se
> está definiendo. Queda así:
>
> struct NodoEjemplo{
>          /*... */
>
    NodoEjemplo  *siguiente;
>
};
>

entonces se arma así:
    NodoEjemplo *temp, *raíz = new NodoEjemplo;
   //insertamos primer elemento
   raiz->siguiente = (temp = new NodoEjemplo);
   temp->siguiente = NULL; //indicador de fin de lista...

   //Esta es la inserción de nuevos elementos...
   //se repite para cada elemento que se agregue.
   //Es lo mismo para insertar el primer elemento
   //solo que si la raíz fuera nula, entonces
   //insertamos sobre la raiz, sino sobre el último nodo...

   temp->siguiente = (temp new NodoEjemplo);
   temp->siguiente = NULL; //indicador de fin de lista...

Para recorrer la lista (siempre hacia adelante, porque es una lista enlazada
simple) se usa un bucle y se evalúa el puntero al siguiente elemento:

    if(raiz){   //en el código previo no llegamos a poner en nulo este
puntero
        for(NodoEjemplo *t = raiz; t->siguiente; t = t->siguiente);
    }

Las operaciones de inserción, eliminación, ordenamiento e iteración, se
encapsulan en sus respectivas funciones. Una vez hecho, trabajar con estas
estructuras es muy cómodo y la tienen muchas ventajas sobre un array pero
siempre depende para qué se quieran usar. La asignación es dinámica y no hay
mucha diferencia en velocidad de ejecución para los recorridos, tampoco
impacta mucho en memoria cuando se manejan nodos grandes. Hay muuuucha
bibliografía al respecto. Respecto al código QT que incuiste... al
programador se le ocurrió hacer una asignación dinámica, pero se podía hacer
con una variable directa... Espero te sirva!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20110720/9bb84fb6/attachment.html>


Más información sobre la lista de distribución Cconclase