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

algoritmo de ordenamiento recursivo sobre listas

Estas en el tema de algoritmo de ordenamiento recursivo sobre listas en el foro de C/C++ en Foros del Web. Tengo estas 2 funciones y definidos los siguientes tipos de datos: //CODIGO - DEF. DE NODO DE LA LISTA typedef struct nodo{ int elem; struct ...
  #1 (permalink)  
Antiguo 31/07/2007, 15:47
 
Fecha de Ingreso: septiembre-2006
Ubicación: Montevideo
Mensajes: 46
Antigüedad: 17 años, 7 meses
Puntos: 1
algoritmo de ordenamiento recursivo sobre listas

Tengo estas 2 funciones y definidos los siguientes tipos de datos:

//CODIGO - DEF. DE NODO DE LA LISTA
typedef struct nodo{
int elem;
struct nodo *sig;
}tiponodo;

//PUNTERO A NODO DE LA LISTA Y LISTA
typedef tiponodo *ptrNodo;
typedef tiponodo *Lista;

int esVacia(Lista l); // VERIFICA Q LA LISTA SEA VACIA --> (Lista == NULL)
void insertar(int x, Lista *l); //ESTA FUNCION INSERTA DE MANERA ORDENADA
//FIN CODIGO

Lo q estoy intentando implementar es un algoritmo recursivo q me ordene una lista, desde el punto de vista lógico el algoritmo es bastante sencillo, pero implementarlo en C me esta trayendo mas problemas de los que quisiera por como se manejan los punteros en C (al parecer).

La funcion q ordena la lista sería como sigue:

//CODIGO
Lista ordenar(Lista *l){

if (esVacia(*l)) {

/* Si la lista es vacia la devuelvo */
return *l;

}else{
/*De lo contrario devuelvo el resultado de insertar el primer elemento de manera ordenada en Lista->sig
insertar ( (*l)->elem, (Lista *)ordenar(&(*l)->sig));
return *l;
}

}
//FIN CODIGO

El problema se da en la funcion insertar. Me tira un error de segmentacion, NO de compilacion, despues de hacer un poco de debugging encontré el error. La implementacion de la funcion insertar() es como sigue:

//CODIGO
void insertar(int x, Lista *l){

ptrNodo nuevo, anterior;

//CREO EL NUEVO NODO
nuevo = malloc(sizeof(tiponodo));
nuevo->elem = x;

/*Si la lista es vacia o el elemento en el q estoy es mayor que el que quiero insertar.
Inserto el nuevo elemento al comienzo de la lista */

if (esVacia(*l) || ((*l)->elem > x)){ //ACA LANZA EL ERROR DE SEGMENTACION
nuevo->sig = *l;
*l = nuevo;
}else{

/* De lo contrario recorro la lista hasta estar tener un elemento mayor por delante e inserto el nuevo elemento */

anterior = *l;
while(anterior->sig && anterior->sig->elem <= x){
anterior = anterior->sig;
}
nuevo->sig = anterior->sig;
anterior->sig = nuevo;
}

}
//FIN CODIGO

Alguna ayuda que me puedan dar, quiero terminar con el tema de las listas, todavia me queda bastante por hacer y estos pequeños grandes problemas son bastante molestos y atrasan una barbaridad. Gracias de antemano.

Última edición por chelix; 03/08/2007 a las 15:47
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 17:13.