violacion d segmento en mi lista al ejecutar (ayuda!!!)

AkiLaCa?PideAsi
17 de Abril del 2005
[email protected] amigos programadores mi problema es el siguiente. Tengo una lista hecha por mi ke compila bien pero ke en ejecucion me presenta el mensaje "violacion del segmento"(compilo y ejecuto en un PC con linux SuSe 9.1).
Lo ke os pido x favor es si podriais echarle un ojo a este codigo (copiarlo si kereis y ejecutarlo) y si os manejais bien en esto de las estructuras dinamicas de datos me digais donde se encuentra el error o ke procedimiento estoy haciendo mal.
Yo cuando estube escribiendo creia ke me iba a salir al pelo y to esas ilusiones ke se hace uno ya me lo hice con sus grafos en un papel y to eso.
Si me contestais os lo agradezco si no muchas gracias de toas formas por haber leio esto

#include <stdio.h>
#include <stdlib.h>

struct elemento{
int informacion;
struct elemento *siguiente;
};

struct lista{
struct elemento *primero;
struct elemento *ultimo;
};

void meter_lista_ordenada(int numero,struct lista *L);
void mostrar_lista(struct lista *L);

main(){
struct lista *L;
L = NULL;
meter_lista_ordenada(1,L);
return 0;
}


void meter_lista_ordenada(int numero,struct lista *L){
struct elemento *nuevo,*guia;
nuevo=(struct elemento *)malloc(sizeof(struct elemento));
nuevo->informacion = numero;
// CASO EN EL KE LA LISTA VACIA EN CUYO CASO
// primero Y ultimo APUNTAN AL NUEVO ELEMENTO
if(L = NULL){
printf("CASO LISTA VACIA");
L->primero = nuevo;
L->ultimo = nuevo;
nuevo->siguiente = NULL;
}
else{ //CASO 1 PARA 1 SOLO ELEMENTO
if(L != NULL && L->primero == L->ultimo && nuevo->informacion >= L->primero->informacion){
printf("CASO 1 PARA 1 SOLO ELEMENTO");
L->primero->siguiente = nuevo;
L->ultimo = nuevo;
L->ultimo->siguiente = NULL;
}
else{//CASO 2 PARA 1 SOLO ELEMENTO
if(L != NULL && L->primero == L->ultimo && nuevo->informacion <= L->primero->informacion){
printf("CASO 2 PARA 1 SOLO ELEMENTO");
nuevo->siguiente = L->primero;
L->primero = nuevo;
L->ultimo->siguiente = NULL;
}
else{ //CASO 1 PARA MAS DE 1 ELEMENTO
if(L != NULL && L->primero != L->ultimo && nuevo->informacion <= L->primero->informacion){
printf("CASO 1 PARA MAS DE 1 ELEMENTO");
nuevo->siguiente = L->primero;
L->primero = nuevo;
L->ultimo->siguiente = NULL;
}
else{ //CASO 2 PARA MAS DE 1 ELEMENTO
if(L != NULL && L->primero != L->ultimo && nuevo->informacion >= L->primero->informacion){
printf("CASO 2 PARA MAS DE 1 ELEMENTO");
L->ultimo->siguiente = nuevo;
L->ultimo = nuevo;
L->ultimo->siguiente = NULL;
}
else{ //CASO DEFAULT PARA MAS DE 1 ELEMENTO
if(L != NULL && L->primero != L->ultimo && nuevo->informacion > L->primero->informacion && nuevo->informacion < L->ultimo->informacion){
printf("CASO DEFAULT");
guia = L->primero;
while(guia != NULL){
if(nuevo->informacion >= guia->informacion && nuevo->informacion <= guia->siguiente->informacion){
nuevo->siguiente = guia->siguiente;
guia->siguiente = nuevo;
}
else
guia = guia->siguiente;
}
}
}
}
}
}
}
}


espero ke lo entendais
este mensaje se autodestruira en 15 segundo(15,14,13,.....)

Caiman
17 de Abril del 2005
Bueno por lo que vi te fallo esto:

<<
void meter_lista_ordenada(int numero,struct lista *L){
struct elemento *nuevo,*guia;
nuevo=(struct elemento *)malloc(sizeof(struct elemento));
nuevo->informacion = numero;
>>

primero debes comprobar que el espacio de memoria realmente se haya reservado con exito.

if(nuevo!=NULL)

Aqui siempre saldra NULL pues te falto un signo ´=´:

<< if(L = NULL) >>

Corrige esos dos errores, no lo he compilador pero supongo serán esos los fallos.