Array de estructura

Genera un array de estructuras de 500 elementos


#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>

/*-----------------Definicion de tipo de la estructura---------------------*/

typedef struct datos_empleados{
            float nemp;
            char nombre[30];
            int edad;
            char domicilio[50];
            struct datos_empleados *next;
}DATOS;
/*-----------------------Definicion de funciones---------------------------*/
void agregar(void);
void mostrar(DATOS *ptr);
void pornumero(DATOS *ptr);
void pornombre(DATOS *ptr);
int buscar(DATOS *ptr);
void eliminar(DATOS *ptr);

/*-------------------------Definicion de variables-------------------------*/
int i,j=0,J=0,n=0,z=0;        //Contadores
char opc,op,E;                //Variables de seleccion
DATOS *p,*base, *one,*paux;           //Array de tipo DATOS y puntero a estructura

/*----------------------Inicio de funcion principal------------------------*/
main(){
clrscr();
do{                        //ciclo para menu principal
clrscr();
printf("\t\t *****************MENU*****************");
printf("\n\n\n\n\n\t\t\t A.- Agregar Empleado.");
printf("\n\t\t\t B.- Ordenar Los Empleados.");
printf("\n\t\t\t C.- Mostrar Todos Los Empleados.");
printf("\n\t\t\t D.- Buscar Empleado.");
printf("\n\t\t\t E.- Eliminar Empleado.");
printf("\n\t\t\t S.- Salir.\n");
printf("\n\t\t\tSu opcion es: ");
scanf("%c",&opc);
opc=toupper(opc);
switch(opc){
                 case 'A':fflush(stdin);    // Agrega registro a nuestra base de datos
                          agregar();
                        break;
                 case 'B':                   // Ordena los registro
                            p=one;   clrscr();
                             if(one!=NULL){            //valida si hay datos o no
                            do{                  //Ciclo de submenu
                                   clrscr();
                                   printf("\n\n\n\t\t Elija El Tipo De Ordenamiento ");
                                   printf("\n\n\t\t A.- Por Numero De Empleado.");
                                   printf("\n\t\t B.- Por Nombre De Empleado.");
                                   printf("\n\t\t C.-(Volver al menu principal).");
                                   printf("\n\n\t\t Cual es su opcion: ");    fflush(stdin);
                                   scanf("%c",&op); op=toupper(op);
                                   switch(op){
                                               case 'A':
                                                /* pornumero(p);       // ordenacion por numero
                                                 printf("\n LOS ELEMENTOS HAN SIDO ORDENADOS CON EXITO PRESIONE UNA TECLA PARA CONTINUAR...");
                                                 printf("\n\t\t LUEGO PRESIONE (C) PARA VOLVER AL MENU PRINCIPAL... ");
                                               getch(); */
                                               break;
                                               case 'B':  /*          // ordenacion por nombre
                                                 pornombre(p);
                                                 printf("\n LOS ELEMENTOS HAN SIDO ORDENADOS CON EXITO PRESIONE UNA TECLA PARA CONTINUAR...");
                                                 printf("\n\t\t LUEGO PRESIONE (C) PARA VOLVER AL MENU PRINCIPAL... ");
                                                 getch();   */
                                               break;
                                                  }

                                   }while(op!='C');
                                      }
                                    else if(j==1){
                                                printf("\n\n\tSolo existe un elemento no es necesario ordenar...");
                                                printf("\n\tPresione una tecla par volver...");getch();
                                                }
                                                else{
                                                printf("\n\n\t No existen elementos actualmente, no es posible ordenar...");
                                                printf("\n\tPresione una tecla par volver...");  getch();}

                                   break;

                 case 'C':            //Muestra los datos del registro
                 clrscr();
                 if(one!=NULL){             //valida si hay datos o no
                   J=0;
                   p=one;
                  fflush(stdin);
                  for(i=0;p!=NULL;i++)  {       //ciclo que llama a funcion mostrar()
                  mostrar(p);p=p->next; J++;
                  if(J>=4){    J=0;
                  printf("\t\t VER SIGUIENTES....");
                  getch();
                  clrscr();
                  } }
                  printf("\n\t PRESIONE UNA TECLA PARA CONTINUAR..."); }
                  else{
                  printf("\n\n No existen registros actualmente para mostrar.");
                  }
                  getch();
                  break;
                case 'D':       //busca un registro en el array base
                 clrscr();
                if(one!=NULL){       //valida si hay datos o no
                p=one;
                buscar(p);}
                else{
                   printf("\n\n\t No existen registros actualmente para buscar.");
                  getch();
                }
                break;

                case 'E':      //Busca el registro seleccionado y lo elimina de la base
                clrscr();
                if(one!=NULL){     //valida si hay datos o no
               z=buscar(p);
               fflush(stdin);
               if(z>=0){
               printf("\n\n\t Seguro de que desea eliminar este elemento (s/n): "); scanf("%c",&E);
               if(E=='s'||E=='S'){
               eliminar(p);
               printf("\n\t El registro se elimino exitosamente.");
               printf("\n\t Presione una tecla para volver al menu principal..");  getch();
               }

                 }  }
                else{
                printf("\n\n\t No existen registro que eliminar");
                printf("\n\t Presione una tecla para volver al menu principal..."); getch();
                }

                break;

}
}while(opc!='S');    //fin de ciclo menu principal
return 0;
}
/*----------------------Fin de funcion principal---------------------------*/

/*-----------------------Funcion de agregacion-----------------------------*/
void agregar(void){
char b[21];
//for(i=0;i<1;i++,j++) {       //ciclo para agregar datos y llevar registro de datos introducidos.
clrscr();
base=(DATOS *) malloc(sizeof(DATOS));
printf("Agrege un numero de empleado: ");
gets(b);             //se captura numero de empleado como cadena de char.
base->nemp=atof(b);  fflush(stdin);  //luego se convierte la cadena capturada a un numero real o float.
printf("Agrege el nombre del empleado: ");
gets(base->nombre); fflush(stdin);
printf("Introduzca la edad: ");
scanf("%d",&base->edad); fflush(stdin);
printf("Introduzca el domicilio: ");
gets(base->domicilio);fflush(stdin);
if(one==NULL){
one=base;
base->next=NULL;
}
else
{
base->next=one;
one=base;
}
}
/*-------------------------------------------------------------------------*/

/*---------------------Funcion para mostrar  registros---------------------*/

void mostrar(DATOS *ptr){
printf("\n # empleado: %.0f",ptr->nemp);
printf("\n Nombre: %s",ptr->nombre);
printf("\n Edad: %d",ptr->edad);
printf("\n Domicilio: %s\n\n",ptr->domicilio);
}
/*-------------------------------------------------------------------------*/

/*-------------------Funcion de ordenacion por numero----------------------*/
/*void pornumero(DATOS *ptr){
DATOS baux,*aux;                // variables y punteros auxiliares tipo DATOS
for(J=0;J<=j;J++){              // ciclo para seleccion e intercambio de valores
ptr=one;

aux=ptr->next;
for(i=0;i<j-1;i++,){       //bucle para checar todos los registros
   if((ptr->nemp)<(aux->nemp)){      // seleccion
                 baux=base[i];
                 base[i]=base[i+1];
                 base[i+1]=baux;
            }
}     }
} */
/*---------------------------------------------------------------------------*/

/*-------------------Funcion de ordenacion por nombre-----------------------*/
/*void pornombre(DATOS *ptr){
char *aux,*auxs,*cad1;               //punteros auxiliares
int w,x,y,flag,flag2;          //contadores,centinelas y banderas.
DATOS baux;                  //variable auxiliar de tipo DATOS.
ptr=base;
cad1=ptr->nombre;
for(J=0;J<j;J++,ptr++) {
cad1=ptr->nombre;
                         for(i=0;i<strlen(cad1);i++){
                          cad1=ptr->nombre;
                                       if((cad1[i]<97)&&(cad1[i]>64)){     //conversion a minusculas
                                     cad1[i]=cad1[i]+32;
                                     }         }       }
ptr=base;
aux=ptr->nombre;               //asignacion de un puntero a estructura en un apuntador char
for(w=0;w<j;w++){             //bucles para revisar todas las posibles combinaciones
ptr=base;                     //inicializa
aux=ptr->nombre;
for(x=0;x<j;x++,ptr++){        //ciclo  para checar por cadena
aux=ptr->nombre;
auxs=(ptr+1)->nombre;
                        for(y=0,flag=0;flag==0;y++){        //ciclo para checar por caracter
                         if(aux[y]>auxs[y]&&x<j-1){         //si el primer caracter es diferente
                               baux=base[x];
                               base[x]=base[x+1];
                               base[x+1]=baux;
                               flag=1;
                               }
                          if(aux[y]==auxs[y]){
                              for(J=0,flag2=0;J<strlen(aux)||J<strlen(auxs)&&flag2==0;J++){     //ciclo para checar por caracter si los primeros
                              if(aux[J]>auxs[J]&&x<j-1){                                       //caracteres son iguales
                               baux=base[x];
                               base[x]=base[x+1];
                               base[x+1]=baux;
                               flag2=1;
                               }
                              }
                          }
                          else{
                            flag=1;
                          }
                        }

}
}
}  */
/*-------------------------------------------------------------------------*/

/*-----------------------Funcion de busqueda-------------------------------*/
int buscar(DATOS *ptr){
int busca, caux,r=5,z;
float m;
ptr=one;
char *cax,*cad1,*cad2;
DATOS buscanom;
do{
clrscr();
ptr=one;
z=-1;
printf("\n\n\t\t ELIJA LA FORMA DE BUSQUEDA...");
printf("\n\t\t A.- Por numero de empleado.");
printf("\n\t\t B.- Por nombre de empleado.");
printf("\n\t\t C.-(Volver al menu principal).");
printf("\n\n\t\t Cual es su opcion: ");
scanf("%c",&op); op=toupper(op);
switch(op){
                  case 'A': clrscr();
                        ptr=one;  r=0;
                        printf("\n\n\t Buscar por numero de empleado.");
                         printf("\n\n\t\t Introdusca el numero del empleado a buscar: ");  scanf("%i",&busca);
                         caux=ptr->nemp;          fflush(stdin);

                         for(i=0;ptr!=NULL;i++){
                               // ciclo que busca en todos los registros  de la base
                          caux=ptr->nemp;

                          if(caux==busca){            // seleccion si es identica
                              z=i;
                               printf("\n\nEl elemento actualmente se encuentra en la posicion [%i].\n\n",i+1); i=j;
                                   mostrar(ptr);    r=1;  // r es bandera o centinela
                                   printf("\n\n Buscar otro?  (s/n):"); scanf("%c",&op);
                                   if(op=='n'||op=='N') {op='C'; break;}
                                   else{op='a';}
                                   }
                          else{ r=0;}             //  bandera o centinela
                         ptr=ptr->next;
                         }
                         if(r==0){
                         printf("\n\n\n El elemento que busca no se encuentra actualmente en la lista...");
                                   printf("\n\n Buscar otro?  (s/n):"); scanf("%c",&op);
                         if(op=='n'||op=='N') {op='C'; break; }
                                   else{op='a';}

                         }

                  break;
                  case 'B':
                  clrscr();

                        ptr=one;  r=0;    fflush(stdin);
                        printf("\n\n\t Buscar por nombre de empleado.");
                        printf("\n\n\t\t Introdusca el nombre del empleado a buscar: ");  gets(buscanom.nombre);
                        cad2=buscanom.nombre;
                        cad1=ptr->nombre;
                        for(J=0;ptr!=NULL;J++) {

                        for(i=0;i<strlen(cad2);i++){
                          cad2=buscanom.nombre;
                                       if((cad2[i]<97)&&(cad2[i]>64)){     // conversion a minusculas
                                     cad2[i]=cad2[i]+32;
                                     }                }
                         for(i=0;i<strlen(cad1);i++){
                          cad1=ptr->nombre;
                                       if((cad1[i]<97)&&(cad1[i]>64)){     //conversion a minusculas
                                     cad1[i]=cad1[i]+32;
                                     }         }
                                     ptr=ptr->next;
                                     }
                          ptr=one;

                        for(i=0;ptr!=NULL;i++){           // for para seleccion de elementos iguales
                        cad2=buscanom.nombre;
                        cad1=ptr->nombre;
                        m=strcmp(cad1,cad2);
                        if(m==0){                        z=i;
                        printf("\n\nEl elemento actualmente se encuentra en la posicion [%i].\n\n",i+1); i=j;
                                   mostrar(ptr);    r=1;      i=j;
                                               printf("\n\n Buscar otro?  (s/n):"); scanf("%c",&op);
                         if(op=='n'||op=='N') {op='C'; break; }
                                   else{op='a';}

                        }

                         else{ r=0;}
                        ptr=ptr->next;
                        }
                        if(r==0&&op){
                        printf("\n\n\n El elemento que busca no se encuentra actualmente en la lista...");
                        printf("\n Compruebe que: ");printf("\n *El nombre este correctamente escrito.");printf(" (No importan mayusculas o minusculas.)");
                        printf("\n *El nombre no contenga caracteres extra¤os.(ejemplo: %,&,$,?,etc..)");
                        printf("\n *El nombre este dado de alta.");
                        printf("\n\n Buscar otro?  (s/n):"); scanf("%c",&op);
                        if(op=='n'||op=='N') {op='C'; break;}
                        else{op='a';}
                        }
                  break;

  }
}while(op!='C');
return z;
}
/*-------------------------------------------------------------------------*/

/*-----------------------Funcion para eliminacion--------------------------*/
void eliminar(DATOS *ptr){
paux=one;
ptr=one;
for(i=0;i<z;i++){
paux=ptr;
ptr=ptr->next;
}
            if(paux!=NULL)
            {
            if(paux==one)
                        one=paux->next;
            else
                        paux->next=ptr->next;

}}