PDA

Ver la Versión Completa : Operaciones basiscas listas doblemente enlazadas circulares


fede7
06-04-2006, 12:27:02
Hola, me haria un gran favor si alguien me facilitara el codigo de todas las operaciones que hay.

Tengo que hacer una parte de una practica con estas listas y no encuentro las operaciones por ningun lado para poder continuarla.

De paso tengo otra consulta. En delphi al poner un tMemo para que muestre un listado hay alguna manera para recalcar en negrita los campos que yo creo? Nombre: que aparezca en negrita.

Saludos y gracias

kinobi
06-04-2006, 12:47:08
Tengo que hacer una parte de una practica con estas listas y no encuentro las operaciones por ningun lado para poder continuarla.
Apostaría que el objetivo de unas prácticas (de implantación de algoritmos) es conseguir que el alumno las resuelva por sí mismo y no "fusilándolas" de código de otros, pero tampoco es cuestión de criticar si quieres o no aprovecharlas... Así pues:

http://www.google.es/search?hl=es&q=listas+doblemente+enlazadas+pascal&btnG=B%C3%BAsqueda+en+Google&meta=

Con una revisión superficial, comprobarás que en las cuatro primeras entradas ya tienes código para implantar las listas doblemente enlazadas. Un poco de picardía con Google no te hubiese venido mal :)

Saludos

fede7
06-04-2006, 14:24:00
Hola,

las operaciones basicas por ejemplo las de los arboles o de la tabla hash las saque de apuntes de clase de otros años (las daban y explicaban) por lo tanto no fusilo nada, no crees??. Las operaciones de listas doblemente enlazadas si que las tengo y como bien dices, en google buscando salen (ya busque y requetebusque antes de poner mi duda,). El caso que no se bien la diferencia cuando es circular en cuanto a los procedimientos de las operaciones y por eso buscaba dichas operaciones que tampoco creo que sea tan grave, ni que pidiera el alta de un cd ya hecha ;-). De doblemente enlazada a doblemente enlazada circular la diferencia donde reside en las operaciones?? En los tipos se la diferencia y se que son ambas listas pero siempre nos piden doblemente enlazada, lo de circular nunca lo explican.

un saludo y gracias por tu ayuda

Lepe
06-04-2006, 17:01:15
Por circular, creo entender que se muerde la cola :D

Es decir, el último elemento apunta al primero de la lista, así que hay que saber de antemano cuantos elementos hay en la lista para realizar una búsqueda.

En listas (no circulares) simplemente haces un bucle hasta que aux^.siguiente = nil. Suponiendo que "siguiente" es un puntero al siguiente elemento de la lista, el último elemento tendrá nil (puntero nulo, vacío) y por tanto se tiene una condición de parada.

saludos

fede7
06-04-2006, 17:40:58
type

tElem = char; {o lo que corresponda}
tLista = ^tNodo;
tNodo = record
anterior: tLista
contenido: tElem;
siguiente: tLista
end;


Osea que los tipos de la lista doblemente enlazada circular y la no circular son iguales, no?

Saludos y gracias

Lepe
06-04-2006, 18:16:29
Exacto.

Lo que cambia es la filosofía de trabajo, vamos a Buscar un elemento concreto:

- No circular
Recorremos desde el principio hasta que aux^.siguiente = nil. Si no encontramos lo que buscamos, paramos.

- Circular.
Ahora todos los aux^.Siguiente tienen un valor, ya que el último de la lista apunta al primero. La condición de parada no la podemos usar, entonces ¿como sabemos que hemos recorrido todos los elementos?

Cada vez que se añade/borra un elemento a la lista, incrementamos/decrementamos un contador, y ya podemos hacer: For i:=1 to contador do

Saludos

fede7
06-04-2006, 18:28:14
Vale, creo que lo voy pillando. Era justo la mayor duda que tenia. Me va a tocar sufrir de lo lindo, eso esta claro.

Gracias por tus ayudas!!

Saludos

kinobi
06-04-2006, 19:46:22
El caso que no se bien la diferencia cuando es circular en cuanto a los procedimientos de las operaciones y por eso buscaba dichas operaciones que tampoco creo que sea tan grave, ni que pidiera el alta de un cd ya hecha ;-).
Tampoco mi respuesta fue tan ofensiva. Además tu petición inicial fue (y cito):


Hola, me haria un gran favor si alguien me facilitara el codigo de todas las operaciones que hay.

No veo por ningún lado que pidas que se te explique la diferencia entre unas listas y otras, lo que pides es el código.

Así pues, si te sientes ofendido, lo siento, pero yo no invento nada, lo que pediste está escrito.

kinobi
06-04-2006, 19:49:54
- Circular.
Ahora todos los aux^.Siguiente tienen un valor, ya que el último de la lista apunta al primero. La condición de parada no la podemos usar, entonces ¿como sabemos que hemos recorrido todos los elementos?

Por ejemplo con un flag (añadiendo también un método en la lista para reiniciar el flag de todos los elementos)

O también con punteros "fijos" al primer y último elemento (caso de utilizarse estructuras dinámicas)

Saludos.

reina
06-04-2006, 20:34:14
Hola! tanto listas doblemente enlazadas circulares o no..podes guardar el 1er elemento y el ultimo. Asi sabrias en la circular la condicion de fin de la lista es cuando llegue al primero..En cuanto a la implementación lo podrias implementar con punteros o array de registros guardas: sig, ant, dato, donde sig y ant son posiciones aleatorias del array...donde tienen un orden logico..pero no fisico:rolleyes: . Con respectos a las operaciones pueden ser:
- Crear Lista.
- Recorrer e imprimir la lista.
- Obtener primero
- Obtener Ultimo.
- Insertar en una posicion.
- Agregar.
- Borrar un elemento determinado.
- Borrar un elemento de una posicion.
- Si es vacia.
- Cantidad de Elementos.
etc..
Exitos con las estructuras de datos!

LA PATRIA SERA LIBRE!

fede7
06-04-2006, 22:54:58
Tampoco mi respuesta fue tan ofensiva. Además tu petición inicial fue (y cito):


No veo por ningún lado que pidas que se te explique la diferencia entre unas listas y otras, lo que pides es el código.

Así pues, si te sientes ofendido, lo siento, pero yo no invento nada, lo que pediste está escrito.

Perdona si sone a ofendido, para nada :) . Si acato las criticas, solo te explicaba el porque las pido. Logicamente es mejor saber hacerlas pero como no se las pido si alguien las tiene y me las quiere dejar sino no pasa nada. Y dado que las operaciones a mi me las explican en clase por eso no considero fusilar algo que te dan, lo que pasa que mis apuntes solo tienen el Insertar circular. Bueno la de crearlo es muy facil y se.

No pido que se me explique las diferencias porque esperaba con el codigo en mano compararlo con las doblemente enlazadas y yo mismo ver las diferencias. No pregunto algo que puedo averiguar, igual la forma de averiguarlo no es la mas adecuada pero que le vamos a hacer, nadie es perfecto y de hecho asi comparo las operaciones de las listas simples y las enlazadas por ejemplo.

Por ejemplo con un flag (añadiendo también un método en la lista para reiniciar el flag de todos los elementos)

O también con punteros "fijos" al primer y último elemento (caso de utilizarse estructuras dinámicas)

Saludos.

Tomo nota, gracias

Hola! tanto listas doblemente enlazadas circulares o no..podes guardar el 1er elemento y el ultimo. Asi sabrias en la circular la condicion de fin de la lista es cuando llegue al primero..En cuanto a la implementación lo podrias implementar con punteros o array de registros guardas: sig, ant, dato, donde sig y ant son posiciones aleatorias del array...donde tienen un orden logico..pero no fisico:rolleyes: . Con respectos a las operaciones pueden ser:
- Crear Lista.
- Recorrer e imprimir la lista.
- Obtener primero
- Obtener Ultimo.
- Insertar en una posicion.
- Agregar.
- Borrar un elemento determinado.
- Borrar un elemento de una posicion.
- Si es vacia.
- Cantidad de Elementos.
etc..
Exitos con las estructuras de datos!



Gracias por tu consejo. Ya que estoy, Si me piden modificar un dato que operaciones tengo que implementar?
Que borre un elemento determinado y lo vuelva a insertar nuevo??

Saludos y nuevamente gracias a todos

Lepe
07-04-2006, 00:13:15
Si te piden modificar.... se supone que tienes que modificar el contenido de Telem, por tanto solo tienes que buscar y despues sobreescribir el Telem, es decir, operaciones de punteros.... ninguna :)

Saludos

fede7
07-04-2006, 01:09:46
Es que por ejemplo con arboles la operacion modificar la tenfo implementada entonces lo que hago es meter los datos y modificarlos y si la clave la cambio (deja cambiarla) lo que hago es eliminar el arbol y crearlo de nuevo.

Entonces con lista circular uso la operacion buscarnodo y directmanete pense en borrar ese nodo y volverlo a crear por lo que los datos serian modificados.

Perdona mi ignorancia pero como sobreescribirias el los datos??

Saludos y gracias

reina
07-04-2006, 02:14:31
Claro..como dice el compañero. Accedes al elemento a modificar(buscas el nodo) y modificas el dato.. aux^.dato:=..., o borrado seguido de inserccion como te guste mas.
saludoss

LA PATRIA SERA LIBRE!

kinobi
07-04-2006, 08:02:14
No pido que se me explique las diferencias porque esperaba con el codigo en mano compararlo con las doblemente enlazadas y yo mismo ver las diferencias. No pregunto algo que puedo averiguar, igual la forma de averiguarlo no es la mas adecuada pero que le vamos a hacer, nadie es perfecto y de hecho asi comparo las operaciones de las listas simples y las enlazadas por ejemplo.
Bueno, pues todo aclarado :)

Y si es necesario explicar las diferencias entre los tipos de listas se explican, que aquí encontrarás a muchos dispuestos a hacerlo. Además, estos temas genéricos de algoritmos y programación son siempre muy interesantes.

Un saludo.

Lepe
07-04-2006, 11:08:57
Interesante y útiles. Cuando empecé a trabajar con delphi y vi la clase TList, me sorprendió que usara punteros a diestro y siniestro, pero en lugar de asustarme, la estudié a fondo. El tema de punteros me gustó mucho en la carrera jejeje.

Saludos

fede7
07-04-2006, 23:15:35
Claro..como dice el compañero. Accedes al elemento a modificar(buscas el nodo) y modificas el dato.. aux^.dato:=..., o borrado seguido de inserccion como te guste mas.
saludoss

LA PATRIA SERA LIBRE!

Oks!!! segure vuestros consejos y ya os contare que sale :o

Tengo alguna duda mas ahora mismo sobre otros temas (pero son minucias), que es mejor abrir otro post o preguntarlas en este mismo??

Saludos y gracias a todos