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

Ordenar listas alfabeticamente

Estas en el tema de Ordenar listas alfabeticamente en el foro de C/C++ en Foros del Web. ¿Conoceis algun algoritmo para ordenadar alfabeticamente una lista con cadenas de caracteres? utilizo strcmp pero me da fallo en una parte del algoritmo......
  #1 (permalink)  
Antiguo 06/05/2010, 17:22
 
Fecha de Ingreso: enero-2006
Mensajes: 94
Antigüedad: 18 años, 2 meses
Puntos: 2
Ordenar listas alfabeticamente

¿Conoceis algun algoritmo para ordenadar alfabeticamente una lista con cadenas de caracteres? utilizo strcmp pero me da fallo en una parte del algoritmo...
  #2 (permalink)  
Antiguo 06/05/2010, 18:34
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Ordenar listas alfabeticamente

usa lo siguiente:


Código C:
Ver original
  1. qsort(strings, strings_len, sizeof(char *), cstring_cmp);
  2.  
  3. int cstring_cmp(const void *a, const void *b)
  4. {
  5.     const char **ia = (const char **)a;
  6.     const char **ib = (const char **)b;
  7.     return strcmp(*ia, *ib);
  8.  
  9. }

strings es tu array.
strings_len es el largo del array
  #3 (permalink)  
Antiguo 07/05/2010, 02:17
 
Fecha de Ingreso: enero-2006
Mensajes: 94
Antigüedad: 18 años, 2 meses
Puntos: 2
Respuesta: Ordenar listas alfabeticamente

podrias explicarme, ¿qué hacen exactamente las funciones qsort y cstring_cmp? ¿Se puede utilizar este algoritmo para ordenar listas? Es que tengo un lio muy grande con el tema de ordenar segun listas enlazadas, los nodos, etc...
  #4 (permalink)  
Antiguo 07/05/2010, 07:32
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Ordenar listas alfabeticamente

Aa vos tenes listas enlazadas!! perdon!!

Una forma simple de ordenar las listas es insertar los nodos por orden. Si ya tenes tu lista hecha y no queres cambiar el codigo.... Armate un lista nueva e inserta los elementos ordenados en esa.

Pasame el codigo de tus lista...para ver que implementacion usaste.
  #5 (permalink)  
Antiguo 07/05/2010, 08:38
 
Fecha de Ingreso: enero-2006
Mensajes: 94
Antigüedad: 18 años, 2 meses
Puntos: 2
Respuesta: Ordenar listas alfabeticamente

a ver, tengo un tipedef de esta forma:
Código:
typedef struct nodo {
  char *cadena;
  char *genero;
  char *programa;
  int hora;
  int duracion;
  struct nodo * sig;
} NODO;
despues, creo "NODOS" y los enlazo:

Código:
NODO *creanodo (char *cadena, char *genero, char *programa, int hora, int duracion)
{
  NODO *p = NULL;

  p = (NODO *) malloc(sizeof(NODO));
  if (NULL != p)
	{
	  p->cadena = cadena;
	  p->genero=genero;
	  p->programa=programa;
	  p->hora=hora;
	  p->duracion=duracion;
	  p->sig = NULL;
	}

  return p;
}

void enlaza(NODO *p, NODO **pp)
{
  if (NULL != p)
	{
	  p->sig = *pp;
	  *pp = p;
	}
}
y para finalizar estoy haciendo una funcion que lo ordene, pero no me sale...
Código:
void ordenalista(NODO *p, NODO **pp)
{
  int flag=1;
  NODO *paux=p->sig;
  NODO *paux2=NULL;
  NODO **inicio1=&p;
  NODO **inicio2=&(p)->sig;

  while(flag)
	{
	  flag=0;
	  
	  
	  while(paux!=NULL)
		{
		  if((strcmp( (paux->cadena), (p->cadena) )) > 0)
			{
			  paux2=paux;
			  paux=p;
			  p=paux2;
			  p=p->sig;
			  paux=paux->sig;
			  flag=1;
			}
		  else
			{
			  p=p->sig;
			  paux=paux->sig;
			}
		}
	  p=*inicio1;	
	  paux=*inicio2;
	}
	  
}
¿Alguna solucion?
  #6 (permalink)  
Antiguo 07/05/2010, 09:27
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Ordenar listas alfabeticamente

En ordenalista() no estas modificando ninguno de los registros/estructuras apuntados por los punteros. El codigo se limita a modificar a los punteros, pero no a lo apuntado.

Graficamente, si p y paux estuvieran asi:
Código:
p     paux
|       |
[a] -> [b] -> [c]
si a y b tienen q ser cambiados tu deberias lograr

Código:
[a] ->  [c]
[b] -> [a]
pero lo que estas haciendo es, si no me equivoco, modificar los punteros, o sea
Código:
paux    p
|       |
[a] -> [b] -> [c]
lo que no produce cambio alguno en la lista
  #7 (permalink)  
Antiguo 07/05/2010, 11:15
 
Fecha de Ingreso: enero-2006
Mensajes: 94
Antigüedad: 18 años, 2 meses
Puntos: 2
Respuesta: Ordenar listas alfabeticamente

y ¿Cómo puedo hacer para modificar el contenido en vez de los punteros? Porque si pusiera por ejemplo:
Código:
paux2=paux->cadena;
paux->cadena=p->cadena;
p->cadena=paux2->cadena;
Estaría cambiando los campos de "cadena" pero el resto lo dejaria igual, yo quiero ordenar la lista en orden alfabetico segun la "cadena", pero sin mezclarlo todo..

Última edición por gastro; 07/05/2010 a las 11:43
  #8 (permalink)  
Antiguo 07/05/2010, 16:19
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Ordenar listas alfabeticamente

Lo que tenes que ordenar son los nodos segun las cadena...no solo intercambiar la cadena.

Supongamos que tenes una lista de este tipo:
[A] -> [B]

Tengo el puntero p que apunta al nodo A. Entonces quiero ingresar el nodo C.
auxiliar = p->sig
p->sig = C;
C->sig = auxiliar


Como veras la primer instruccion hace que en auxiliar se guarde B (El siguiente de A). Despues hacemos que el siguiente de p sea C Y por ultimo hacemos que el siguiente de C sea B. Entonces la lista seria:

[A] -> [C] -> [B]

Pues ahora lo que tendrias que hacer es crear tu nodo a insertar....despues recorrer la lista nodo a nodo comparando con la funcion strcmp y cuando te de que la que vas a insertar menor la insertas. En esta parte deberias llevar un puntero auxiliar que siempre tenga el nodo anterior al que estas comparando, porque cuando el strcmp te diga que lo tenes insertar te pasaste uno..

Espero que se entienda....sino te sigo profundizando mas en el codigo
  #9 (permalink)  
Antiguo 08/05/2010, 18:00
 
Fecha de Ingreso: enero-2006
Mensajes: 94
Antigüedad: 18 años, 2 meses
Puntos: 2
Respuesta: Ordenar listas alfabeticamente

sii! ha funcionado a la perfeccion! muchas gracias, problema resuelto :)

Etiquetas: alfabeticamente, listas
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 15:06.