Usando listas enlazadas D:

Started by HenBanKeN, June 17, 2011, 02:18:56 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

HenBanKeN

Bueno, he estado usando el buscador para ver qué encuentro sobre listas enlazadas. Y lo que he leído me ha confundido, más que aclararme la forma en que debería hacer una lista.

En C, recuerdo que hacía algo que se supone que en Bennu debería escribir así:

TYPE tp_nodo
    tp_caca dato;
    tp_nodo*sgte;
END


(tp_caca es un tipo cualquiera  ::) )
Luego, creaba algunas funciones para agregar y quitar nodos, buscar un dato en una lista, buscar una posicion en la lista, etc etc.
Ya no recuerdo bien, pero para agregar un nodo usaba un alloc(sizeof(tp_nodo)), para eliminar usaba free(), y en general ese tipo de trabajo hacía.

Ahora, leyendo los temas que vi en el buscador, encontré varias formas un poco diferentes de la que yo acabo de exponer, tambien se hablaba de una funcion realloc, y otras cosillas.

Alguien me podría explicar qué está pasando? O al menos, decirme si mi forma de usar listas enlazadas es funcional aquí en Bennu.

También leí que uno podía luego hacer mención a un nodo de la lista, sólo escribiendolo como sgte[3], por ejemplo.... aunque ya no estoy muy seguro. Esto no se podía hacer en C, me parece.

Alguien que me eche una luz :3 saludos y gracias!
Aún aprendiendo a manejar mis herramientas...

Drumpi

Veo que ya has visto cómo se hace en el código que usé para la lista enlazada se STRINGs.
Básicamente esa es la forma correcta de hacerlo: usas ALLOC para darle memoria a un puntero (creando un nuevo nodo) y le asignas los valores, para buscar un nodo vas recorriendo la lista, y para borrar usas FREE, con cuidado de no olvidar cambiar los valores de los punteros que señalan a dicho nodo. Exactamente igual a como se hacía en C.

No obstante, existe un pequeño "truco" con el que se puede crear un "array" del tipo que quieras, con un tamaño variable, que es el que mencioné en
http://forum.bennugd.org/index.php?topic=988.0
De esta forma es más fácil acceder a los nodos (usando [], como decías), pero para eliminar un nodo intermedio tienes que "mover" todos los datos que hay a continuación (como si fuera un array cualquiera) y "eliminar" (realloc) la última posición.

Son dos formas de hacer lo mismo, con sus puntos fuertes y sus pegas, pero como siempre, es mejor hacerlo como te sea más cómodo hasta que aprendas lo suficiente para poder elegir.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

HenBanKeN

Todo claro. Muchísimas gracias. Karma++;  ;D
Aún aprendiendo a manejar mis herramientas...