permita borrar cualquier elemento de la lista sin perder infromacion.*/
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
//Definimos el nodo
struct registro{
char nombre[40];
struct registro *sig;
};
//Acuñamos un nuevo tipo de dato: nodo
//Así, más adelante, en la función malloc
//podremos utilizar sizeof(nodo)
typedef struct registro nodo;
int mostrar_menu(){
int opcion;
system("cls");
printf("\n********* MENU *********");
printf("\n0. Salir del programa.");
printf("\n1. Leer lista enlazada.");
printf("\n2. Mostrar lista.");
printf("\n3. Borrar un elemento.");
printf("\n4. Insertar un elemento.");
printf("\nElige una de las opciones: ");
scanf("%d",&opcion);
return(opcion);
}
void leer_lista(nodo *inicio){
nodo *registro;
int cont=1;
char seguir='s';
registro=inicio;
do{
printf("\nNombre nodo %d: ",cont++);
scanf(" %[^\n]",registro->nombre);
printf("\nDeseas leer mas nombres (s/n)?: ");
scanf(" %c",&seguir);
if(seguir=='s'){
registro->sig=(nodo *) malloc(1*sizeof(nodo));
registro=registro->sig;
}
else{
printf("\nFINAL DE LA LISTA");
registro->sig=0;
}
}while(seguir=='s');
return;
}
void mostrar_lista(nodo *inicio){
nodo *registro;
int cont=1;
registro=inicio;
printf("\n************ LISTA ************");
do{
printf("\n Direccion: %X\tNombre %d: %s\tApunta a: %X",registro,cont++,registro->nombre,registro->sig);
registro=registro->sig;
}while(registro!=0);
printf("\n\nPara continuar presione cualquier tecla.");
fflush(stdin);
getchar();
return;
}
nodo *borrar_nodo(nodo *inicio,char aux_nombre[]){
nodo *registro;
char seguir='s';
registro=inicio;
//En caso de que el nodo que quiero borrar
//sea el primero
if(strcmp(registro->nombre,aux_nombre)==0)
inicio=registro->sig;
else
//EN caso de que el nodo que quiero borrar
//esté entre el primero y el último
do{
if(strcmp((registro->sig)->nombre,aux_nombre)==0){
registro->sig=(registro->sig)->sig;
seguir='n';
}
else
registro=registro->sig;
}while(seguir=='s' && registro!=0);
//En caso de que el nodo que quiera borrar
// sea el último de la fila
return(inicio);
}
nodo *insertar_nodo(nodo *inicio,char aux_nombre[],char aux_nombre_anterior[]){
nodo *registro,*nuevo;
char seguir='s';
registro=inicio;
nuevo=(nodo *) malloc(1*sizeof(nodo));
strcpy(nuevo->nombre,aux_nombre);
//Supongo que insertamos en una posicion intermedia
do{
if(strcmp((registro->sig)->nombre,aux_nombre_anterior)==0){
//Conectamos con el siguiente
nuevo->sig=registro->sig;
registro->sig=nuevo;
seguir='n';
}
else
registro=registro->sig;
}while(seguir=='s' && registro!=0);
return(inicio);
}
main(){
//Reservamos memoria para el puntero
//al primer nodo
nodo *inicio;
char aux_nombre[40],aux_nombre_anterior[40];
inicio=(nodo *) malloc(1*sizeof(nodo));
int opcion;
do{
opcion=mostrar_menu();
switch(opcion){
case 0:
printf("\nPrograma finalizado");
break;
case 1: //Leer lista
leer_lista(inicio);
break;
case 2: //Mostrar lista
mostrar_lista(inicio);
break;
case 3://Eliminar nodo
printf("\nEscriba el nombre que desea borrar de la lista: ");
scanf(" %[^\n]",aux_nombre);
inicio=borrar_nodo(inicio,aux_nombre);
break;
case 4:
system("cls");
printf("\nNombre: ");
scanf(" %[^\n]",aux_nombre);
printf("\nDelante de quien desea insertar ese nombre: ");
scanf(" %[^\n]",aux_nombre_anterior);
inicio=insertar_nodo(inicio,aux_nombre,aux_nombre_anterior);
break;
default:
printf("\nOpcion incorrecta.");
getchar();
}
}while(opcion!=0);
getchar();
getchar();
}