Problema ¿tonto?

duda
28 de Enero del 2005
#include<stdio.h>
#include<string.h> //biblioteca para uso de funciones con cadenas de caracteres
#include<stdlib.h> //biblioteca para uso de funciones como malloc


//*******************************************************************************************
//declaro la estructura de cada nodo de la agenda
struct nodo{
char nombre [25];
long int tlfno;
char email[50];
struct nodo* siguiente;
};
//prototipos de las funciones que usaremos en el programa
void menu();
struct nodo* Cargar_fichero(struct nodo* inicio_lista);
struct nodo* Anadir_nodo (struct nodo* inicio_lista,char nombre[],long int tlfno,char email[]);
void Buscar_nodo(struct nodo* inicio_lista);
void Mostrar (struct nodo* inicio_lista);
struct nodo* Vaciar_lista(struct nodo* inicio_lista);
struct nodo* Borrar_nodo(struct nodo* inicio_lista);
void Salvar_fichero (struct nodo* inicio_lista);
int recorrer_lista(struct nodo* inicio_lista);

//**********************************************************************************************

//parte principal del programa
int main()
{
struct nodo* inicio_lista=NULL; //declaro un puntero del tipo struct nodo
int opcion;
char n[25],e[50];
long int t;


do //realizare este bucle hasta que la opcion escogida sea la de salir(8)
{
menu();
scanf("%d",&opcion);
switch (opcion) //dependiendo de la opcion que escojas hara......
{
case 1:
inicio_lista=Cargar_fichero(inicio_lista);
break;
case 2:
Salvar_fichero(inicio_lista);
break;
case 3: //pedire los datos con los que llamare a la funcion para añadirlos en la agenda
printf("n");
printf("Introduce el nombre --->");
scanf("%s",&n);
printf("Introduce el telefono --->");
scanf("%d",&t);
printf("Introduce el email ------>");
scanf("%s",&e);
inicio_lista=Anadir_nodo(inicio_lista,n,t,e);
break;
case 4:
inicio_lista=Borrar_nodo(inicio_lista);
break;
case 5:
inicio_lista=Vaciar_lista(inicio_lista);
break;
case 6:
Mostrar(inicio_lista);
break;
case 7:
Buscar_nodo(inicio_lista);
break;
default: //si escojo otra opcion diferente de estas mostrare este mensaje
printf("n");
printf("!!!!!!!!La Opcion escogida no es correcta!!!!!!!!!!n");
}
}while (opcion != 8 );
system("PAUSE");
}
//*********************************************************************************************

//mostramos el menu de opciones para que el usuario escoja la oportuna

void menu()
{
printf("n");
printf("n");
printf(" MENU DE OPCIONESn ");
printf("n");
printf("n");
printf(" 1-Cargar Agendan");
printf(" 2-Guardar Agendan");
printf(" 3-Anadir Registro en la Agendan");
printf(" 4-Borrar Registro de la Agendan");
printf(" 5-Vaciar Agendan");
printf(" 6-Mostrar Agenda Completan");
printf(" 7-Buscar Y Mostrar Registro en Agendan");
printf(" 8-Salirn");
printf("n");
printf("n");
printf(" Elige una opcion------------>"); //le pedimos que escoja la opcion
}

//*********************************************************************************************

//funcion de añadir en la agenda

struct nodo* Anadir_nodo(struct nodo* inicio_lista,char nombre[],long int tlfno, char email[])
{
int a;
//declaro dos punteros y uno de ellos hago que apunte al inicio de la lista
struct nodo* nuevo_nodo;
struct nodo* ptr;
ptr=inicio_lista;
//mientras el puntero no apunte a NULL ni el nombre que queremos meter sea por orden alfabetico
//anterior al que apunta el puntero, avanzaremos una posicion en la lista
while ((ptr!=NULL) && (a=strcmp(ptr->nombre,nombre)<0))
ptr = ptr -> siguiente;
if (ptr==inicio_lista) //insertaremos al principio de la lista
{
nuevo_nodo=(struct nodo*)malloc(sizeof(struct nodo)); //declaramos espacio para el puntero
if(nuevo_nodo==NULL) //si falla al reservar espacio nos devolvera el puntero apuntando a NULL
{printf("Fallo reservando espacion");
return(ptr=NULL);
}
strcpy(nuevo_nodo -> nombre , nombre); //relleno el nodo de la lista con los datos dados
nuevo_nodo->tlfno=tlfno;
strcpy(nuevo_nodo->email,email);
nuevo_nodo->siguiente=inicio_lista;
inicio_lista=nuevo_nodo; //reubico el inicio de la lista
}
else if (ptr!=NULL) //insertare el nodo delante del puntero ptr
{
nuevo_nodo=(struct nodo*)malloc(sizeof(struct nodo*));
if(nuevo_nodo==NULL) //si falla al reservar espacio nos devolvera el puntero apuntando a NULL
{printf("Fallo reservando espacion");
return(ptr=NULL);
}
strcpy(nuevo_nodo->nombre,ptr->nombre); //copio en el nuevo nodo los datos del puntero ptr
nuevo_nodo->tlfno=ptr->tlfno; //y en el ptr apunto los nuevos datos
strcpy(nuevo_nodo->email,ptr->email);
nuevo_nodo->siguiente=ptr->siguiente;
ptr->siguiente=nuevo_nodo;
strcpy(ptr->nombre,nombre);
ptr->tlfno=tlfno;
strcpy(ptr->email,email);
}
else //insertare el nuevo nodo como ultimo nodo de la lista
{
ptr=inicio_lista;
while (ptr->siguiente!=NULL) //comienzo desde el principio y llego hasta el final de la lista
ptr=ptr->siguiente;
nuevo_nodo=(struct nodo*)malloc(sizeof(struct nodo*));
if(nuevo_nodo==NULL) //si falla al reservar espacio nos devolvera el puntero apuntando a NULL
{printf("Fallo reservando espacion");
return(ptr=NULL);
}
strcpy(nuevo_nodo->nombre,nombre);
nuevo_nodo->tlfno=tlfno;
strcpy(nuevo_nodo->email,email); //relleno los datos en nuevo nodo
nuevo_nodo->siguiente=NULL;
ptr->siguiente=nuevo_nodo;
}
return (inicio_lista); //devuelvo el inicio de la lista
}

//*********************************************************************************************

//nos pedira el nombre del nodo a buscar y mostrara sus datos por pantalla

void Buscar_nodo(struct nodo* inicio_lista)
{
struct nodo* aux=inicio_lista; //declaro un nodo auxiliar que apuntara al inicio de la lista
char name[25];
int i=0,a,j=0;
printf("n");
printf("Introduce el Nombre a Buscar-->"); //se pide el nombre para buscarlo en la agenda
scanf("%s",name);
while (aux!=NULL) //recorrere toda la lista
{
a=strcmp(name,aux->nombre); //comparo los nombres para ver si son iguales
if (a==0)
{
printf("n");
printf("*****************n");
printf("Registro[%d]n",i); //imprimo por pantalla los datos obtenidos
printf("%sn",aux->nombre);
printf("%dn",aux->tlfno);
printf("%sn",aux->email);
j++;
}
i++; //aumento el contador de registros
aux=aux->siguiente;
}
if (j==0) //si no hay ningun registro en la agenda con ese nombre mostrare por pantalla...
printf("No se ha encontrado nadan");
}

//********************************************************************************************

//mostrare por pantalla la lista entera

void Mostrar(struct nodo* inicio_lista)
{
int i=0;
struct nodo* aux=inicio_lista;
if (aux==NULL)
printf("La Agenda esta vacian");
else
{ while (aux!=NULL)
{
printf("*******************n");
printf("Registro[%d]n",i);
printf("%sn",aux->nombre);
printf("%dn",aux->tlfno);
printf("%sn",aux->email);
printf("n");
i++;
aux=aux->siguiente;
}
}
}

//********************************************************************************************

//vaciaremos la agenda actual

struct nodo* Vaciar_lista(struct nodo* inicio_lista)
{
inicio_lista=NULL; //hago que el inicio de la lista apunte al vacio
return(inicio_lista);
}

//*********************************************************************************************

//borraremos un registro de la agenda

struct nodo* Borrar_nodo(struct nodo* inicio_lista)
{
int num,j=0,b;
struct nodo* aux1;
struct nodo* aux2;
aux1=inicio_lista;
printf(" Que registro deseas eliminar?"); //pedimos el numero de nodo a eliminar en la agenda
scanf("%d",&num);
if (aux1==NULL)
{printf("n");
printf("*******No hay nada que borrar ya que la Agenda esta vacia*******n");
}
else
{
if (num==0)
{ //voy hasta el registro que debo eliminar con los punteros
inicio_lista=inicio_lista->siguiente;
}

else
{ b=recorrer_lista(inicio_lista);
if (num<b)
{ for (j=0;j<num;j++)
{aux2=aux1;
aux1=aux1->siguiente;
}
aux2->siguiente=aux1->siguiente;
free(aux1); //libero el espacio en memorio de este puntero
}
else
{printf("n");
printf("*********No hay tantos registros en la Agenda***********");
}
}
}
return(inicio_lista);
}

//*********************************************************************************************

//para almacenar la agenda o lista en un fichero

void Salvar_fichero(struct nodo* inicio_lista)
{
int b;
char nombre_fichero[25];
struct aux{
char name[25];
long int tl;
char em[50];
}aux;

FILE *fichero;
struct nodo* paux=inicio_lista;
if (paux==NULL)
{
printf("n");
printf("No hay nada en la Agenda para grabar");

}
else
{
printf("n");
printf("Nombre del fichero--->"); //pido el nombre del fichero
scanf("%s",nombre_fichero);
fichero=fopen(nombre_fichero,"w"); //abro el fichero para escribir en el
if (fichero==NULL)
{
printf("n");
printf("Error al abrir el fichero");
}
printf("paso 1/2 ok");
while (paux!=NULL) //recorro toda la lista y voy alamacenandola por estructuras en el fichero
{
strcpy(aux.name,paux->nombre);
aux.tl=paux->tlfno;
strcpy(aux.em,paux->email);
fwrite(&aux,sizeof(aux),1,fichero);

paux=paux->siguiente;
printf("paso 2/2 ok");
}
b=fclose(fichero); //cierro el fichero
if (b!=0)
printf("Error al cerrar el fichero");
}
}

//**********************************************************************************************

//para cargar una agenda

struct nodo* Cargar_fichero(struct nodo*inicio_lista)
{
char nombre_fichero[25];
struct aux{
char name[25];
long int tl;
char em[50];
}aux;

FILE *fichero;
char no[25],em[50];
long int tl;
printf("n");
printf("Fichero a Abrir---->");
scanf("%s",nombre_fichero);
fichero=fopen(nombre_fichero,"rb");
while(fread(&aux,sizeof(aux),1,fichero)==1)
{
inicio_lista=Anadir_nodo(inicio_lista,aux.name,aux.tl,aux.em);
}
fclose(fichero);
return(inicio_lista);
}

//**********************************************************************************************

//funcion que devolvera el numero de nodos que hay en la lista

int recorrer_lista(struct nodo* inicio_lista)
{
int i=0;
struct nodo* paux;
paux=inicio_lista;
while(paux!=NULL) //recorro toda la lista y voy aumentando i
{i++;
paux=paux->siguiente;
}
return i; //devuelvo el numero de nodos que hay
}

Jola tengo un problema con ese codigo , en teoria funcionaria como una agenda, pero al introducir varias personas en la agenda, (pongamos 8 o 10) el programa se cuelga
Alguien podria alludarme?
Gracias