Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[DUDA] Ordenar una lista simple
Autor Mensaje
Feer Sin conexión
Presidente del CEIT
Ing. Electrónico
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.672
Agradecimientos dados: 601
Agradecimientos: 2.969 en 451 posts
Registro en: Apr 2010
Mensaje: #1
[DUDA] Ordenar una lista simple Dudas y recomendaciones Algoritmos y Estructuras de Datos
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 Confused
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 problemaConfused

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 ordenadaConfused



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 problemaConfused
Gracias desde ya al que lo lea y al que me pueda ayudar.

[Imagen: digitalizartransparent.png]
22-04-2012 19:41
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
LeaTex Sin conexión
Presidente del CEIT
.
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 4.848
Agradecimientos dados: 56
Agradecimientos: 264 en 55 posts
Registro en: Apr 2008
BlogSpot Facebook Google+ Last.fm LinkedIn Twitter
YouTube
Mensaje: #2
RE: [DUDA] Ordenar una lista simple
¿en dónde exactamente te tira el error?
no me puse a ver el código, pero tenés que detectar, en principio, en cuál de las funciones está fallando.
y después averiguar cuál es la línea que falla.
metele un printf antes de cada línea, con un número incremental, hasta ver cuál es el que falla.

22-04-2012 21:56
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
Ing. Electrónico
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.672
Agradecimientos dados: 601
Agradecimientos: 2.969 en 451 posts
Registro en: Apr 2010
Mensaje: #3
RE: [DUDA] Ordenar una lista simple
contenido = eliminar_primer_nodo(&aux);
insertar_ordenado(&listaordenada, contenido);



Me tira el contenido y después violacion de segmento.

[Imagen: digitalizartransparent.png]
23-04-2012 18:28
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
el pibe Sin conexión
Presidente del CEIT
Benderista
********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.235
Agradecimientos dados: 5
Agradecimientos: 115 en 32 posts
Registro en: May 2011
YouTube
Mensaje: #4
RE: [DUDA] Ordenar una lista simple
cambio_posicion = *aux;
contenido = cambio_posicion->valor;



si aux es null ...... cambio_posicion es null por lo que no existe cambio_posicion->valor

valida eso

[Imagen: tolivi10.jpg]
2 Veces congresista por eArgentina
13 Veces congresista por eBolivia
1 Vez Emperador por eBolivia
Ex-Ministro de Salud eArgentino

[Imagen: Necromancer616.png]
23-04-2012 18:39
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
Ing. Electrónico
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.672
Agradecimientos dados: 601
Agradecimientos: 2.969 en 451 posts
Registro en: Apr 2010
Mensaje: #5
RE: [DUDA] Ordenar una lista simple
Hola, vi esto disculpa que no escribi antes..
El fin de semana me conecto desde linux que con esta pc no puedo y pruebo ese cambio y me paso por acá...
Muchas gracias, cualquier cosa te digo :/

[Imagen: digitalizartransparent.png]
26-04-2012 21:08
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)