Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] como podria ordenar sin destruir y crear

Estas en el tema de como podria ordenar sin destruir y crear en el foro de C/C++ en Foros del Web. esto es en C como podria sin destruir o crear nuevos nodos ordenar una lista enlazada simple? yo lo e echo guardando valores en una ...
  #1 (permalink)  
Antiguo 19/11/2013, 09:29
 
Fecha de Ingreso: septiembre-2010
Mensajes: 101
Antigüedad: 14 años, 2 meses
Puntos: 0
como podria ordenar sin destruir y crear

esto es en C
como podria sin destruir o crear nuevos nodos

ordenar una lista enlazada simple?

yo lo e echo guardando valores en una variable comun
pero me dijeron que existe otra manera!!
  #2 (permalink)  
Antiguo 20/11/2013, 03:20
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 16 años, 2 meses
Puntos: 6
Respuesta: como podria ordenar sin destruir y crear

Hola,

Existen una serie de algoritmos que permiten ordenar los elementos de un conjunto, ya sea una tabla o una lista. Los algoritmos básicos son:
  • Selección
  • Intercambio (método de la burbuja)
  • Ordenación
  • Quicksort

Puedes encontrar más sobre estos métodos en Internet o en libros de programación, aunque no sea un libro de C/C++, ya que son fácilmente implementables. Te recomiendo que estudies cómo funcionan y los apliques a una tabla primero. Una vez entendido, la implementación en una lista no es complicada.

Un saludo,
gonzo
  #3 (permalink)  
Antiguo 20/11/2013, 06:05
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: como podria ordenar sin destruir y crear

Puede que el Intercambio (método de la burbuja) sea el mas asequible, consiste en repetir varias ordenaciones donde en cada iteracion comparas un nodo con el siguiente (y los ordenas segun quieras), de forma que en cada pase el ultimo elemento comparado queda ordenado y en el pase siguiente lo omites.

No te pongo el codigo, pero enseguida veras como funciona, supongamos que tienes la lista 37514 y quieres ordenarla de forma creciente:

Código C:
Ver original
  1. pase 1:
  2.         3 ? 7, 3<7, no hace falta ordenar
  3.         7 ? 5, 7>5, intercambias estos dos, ahora la lista es 35714
  4.         7 ? 1, 7>1, intercambias estos dos, ahora la lista es 35174
  5.         7 ? 4, 7>4, intercambias estos dos, ahora la lista es 35147
  6. final del pase 1, obtienes la lista 35147
  7. final del pase 1, la posicion (tamaño lista - 1) está ordenada correctamente
  8.  
  9. pase 2:
  10.         3 ? 5, 3<5, no hace falta ordenar
  11.         5 ? 1, 5>1, intercambias estos dos, ahora la lista es 31547
  12.         5 ? 4, 5>4, intercambias estos dos, ahora la lista es 31457
  13. final del pase 2, obtienes la lista 31457
  14. final del pase 2, omites la comparacion entre (tamaño lista - 2) y (tamaño lista -1)
  15. final del pase 2, la posicion (tamaño lista - 2) está ordenada correctamente
  16.  
  17. etc...

Es decir, en cada pase comparas todos los elementos con el siguiente excepto contra el elemento que quedo ordenado al final del pase anterior, de esta forma si tienes una lista de 5 elementos en el primer pase comparas 5, en el segundo comparas 4, en el tercero 3, etc...

Solo una anotacion: en cualquier caso cuando mueves punteros tienes que controlar los casos de perdida de memoria (o memory leak): se produce cuando pierdes la referencia a una posicion de memoria:

Código C:
Ver original
  1. int *nodo1 = malloc(sizeof(int));
  2. int *nodo2 = malloc(sizeof(int));
  3. nodo1 = nodo2;//memory leak

En este ejemplo estoy perdiendo la referencia a nodo1, de forma que pierdo la capacidad de trabajar con esa direccion de memoria (y el tamaño que ocupa) mientras tenga abierta la aplicacion (los s.o. actuales y no tan actuales liberan la memoria bloqueada por la aplicacion al finalizar la misma aplicacion); en el caso de sizeof(int) bytes perdidos no hay problema, pero imagina que pierdes elementos mas grandes y/o mas numerosos. Cuando hay memoria suficiente la perdida de memoria tal vez sea un problema minimo, pero en caso de listas la perdida de memoria se traduce a la perdida de un elemento por mucha memoria libre que tengas. Para evitarlo copias la direccion del elemento a sobreescribir a un puntero temporal y haces las operaciones:

Código C:
Ver original
  1. int *nodot = 0;
  2. int *nodo1 = malloc(sizeof(int));
  3. int *nodo2 = malloc(sizeof(int));
  4.  
  5. nodot = nodo1;
  6. nodo1 = nodo2;//no pierdo la referencia a nodo1 porque la tengo en nodot
  7. nodo2 = nodot;//he intercambiado los punteros

Saludos
vosk

Etiquetas: destruir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:20.