Przepisywałem listę z Pascala na C i w pewnym miejscu pojawił się Segmentation Fault
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#define NULO NULL
typedef int tDato;
typedef struct tNodo* tPosL;
struct tNodo
{
tDato dato;
tPosL sig;
};
typedef struct tNodo tNodo;
typedef tPosL tLista;
void CrearLista(tLista*);
int EsListaVacia(tLista);
tPosL Primera(tLista);
tPosL Siguiente(tLista,tPosL);
tPosL Ultima(tLista);
tPosL Anterior(tLista,tPosL);
tDato ObtenerDato(tLista,tPosL);
tPosL BuscarDato(tLista,tDato);
tPosL BuscarDatoOrdenado(tLista,tDato);
int InsertarDatoPrimera(tLista*,tDato);
int InsertarDatoUltima(tLista*,tDato);
int InsertarDatoPosicion(tLista*,tDato,tPosL);
int InsertarDatoOrdenado(tLista*,tDato);
tDato EliminarPosicion(tLista*,tPosL);
void EliminarLista(tLista*);
void MostrarLista(tLista L)
{
tPosL P;
P=Primera(L);
while(P!=NULO)
{
printf("%d",ObtenerDato(L,P));
P=Siguiente(L,P);
}
printf("\n");
}
int main()
{
tLista lista;
int i,n;
CrearLista(&lista);
srand(time(NULO));
n=0;
for(i=1; i<=10; i++)
{
while(BuscarDato(lista,n)!=NULO)
n=rand()%10;
printf("Insertando %d\n",n);
InsertarDatoOrdenado(&lista,n);
MostrarLista(lista);
}
EliminarLista(&lista);
do
{
}
while(!kbhit());
return 0;
}
void CrearLista(tLista* L)
{
L=NULO;
}
int EsListaVacia(tLista L)
{
return (L==NULO);
}
tPosL Primera(tLista L)
{
return L;
}
tPosL Siguiente(tLista L,tPosL P)
{
return (P->sig);
}
tPosL Ultima(tLista L)
{
tPosL pos;
pos=Primera(L);
while(Siguiente(L,pos)!=NULO) pos=Siguiente(L,pos);
return pos;
}
tPosL Anterior(tLista L,tPosL P)
{
tPosL pos;
pos=Primera(L);
while((pos!=NULO)&&(Siguiente(L,pos)!=P)) pos=Siguiente(L,pos);
return pos;
}
tDato ObtenerDato(tLista L,tPosL P)
{
return (P->tDato);
}
tPosL BuscarDato(tLista L,tDato D)
{
tPosL pos;
pos=Primera(L);
while ((pos!=NULO)&&(ObtenerDato(L,pos)!=D)) pos=Siguiente(L,pos);
return pos;
}
tPosL BuscarDatoOrdenado(tLista L,tDato D)
{
tPosL pos;
pos=Primera(L);
while((pos!=NULO)&&(ObtenerDato(L,pos)<D)) pos=Siguiente(L,pos);
if(pos==NULO) return NULO;
else if (ObtenerDato(L,pos)==D) return pos;
else return NULO;
}
tPosL CrearNodo(tPosL* P,tDato D)
{
P=malloc(sizeof(*P));
if(P!=NULO)
{
(*P)->dato=D;
(*P)->sig=NULO;
}
return (*P);
}
int InsertarDatoPrimera(tLista* L,tDato D)
{
tPosL P;
if (CrearNodo(&P,D)!=NULO)
{
return 1;
if(EsListaVacia(*L)) (*L)=P;
else
{
P->sig=Primera((*L));
(*L)=P;
}
}
else return 0;
}
int InsertarDatoUltima(tLista* L,tDato D)
{
tPosL P;
tPosL Q;
if(CrearNodo(&P,D)!=NULO)
{
if(EsListaVacia(*L))
(*L)=P;
else
{
Q=Ultima(*L);
Q->sig=P;
}
return 1;
}
else return 0;
}
int InsertarDatoPosicion(tLista* L,tDato D,tPosL P)
{
tPosL Q,R;
if(CrearNodo(&Q,D)!=NULO)
{
if((EsListaVacia(*L))||(P==Primera(*L)))
{
Q->sig=(*L);
(*L)=Q;
}
else if(P==NULO)
{
R=Ultima(*L);
R->sig=Q;
}
else
{
R=Anterior(*L,P);
R->sig=Q;
Q->sig=P;
}
return 1;
}
else return 0;
}
int InsertarDatoOrdenado(tLista* L,tDato D)
{
tPosL P,Q,R;
if(CrearNodo(&P,D)!=NULO)
{
if((EsListaVacia(*L))||(!EsListaVacia(*L)||ObtenerDato(*L,Primera(*L))>D))
{
P->sig=Primera(*L);
(*L)=P;
}
else
{
R=Primera(*L);
Q=Siguiente(*L,R);
while((Q!=NULO)&&(ObtenerDato(*L,Q)<=D))
{
Q=Siguiente(*L,Q);
R=Siguiente(*L,R);
}
if(Q!=NULO)
{
(R->sig)=P;
}
else
{
R=Anterior(*L,Q);
R->sig=P;
P->sig=Q;
}
}
return 1;
}
else return 0;
}
tDato EliminarPosicion(tLista* L,tPosL P)
{
tDato D;
tPosL Q;
D=ObtenerDato(*L,P);
if(P==Primera(*L))
{
(*L)=Siguiente(*L,P);
free(P);
}
else
{
Q=Anterior(*L,P);
Q->sig=Siguiente(*L,P);
free(P);
}
return D;
}
void EliminarLista(tLista* L)
{
while(!EsListaVacia(*L)) EliminarPosicion(L,Primera(*L));
}