| |||
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... |
| |||
Respuesta: Ordenar listas alfabeticamente |
| |||
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... |
| |||
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. |
| |||
Respuesta: Ordenar listas alfabeticamente a ver, tengo un tipedef de esta forma:
Código:
despues, creo "NODOS" y los enlazo:typedef struct nodo { char *cadena; char *genero; char *programa; int hora; int duracion; struct nodo * sig; } NODO;
Código:
y para finalizar estoy haciendo una funcion que lo ordene, pero no me sale...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; } }
Código:
¿Alguna solucion? 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; } } |
| |||
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:
si a y b tienen q ser cambiados tu deberias lograrp paux | | [a] -> [b] -> [c]
Código:
pero lo que estas haciendo es, si no me equivoco, modificar los punteros, o sea[a] -> [c] [b] -> [a]
Código:
lo que no produce cambio alguno en la lista paux p | | [a] -> [b] -> [c] |
| |||
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:
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.. paux2=paux->cadena; paux->cadena=p->cadena; p->cadena=paux2->cadena; Última edición por gastro; 07/05/2010 a las 11:43 |
| |||
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 |
Etiquetas: |