Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Operaciones basiscas listas doblemente enlazadas circulares (https://www.clubdelphi.com/foros/showthread.php?t=30440)

fede7 06-04-2006 12:27:02

Operaciones basiscas listas doblemente enlazadas circulares
 
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

Cita:

Empezado por fede7
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=...n+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

Código Delphi [-]
 
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

Cita:

Empezado por fede7
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):

Cita:

Empezado por fede7
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

Cita:

Empezado por Lepe
- 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

Cita:

Empezado por kinobi
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.

Cita:

Empezado por kinobi
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

Cita:

Empezado por reina
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

Cita:

Empezado por fede7
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

Cita:

Empezado por reina
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


La franja horaria es GMT +2. Ahora son las 18:31:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi