miércoles, 8 de junio de 2011

Lista Enlazada Simple Borrado

/*Realiza un programa para enlazar una lista simple, añade 1 menu que nos
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();
}

3 comentarios: