domingo, 31 de mayo de 2015

LISTAS EN C++



LISTAS EN C++




LISTAS

Como sabemos en programación secuencial hay agrupaciones de datos limitadas como son los vectores o matrices, las listas cambian esto, ya que se pueden crear dinámica-mente y existen varios manejos y se pueden llevar mas datos.

Y estos datos se llevan en nodos los cuales son los que llevan los datos, un ejemplo seria un vehículo que seria la lista los nodos serian las personas dentro del carro y las datos serian la edad, nombre, teléfono de la persona.

A continuación se puede ver algunos ejemplos 


EXPLICACIÓN CÓDIGO

CÓDIGO EN EJECUCIÓN




CÓDIGO UTILIZADO

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<alloc.h>
#include<iostream.h>
#include<string.h>

using namespace std;

struct nodo
{
       int posicion; //para indicar en que posicion se creo 
       int cedula;                          
       char nombre[20];                         
       char apellido[20];
       char sexo[20];  //cedula,nombre,apellido,sexo,edad,tel,correo,dir,semestre,programa
       int edad;
       int telefono;
       char correo[30];
       char direccion[30];
       char semestre[30];
       char programa[30];
       
       struct nodo *siguiente;
};

typedef struct nodo *TipoLista; //estamos  definiendo  tipo de  datos  a  struct nodo


//Funciones con listas
  int Insertar(TipoLista &lista, int pos, int c, char *nom,char *ape, char *se, int ed, int te, char *co, char *di, char *sem, char *pro);
int EliminarRegistro(TipoLista &l, int pos);
int  ListaVacia(TipoLista l);
void MostrarLista(TipoLista l);
void Modificar(TipoLista l, int d,int nd, char *cd, char *ncd, int bandera,int posi);
    void  borrar(TipoLista &l);

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

int main()
{
    TipoLista lista = NULL;//ya  habiamos  declarado el  tipo lista  y lo ponemos  null
int op,opc,pos=1,bpos; //op opc opciones de menus pos es la posicion en lista estudiante bpos posicion a buscar
int ced,ed,tel; 
                             // cedula,edad,telefono
    char nomb[20],apell[20],sexo[20],corr[30],dir[30],sem[30],pro[30];  //nombre,apellido,sexo,correo,dir,semestre,programa

    TipoLista p;
    do
    {
     system("cls");
          printf("***MENU***\n\n");
          printf("1. Agregar datos estudiante \n");
          printf("2. Modificar datos de estudiante\n");
          printf("3. Mostrar datos del estudiante\n");
          printf("4. Eliminar datos estudiante\n");
          printf("5. Vaciar lista\n");
          printf("6. Salir\n\n");
          printf("Digite la opcion: ");
          scanf("%d",&op);
    
             switch(op)
        {
        case 1:
                do 
                        {
                system("cls");
                printf("Digite  Cero (0) en la cedula del estudiante para salir\n");
                printf("Digite la cedula del estudiante # %d :",pos);  //se ingresa datos del estudiante
                scanf("%d",&ced); 
                if(ced==0) { printf("Digite una tecla para continuar..."); break; }
                fflush(stdin);
                            printf("Digite el nombre del estudiante # %d :",pos); 
                gets(nomb);
                            fflush(stdin); 
                            printf("Digite el apellido del estudiante # %d :",pos);
                gets(apell); 
                fflush(stdin);
                            printf("Digite el sexo del estudiante # %d :",pos) ;
                gets(sexo); 
                fflush(stdin);
                printf("Digite la edad del estudiante # %d :",pos);  
                scanf("%d",&ed);
                fflush(stdin);
                printf("Digite el telefono del estudiante # %d :",pos) ;
                scanf("%d",&tel); 
                fflush(stdin);
                printf("Digite el correo del estudiante # %d :",pos);
                gets(corr);
                fflush(stdin);
                printf("Digite el direccion del estudiante # %d :",pos) ;
                gets(dir);
                fflush(stdin);
                printf("Digite el semestre del estudiante # %d :",pos); 
                gets(sem);
                fflush(stdin);
                printf("Digite el programa del estudiante# %d :",pos); 
                gets(pro);
                fflush(stdin);
                           pos=Insertar(lista,pos,ced,nomb,apell,sexo,ed,tel,corr,dir,sem,pro);//le enviamos valores a lista
                            }while (ced!=0);
        break;
        
                case 2:
                     int dato,ndato;
                     char cdato[20], cndato[20];
                    MostrarLista(lista);
                    opc=0;
                    printf("\n Digite la posicion del estudiante en la lista:  ");
            scanf("%d",&bpos);
            printf("\n Digite 1 (uno) si el dato que desea modificar es un numero o digite 2 (dos) si son letras:  ");
            scanf("%d",&opc);
            if(opc==1)   
                     {
                            printf("\n Digite el dato a modificar: "); 
                            scanf("%d",&dato);  
                            printf("\n Digite el dato nuevo: ");
                   scanf("%d",&ndato); 
                            Modificar(lista,dato,ndato,"x","x",opc,bpos); 
                     }
                     if(opc==2)   
                     {
                            fflush(stdin);       
                            printf("\n Digite el dato a modificar: "); 
                            gets(cdato); 
                            fflush(stdin); 
                            printf("\n Digite el dato nuevo: ");
                   gets(cndato); 
                            fflush(stdin);  
                            Modificar(lista,0,0,cdato,cndato,opc,bpos);   
                     }
                     if(opc!=1 && opc!=2)   
                     {
                             printf("\n no ha elegido bien... debe ingresa de nuevo desde menu \n ");     
                     }     
            system("pause");
                break;
        
        case 3:
               MostrarLista(lista);
               system("pause");
        break;
        
        case 4:
                     MostrarLista(lista);
            printf("Digite la posicion del estudiante que desea eliminar:");
            scanf("%d",&bpos);
                     pos=EliminarRegistro(lista,bpos);
            system("pause");
        break;
        
        case 5:
                     printf("LA LISTA  SERA  BORRADA!\n");
                    borrar( lista);
                    MostrarLista(lista);
                    system("pause");
        break;
       
        case 6:
                     printf("ha salido del pograma\n");
                system("pause");
        break;
             
        default:
           printf("Opcion no valida!\n");
           system("pause");
              }


} while(op!=6);

    printf("ha salido del pograma\n");
system("pause");
    return 0;
}



//***********
//Lista Vacia
int ListaVacia(TipoLista lista)
{
return (lista == NULL);
}
 //**************************
//Insertar registro
int Insertar(TipoLista &lista, int pos, int c, char *nom,char *ape, char *se, int ed, int te, char *co, char *di, char *sem, char *pro)//estamos embiando nul y un  balor que  es (x)
{
    TipoLista nuevo , anterior;
    nuevo = new(struct nodo);
    nuevo->posicion=pos;
    nuevo->cedula = c;
    strcpy(nuevo->nombre,nom);
    strcpy(nuevo->apellido,ape);
    strcpy(nuevo->sexo,se);
    nuevo->edad = ed;
    nuevo->telefono = te;
    strcpy(nuevo->correo,co);
    strcpy(nuevo->direccion,di);
    strcpy(nuevo->semestre,sem);
    strcpy(nuevo->programa,pro);
    //ordeno los elementos  ingresados
    if (ListaVacia(lista) || lista->cedula > c)
    {
       nuevo->siguiente = lista;
       lista  = nuevo;
    }
    else
    {
        anterior= lista;
    
        while(anterior->siguiente  &&  anterior->siguiente->cedula <= c)
        anterior= anterior->siguiente;
        nuevo->siguiente=anterior->siguiente;
        anterior->siguiente=nuevo;   
    } 
    pos++;
    return pos; 
}
 //**************************
//Imprimir lista
void MostrarLista(TipoLista lista)
{
  //  int a[];
TipoLista nodo = lista;

   if(ListaVacia(nodo)) printf("Lista vacia\n");
   else 
   {
while(nodo) 
        {
              printf("posicion: %d \n", nodo->posicion);
              printf("cedula: %d \n", nodo->cedula); //cedula,nombre,apellido,sexo,edad,tel,correo,dir,semestre,programa
              printf("nombre: "); puts(nodo->nombre);
              printf("apellido: "); puts(nodo->apellido);
              printf("sexo: "); puts(nodo->sexo);
              printf("edad: %d \n", nodo->edad);
              printf("telefono: %d \n", nodo->telefono);
              printf("correo: ");puts(nodo->correo);
              printf("direccion: ");puts(nodo->direccion);
              printf("semestre: ");puts(nodo->semestre);
              printf("programa: ");puts(nodo->programa);
              printf("- - - - - - - - -\n");
              
              nodo = nodo->siguiente;
        }
        printf("\n");
   }
}
 //**************************
//Modificar
 void Modificar(TipoLista lista, int d,int nd, char *cd, char *ncd, int bandera, int posi)
{
TipoLista nodo;
int ban = 0, bane = 0;
nodo = lista;

while(nodo)
     {
         if(nodo->posicion == posi)  
         {      
                if(bandera==1)  //para modificar cedula edad telefono
                {        
                      if(nodo->cedula == d) 
                      {
                    nodo->cedula=nd;
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            //break;
                      }
                      if(nodo->edad == d)
                      {
                    nodo->edad=nd;
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            //break;
                      }
                      if(nodo->telefono == d) 
                      {
                    nodo->telefono=nd;
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);//estamos  mostrando la  lista
                            //break;
                      } 
               }
               if(bandera==2) //modifica nombre,apellido,sexo,correo,dir,semestre,programa
                {        
                      if(strcmp(nodo->nombre,cd)==0) 
                      {
                            strcpy(nodo->nombre,ncd);
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            break;
                      }
                      if(strcmp(nodo->apellido,cd)==0) 
                      {
                            strcpy(nodo->apellido,ncd);
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            break;
                      }
                      if(strcmp(nodo->sexo,cd)==0) 
                      {
                            strcpy(nodo->sexo,ncd);
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            break;
                      }
                      if(strcmp(nodo->correo,cd)==0) 
                      {
                            strcpy(nodo->correo,ncd);
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            break;
                      }
                      if(strcmp(nodo->direccion,cd)==0)
                      {
                            strcpy(nodo->direccion,ncd);
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            break;
                      }
                      if(strcmp(nodo->semestre,cd)==0) 
                      {
                            strcpy(nodo->semestre,ncd);
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            break;
                      }
                      if(strcmp(nodo->programa,cd)==0) 
                      {
                            strcpy(nodo->programa,ncd);
                    ban=1;
                    printf("Registro Modificado\n");
                            MostrarLista(lista);
                            break;
                      }
               }
               bane=1;
         }
       nodo = nodo->siguiente;//nod   es  igual al  nodo  digiente   ba  aumentando posiciones 
}
if(ban==0)
    printf("No se encontro el registro\n");
    if(bane==0)
    printf("No se encontro el estudiante\n");
}
 //**************************
//Eliminar
int EliminarRegistro(TipoLista &lista, int pos)//en la  lista  ba  a  borrar el  valor  ingresado que esta  guarado en v
{
    TipoLista nodo, anterior;//creamos  dos nodos
    nodo= lista;
    int ban =0;

    if(lista!=NULL)
    {
        while(nodo!=NULL)
        {
            if(nodo->posicion==pos)
            {
            ban=1;
               printf("Registro del estudiante Eliminado\n");
                if(nodo==lista)//para el ultimo  valor
                    lista = lista->siguiente;//es igual al  sigiente  valor y como es  el ultimo es null lista =null
                else
                    anterior->siguiente = nodo->siguiente;// anterio apunta a sigiente  y esto es  =  nodo sigiente apunta a  sigiente//elimina  la  posicion  y apunta a la  sigiente posicion
                delete(nodo);//y  borramos  nodo
                pos--;
                return pos;
            }
            anterior = nodo;// la posicion actual
            nodo =nodo->siguiente;//pasa  a la  sigiente posicion
        }
    }
    else
        printf(" Lista vacia..!\n");
if(ban==0)
    printf("No se encontro el registro del estudiante %d \n",pos);
    return pos;
}

 void  borrar(TipoLista &lista)
 {
    TipoLista  nodo , anterior;//creamos  dos nodos
    nodo= lista;
    if(lista!=NULL)
    {
        while(lista!=NULL)
       {      
               nodo=lista ;
               lista = lista->siguiente;  
               delete(nodo);//y  borramos  nodo                       
       }
    }
}



No hay comentarios.:

Publicar un comentario