no me recorre el apuntador en la funcion borrar, alguien que me pueda ayudar?
mi codigo es este:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct lista{ // Aqui se declara la estructura que tiene cada nodo de la lista
char nombres[30]; // Este campo es para datos
struct lista *ap_sgte_nodo; // Este es el apuntador al nodo siguiente
};
typedef struct lista nodo; // Y se define el tipo de dato como nodo
void menu() // Esta funcion contiene el encabezado y el mneu del sistema
{
puts("");
puts("*****************************************");
puts("Este programa crea una lista de nombres");
puts("1. Crear la lista");
puts("2. Insertar nombre");
puts("3. Borrar nombre");
puts("4. Salir");
puts("****************************************");
}
void llenar(nodo *direccion)
{
puts("Teclea el nombre a agregar en lista, para terminar la lista teclea FIN ");
fflush(stdin);
scanf("%s",direccion->nombres);
if(strcmp(direccion->nombres,"FIN")==0)
{
direccion->ap_sgte_nodo=NULL;
}
else
{
direccion->ap_sgte_nodo=(nodo*)malloc(sizeof(nodo));
llenar(direccion->ap_sgte_nodo);
}
return;
}
void desplegar(nodo *direccion)
{
if(direccion->ap_sgte_nodo != NULL)
{
printf("%s \n",direccion->nombres);
desplegar(direccion->ap_sgte_nodo);
}
return;
}
nodo *insertar(nodo *direccion)
{ nodo *buscar(nodo *, char []);
nodo *aptr_aux;
nodo *nuevo_registro;
char d_anterior[30];
char nuevo_dato[30];
puts("Teclea el nuevo dato");
fflush(stdin);
scanf("%s",nuevo_dato);
puts("Colocar antes del dato:");
fflush(stdin);
scanf("%s",d_anterior);
if(strcmp(direccion->nombres,d_anterior) == 0)
{ nuevo_registro = (nodo *)malloc(sizeof(nodo));
strcpy(nuevo_registro->nombres,nuevo_dato);
nuevo_registro->ap_sgte_nodo = direccion;
direccion = nuevo_registro;
}
else
{ aptr_aux = buscar(direccion, d_anterior);
if(aptr_aux == NULL)
puts("No existe este dato en la lista");
else
{
nuevo_registro = (nodo *)malloc(sizeof(nodo));
strcpy(nuevo_registro->nombres,nuevo_dato);
nuevo_registro->ap_sgte_nodo = aptr_aux->ap_sgte_nodo;
aptr_aux->ap_sgte_nodo = nuevo_registro;
}
}
return direccion;
}
nodo *buscar(nodo *aptr_b, char d_buscar[]) //Declaracion de la funcion de busqueda
{ if(strcmp(aptr_b->ap_sgte_nodo->nombres,d_buscar) == 0) //Verificar si en el primer nodo esta el dato buscado
return(aptr_b); //Si es asi, regersar el apuntador
else if(aptr_b->ap_sgte_nodo->ap_sgte_nodo == NULL) //Sino verificar si se esta en el ultimo nodo
return(NULL); //Si es asi regresar null
else buscar(aptr_b->ap_sgte_nodo, d_buscar); //Sino continuar la busqueda
}
nodo *borrar(nodo *direccion)
{ nodo *buscar(nodo *,char []); //Declaraci?n de la funcion buscar
nodo *ap_aux; //Apuntador auxiliar
char nombre_borrar[30]; //Arreglo para guardar el dato a borrar
nodo *temporal;
puts("Teclea el nombre a borrar"); //Solicita el nombre a borrar
scanf("%s",nombre_borrar); //Recibe el nombre a borrar
if(strcmpi(direccion->nombres,nombre_borrar) == 0) //Verifica si es el primer dato
{
temporal = direccion->ap_sgte_nodo; //Si lo es guarda su apuntador al nodo siguiente en temporal
free(direccion); //Libera la memoria utilizada
direccion = temporal; //El apuntador inicial se le asigna el nodo siguiente
}
else
{
ap_aux = buscar(direccion,nombre_borrar); //Sino invoca la funcion buscar y asigna a nodo_aux la direccion buscada
if(ap_aux == NULL) //Si la funcion buscar regresa un nulo signiifica que el dato no esta en la lista
puts("Este nombre no se encuentra en la lista");
else temporal = ap_aux->ap_sgte_nodo->ap_sgte_nodo; //Sino avanza al siguiente nodo
free(ap_aux->ap_sgte_nodo); //Libera ese nodo
ap_aux->ap_sgte_nodo = temporal; //Y asignale la direccion del nodo anterior
}
return direccion; //Regresa al apuntador a primero
}
int main() // Declaracion de la funcion principal
{
int continua=0; // Variables para: mantener el ciclo de operacion
int opcion; // opciones del menu
nodo *inicio; // Variable de apuntador tipo estructura para ubicar el inicio de la lista
while(continua==0)
{
menu();
puts("");
puts("Teclea la opcion que desees:");
fflush(stdin);
scanf("%d",&opcion);
switch(opcion)
{
case 1:
inicio=(nodo*)malloc(sizeof(nodo));
llenar(inicio);
desplegar(inicio);
puts("Termina crear lista");
break;
case 2:
insertar(inicio);
puts("");
puts("Lista actualizada:");
desplegar(inicio);
break;
case 3:
borrar(inicio);
puts("");
puts("Lista actualizada");
desplegar(inicio);
break;
case 4:
puts("Saliendo...");
exit(0);
}
}
}
mi codigo es este:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct lista{ // Aqui se declara la estructura que tiene cada nodo de la lista
char nombres[30]; // Este campo es para datos
struct lista *ap_sgte_nodo; // Este es el apuntador al nodo siguiente
};
typedef struct lista nodo; // Y se define el tipo de dato como nodo
void menu() // Esta funcion contiene el encabezado y el mneu del sistema
{
puts("");
puts("*****************************************");
puts("Este programa crea una lista de nombres");
puts("1. Crear la lista");
puts("2. Insertar nombre");
puts("3. Borrar nombre");
puts("4. Salir");
puts("****************************************");
}
void llenar(nodo *direccion)
{
puts("Teclea el nombre a agregar en lista, para terminar la lista teclea FIN ");
fflush(stdin);
scanf("%s",direccion->nombres);
if(strcmp(direccion->nombres,"FIN")==0)
{
direccion->ap_sgte_nodo=NULL;
}
else
{
direccion->ap_sgte_nodo=(nodo*)malloc(sizeof(nodo));
llenar(direccion->ap_sgte_nodo);
}
return;
}
void desplegar(nodo *direccion)
{
if(direccion->ap_sgte_nodo != NULL)
{
printf("%s \n",direccion->nombres);
desplegar(direccion->ap_sgte_nodo);
}
return;
}
nodo *insertar(nodo *direccion)
{ nodo *buscar(nodo *, char []);
nodo *aptr_aux;
nodo *nuevo_registro;
char d_anterior[30];
char nuevo_dato[30];
puts("Teclea el nuevo dato");
fflush(stdin);
scanf("%s",nuevo_dato);
puts("Colocar antes del dato:");
fflush(stdin);
scanf("%s",d_anterior);
if(strcmp(direccion->nombres,d_anterior) == 0)
{ nuevo_registro = (nodo *)malloc(sizeof(nodo));
strcpy(nuevo_registro->nombres,nuevo_dato);
nuevo_registro->ap_sgte_nodo = direccion;
direccion = nuevo_registro;
}
else
{ aptr_aux = buscar(direccion, d_anterior);
if(aptr_aux == NULL)
puts("No existe este dato en la lista");
else
{
nuevo_registro = (nodo *)malloc(sizeof(nodo));
strcpy(nuevo_registro->nombres,nuevo_dato);
nuevo_registro->ap_sgte_nodo = aptr_aux->ap_sgte_nodo;
aptr_aux->ap_sgte_nodo = nuevo_registro;
}
}
return direccion;
}
nodo *buscar(nodo *aptr_b, char d_buscar[]) //Declaracion de la funcion de busqueda
{ if(strcmp(aptr_b->ap_sgte_nodo->nombres,d_buscar) == 0) //Verificar si en el primer nodo esta el dato buscado
return(aptr_b); //Si es asi, regersar el apuntador
else if(aptr_b->ap_sgte_nodo->ap_sgte_nodo == NULL) //Sino verificar si se esta en el ultimo nodo
return(NULL); //Si es asi regresar null
else buscar(aptr_b->ap_sgte_nodo, d_buscar); //Sino continuar la busqueda
}
nodo *borrar(nodo *direccion)
{ nodo *buscar(nodo *,char []); //Declaraci?n de la funcion buscar
nodo *ap_aux; //Apuntador auxiliar
char nombre_borrar[30]; //Arreglo para guardar el dato a borrar
nodo *temporal;
puts("Teclea el nombre a borrar"); //Solicita el nombre a borrar
scanf("%s",nombre_borrar); //Recibe el nombre a borrar
if(strcmpi(direccion->nombres,nombre_borrar) == 0) //Verifica si es el primer dato
{
temporal = direccion->ap_sgte_nodo; //Si lo es guarda su apuntador al nodo siguiente en temporal
free(direccion); //Libera la memoria utilizada
direccion = temporal; //El apuntador inicial se le asigna el nodo siguiente
}
else
{
ap_aux = buscar(direccion,nombre_borrar); //Sino invoca la funcion buscar y asigna a nodo_aux la direccion buscada
if(ap_aux == NULL) //Si la funcion buscar regresa un nulo signiifica que el dato no esta en la lista
puts("Este nombre no se encuentra en la lista");
else temporal = ap_aux->ap_sgte_nodo->ap_sgte_nodo; //Sino avanza al siguiente nodo
free(ap_aux->ap_sgte_nodo); //Libera ese nodo
ap_aux->ap_sgte_nodo = temporal; //Y asignale la direccion del nodo anterior
}
return direccion; //Regresa al apuntador a primero
}
int main() // Declaracion de la funcion principal
{
int continua=0; // Variables para: mantener el ciclo de operacion
int opcion; // opciones del menu
nodo *inicio; // Variable de apuntador tipo estructura para ubicar el inicio de la lista
while(continua==0)
{
menu();
puts("");
puts("Teclea la opcion que desees:");
fflush(stdin);
scanf("%d",&opcion);
switch(opcion)
{
case 1:
inicio=(nodo*)malloc(sizeof(nodo));
llenar(inicio);
desplegar(inicio);
puts("Termina crear lista");
break;
case 2:
insertar(inicio);
puts("");
puts("Lista actualizada:");
desplegar(inicio);
break;
case 3:
borrar(inicio);
puts("");
puts("Lista actualizada");
desplegar(inicio);
break;
case 4:
puts("Saliendo...");
exit(0);
}
}
}