Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Vandalism en 15 de Abril de 2005, 04:24:53 AM

Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: Vandalism en 15 de Abril de 2005, 04:24:53 AM
  (nooo) hey, algún algoritmo para crear una copia de una lista ordenada sin compartir memoria????
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: Topper en 15 de Abril de 2005, 02:00:37 PM
 o me pierdo algo o.. qué mas da que esté la lista ordenada o no para hacer la copia?  :blink:

Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: zupervaca en 15 de Abril de 2005, 02:12:20 PM
 creo que deberia volver a hacer la pregunta ya que no se entiende bien lo que quiere o cual es el problema que tiene

saludos
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: ethernet en 15 de Abril de 2005, 02:37:39 PM
 Me parece que lo que el hombre este dice es que tiene algo así:


int *vector = new int[100];

//meter datis y ordenar

int *vector2 = vector;


y el lo que quiere hacer es:


int vector2 = new int[100];
memcpy((void*)vector2,(void*)vector,100*4);
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: Vandalism en 15 de Abril de 2005, 02:42:44 PM
 Bueno, en realidad no importa que esté o no ocupada...
Pero quiero hacer una copia de lista1(dinamica) a lista2(dinamica) sin compartir memoria,
es decir, las modificaciones que se le puedan hacer a lista2 luego
de la copia no modifiquen a lista1.

Se entiende?
Lo llevo hecho con un puntero alias de lista1 que recorre la lista e inserta al final de lista2 cada elemento dereferenciado. Pero tendría que haber algun algoritmo mas eficiente.

gracias (ole)  
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: Vandalism en 15 de Abril de 2005, 02:43:44 PM
 ocupada no, ORDENADA  
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: gdl en 15 de Abril de 2005, 05:51:23 PM
 Te recomendaría que usases una biblioteca o similar ya hecha.

Si aún así quieres liarte con los punteros, mi sugerencia, para no recorrer toda la lista cada vez que quieras insertar un elemento al final, es que guardes un puntero que apunte al puntero que apunta a null. De esta forma es sencillo actualizar el puntero apuntado con el puntero al nuevo elemento (la copia) y luego apuntar el puntero al puntero a null al puntero a null que tienes en esa copia. Suponiendo que esta copia ya tiene a null el puntero que apunta al siguiente elemento.

Lo dicho, que es mejor usar una biblioteca donde ya esté hecho.
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: Vandalism en 15 de Abril de 2005, 06:02:23 PM
 En realidad no recorre toda la lista, ya ke un puntero auxiliar siempre apunta al ultimo nodo.
Insisto, deberia haber algun algoritmo de copia mas eficiente!!!

gracias de todas formas
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: Pogacha en 15 de Abril de 2005, 08:06:05 PM
 Por Dios que no se entiende ...

Tienes una lista dinamica y quieres copiarla a otra lista y que la segunda lista quede ordenada ... menos de nlog2n no existe, formas sencillas: con 2n de memoria puedes hacer un merge sort - con 1n + una estructura puedes hacer un heap sort, con n de memoria en punteros puedes hacer un qsort ... y renlazas luego la lista ... pero no entiendo el problema en si ...

Si me explicas o pones codigo que parece sera mas facil de entender ...

Saludos
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: Vivael13h en 15 de Abril de 2005, 08:50:44 PM
 A lo mejor digo una burrada, pero, ¿cómo se puede hacer una copia con memoria compartida?. A mi entender, una copia debería ser necesariamente independiente. Es decir, yo puedo copiar A en B, y a partir de ahí los modifico por separado, pero ¿hay manera de que modificando A se modifique automaticamente B?
Título: Copiar Una Lista Ordenada (algoritmo)
Publicado por: shephiroth en 15 de Abril de 2005, 10:26:22 PM
 Buenas........por lo poco que estoy leyendo me da la impresion de que tu problema es otro.....veamos, lo que quieres es teniendo una lista dinamica, poder acceder a ella tanto en el orden en el que fue introducida como en el orden logico de la misma no???

Si este es tu caso, en vez de hacerte tanto lio con copias que al cambiar una cambie en otra, te podrías hacer un vector de enteros de la misma longitud que la lista que te indique que orden llevan en la lita, me explico:

Tu imaginate que tienes los numeros 10 7 3 9 12.....siguiendo lo que puse deberias tener un vector de ints de la siguiente manera 2 1 3 0 4........

Para recorrer la lista tal como la crearon seria:

tuclase*lista;
int ordenada[];
for (int x=0;x<lista.size();x++)
dato = lista[x];


Para recorrerla de forma ordenada seria:

tuclase*lista;
int ordenada[];
for (int x=0;x<lista.size();x++)
dato = lista[ordenada[x]];


Para llevar esto acabo tendrias q crearte una estructura/clase q cada vez q metieras/eliminaras un item reordenara el vector de ordenacion, para en todo momento saber cual es su orden.