Bueno estoy hace rato ya con esta función y no quiere andar-.-'
Me tira una violación de segmentos cuando ordeno y no entiendo ya porque
Tal vez alguien me pueda ayudar, dejo la función de ordenamiento y una funcion para cargar una lista así no tienen que programar nada para ver el problema
Gracias desde ya!
/**
* \fn void ordenar_lista(DATO **lista)
* \brief Ordena la lista.
* \author
* \date 8/04/12
* \param **lista lista de elementos.
*/
void ordenar_lista(DATO **lista){
DATO *listaordenada; //aca guardo la lista como la voy ordenando.
DATO *aux; //Este es para recorrer la lista y no perder la referencia.
int contenido; //contiene el valor que saco de la lista para ubicar en la nueva ordenada.
aux = *lista;
while(aux!=NULL){
contenido = eliminar_primer_nodo(&aux);
insertar_ordenado(&listaordenada, contenido);
printf("ordenado 1"); //TODO ESTO LO TENGO QUE SACAR CUANDO ANDE
}
*lista = listaordenada;
}
/**
* \fn int insertar_ordenado(DATO **listaordenada,int contenido)
* \brief Inserta en una nueva lista el valor que voy recibiendo en los nodos.
* \author
* \date 8/04/12
* \param **listaordenada puntero a la lista que esta ordenada
* \param contenido contenido a guardar en el nodo de la lista ordenada
* \return -1 si salio mal, 1 si salio bien.
*/
int insertar_ordenado(DATO **listaordenada,int contenido){
DATO *nuevo_nodo = NULL; //nodo para el nuevo dato.
DATO *aux = NULL; //para recorrer la lista sin perder la referencia de la lista.
DATO *ant = NULL; //para recorrer la lista y poder realizar el agregado de nodo.
nuevo_nodo = (DATO *) malloc(sizeof(DATO));
if(nuevo_nodo == NULL){
printf("Error al pedir memoria");
return(-1);
}
nuevo_nodo->valor = contenido;
nuevo_nodo->siguiente = NULL;
if(*listaordenada == NULL){ //Si todavia no ingrese ningun nodo..
*listaordenada = nuevo_nodo;
return(1);
}
else{ //Si ya habia ingresado nodos...
aux = *listaordenada;
while((aux != NULL)&&((aux->valor) < contenido)){ //mientras contenido no supere al valor del nodo actual.
ant = aux;
aux = aux->siguiente; //apunto al siguiente nodo.
}
if(aux == NULL){ //Si se mete al final de la lista.
ant->siguiente = nuevo_nodo;
}
else{ //Si se mete en el medio de la lista.
ant->siguiente = nuevo_nodo;
nuevo_nodo->siguiente = aux;
}
return(1);
}
}
/**
* \fn int eliminar_primer_nodo(DATO **aux)
* \brief Elimina el primer nodo de la lista a ordenar.
* \author
* \date 8/04/12
* \param **aux direccion de memoria contenida por la direccin de lista.
* \return contenido del primer nodo.
*/
int eliminar_primer_nodo(DATO **aux){
DATO *cambio_posicion = NULL; //para no tener problemas con el asterisco de aux.
DATO *temp = NULL; //para el free.
int contenido; //contenido del nodo de lista.
cambio_posicion = *aux;
temp = *aux;
contenido = cambio_posicion->valor;
*aux = cambio_posicion->siguiente;
free(temp);
return(contenido);
}
Para insertar y crear la lista:
/**
* \fn int agregar_principio(DATO **lista)
* \brief Inserta elemento al principio de la lista
* \author
* \date 7/04/12
* \param **lista contiene la direccion de lista
* \return 1 si salio bien, -1 si salio mal.
*/
int agregar_principio(DATO **lista){
DATO *nuevo_elemento; //En esta estructura guardo mi nuevo dato.
nuevo_elemento = (DATO*) malloc (sizeof(DATO));
if(nuevo_elemento == NULL){
printf("Error en memoria");
return(-1);
}
printf("Introduzca el nuevo dato: ");
scanf("%d",&nuevo_elemento->valor);
nuevo_elemento->siguiente = NULL; //Mando siguiente a null (por el momento solo para rellenar la estructura)
if(*lista == NULL){ //Si no hay una lista todavia armada...
*lista = nuevo_elemento;
return(1);
}else{ //Si hay lista creada.
nuevo_elemento->siguiente = *lista;
*lista = nuevo_elemento;
}
getchar();
return(1);
}
Para llamar a estas funciones:
int main(void){
printf("Bienvenido al programa integrador de listas\r\n");
printf("Gracias por utilizar el programa\r\n");
return(0);
}
void menu(void){
int exit; //Controla la salida del menu.
int opcion; //Controla las opciones del switch.
DATO *lista = NULL; //Puntero al comienzo de la lista.
do{
printf("Menu del sistema\r\n");
printf("\t1- Agregar elemento al final de la lista\n"
"\t2- Agregar elemento al principio de la lista\n"
"\t3- Borrar elemento de la lista\n"
"\t4- Cantidad de elementos de la lista\n"
"\t5- Ordenar lista\n"
"\t6- Buscar minimo\n"
"\t7- Buscar maximo\n"
"\t8- Listar lista\n"
"\t0- Salir del programa\n");
printf("¿Que tarea desea realizar? Opcion: ");
scanf("%d",&opcion);
exit = 1;
switch(opcion){
// case 1: agregar_final(&lista); break;
case 2: agregar_principio(&lista); break;
// case 3: borrar_elemento(&lista); break;
//case 4: cantidad_elementos(lista); break;
case 5: ordenar_lista(&lista); break;
// case 6: buscar_min(lista); break;
//case 7: buscar_max(lista); break;
//case 8: listar(lista); break;
case 0: salir(&lista); exit = 0; break;
default: ("Opcion incorrecta.\r\n"); break;
}
getchar();
}while(exit != 0);
}
Y les dejo para listar una vez que esta ordenada
void listar(DATO *lista){
if(lista == NULL){
printf("No hay elementos en la lista\r\n");
}
else{
do{
printf("Dato: %d\r\n",lista->valor);
lista = lista->siguiente;
}while(lista != NULL);
}
getchar();
}
En fin creo que con eso ya se puede ver bien el problema
Gracias desde ya al que lo lea y al que me pueda ayudar.