Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Copiar Una Lista Ordenada (algoritmo)

Iniciado por Vandalism, 15 de Abril de 2005, 04:24:53 AM

« anterior - próximo »

Vandalism

  (nooo) hey, algún algoritmo para crear una copia de una lista ordenada sin compartir memoria????

Topper

 o me pierdo algo o.. qué mas da que esté la lista ordenada o no para hacer la copia?  :blink:


zupervaca

 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

ethernet

 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);

Vandalism

 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)  

Vandalism


gdl

 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.

Vandalism

 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

Pogacha

 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

Vivael13h

 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?
lgún día volverá el 13h

shephiroth

 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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.