Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ANTÓN RAMIREZ en 14 Diciembre 2010, 20:50 pm



Título: Vectores Dinamicos
Publicado por: ANTÓN RAMIREZ en 14 Diciembre 2010, 20:50 pm
Los vectores dinamicos tiene las mismas propiedades que los vectores estaticos lo que varia  es la creación en la cual las dimensiones del mismo son ingresadas en tiempo de ejecucion. Una vez asignadas estas dimensiones ya no se pueden modificar.
En este programa se puede relizar las operaciones de leer,mostrar,ordenar y eliminar un vector dinamico, ademas de las operaciones insertar y eliminar elementos del vector dinamico.
 Bueno al realizar este programa tengo una dificultad para el insertar y eliminar dinamicamente , me parecio interesante realizar esto , porque lo logico seria utilizar pilas y colas , pero en fin espero que me puedan apoyar que le falta a mi algoritmo para que no se cuelgue .


ATTE : ANTON RAMIREZ , LEONARDO VLADIMIR  (ALUMNO UNI)


Código:
[list]
[li][ftp][/ftp][tt][color=blue]using namespace std;

int Menu();
void Linea();
void LeerVector(int **X, int *dimX);
void MostrarVector(int *X, int dimX);
void InsertarxPosic(int **X, int *dimX, int Pos);
void InsertarxValor(int **X, int *dimX, int Val);
void EliminarxPosic(int **X, int *dimX, int Pos);
void EliminarxValor(int **X, int *dimX, int Val);
void Redimensionar_Aumentar(int *X, int *dimX);
void Redimensionar_Disminuir(int *X, int *dimX);
void Redimensionar1(int *X, int *dimX);
void Redimensionar2(int *X, int *dimX);

int main()
{
   int *A, na, posic, valor, Opcion;
   A = NULL;
   do{
      Opcion = Menu();
      switch(Opcion)
      {
         case 1 : system("cls"); Linea();
               cout<<"\t\tRUTINA DE CREACION\n"; Linea();
               printf("\n");
               LeerVector(&A, &na);
               break;
         case 2 : system("cls"); Linea();
               cout<<"\t      RUTINA DE VIZUALIZACION\n"; Linea();
               printf("\n");
               MostrarVector(A, na);
               printf("\n\n"); system("pause");  
               break;
         case 3 : system("cls"); Linea();
               cout<<"\t    RUTINA INSERTA POR POSICION\n"; Linea();
               printf("\n");
               MostrarVector(A, na);
               if(A!=NULL){
                  cout<<"\n\nIngrese  la  POSICION => ";
                  cin>>posic;
                  posic = posic-1;
                  InsertarxPosic(&A, &na, posic);
               }
               printf("\n\n"); system("pause");
               break;
         case 4 : system("cls"); Linea();
               cout<<"\t    RUTINA ELIMINA POR POSICION\n"; Linea();
               printf("\n");
               MostrarVector(A, na);
               if(A!=NULL){
                  cout<<"\n\nIngrese la POSICION => ";
                  cin>>posic;
                  posic = posic-1;
                  EliminarxPosic(&A, &na, posic);
               }
               printf("\n\n"); system("pause");
               break;
         case 5 : system("cls"); Linea();
               cout<<"\t    RUTINA INSERTA POR VALOR\n"; Linea();
               printf("\n");
               MostrarVector(A, na);
               if(A!=NULL){
                  cout<<"\n\nIngrese el VALOR => ";
                  cin>>valor;
                  InsertarxValor(&A, &na, valor);
               }
               printf("\n\n"); system("pause");
               break;
         case 6 : system("cls"); Linea();
               cout<<"\t    RUTINA ELIMINA POR VALOR\n"; Linea();
               printf("\n");
               MostrarVector(A, na);
               if(A!=NULL){
                  cout<<"\n\nIngrese el VALOR => ";
                  cin>>valor;
                  EliminarxValor(&A, &na, valor);              
               }
               printf("\n\n"); system("pause");
               break;
         case 0 :
               free(A);
               A=NULL;
               exit(1);
      }
   }while(Opcion);
  
  printf("\n");
  system("PAUSE");
  return(0);
}

int Menu()
{
   int op;
   do{
   system("cls");
   printf("\n\t    OPERACIONES CON VECTORES DINAMICOS \n\n");
   printf("\t1.  Crear  \n");
   printf("\t2.  Mostrar \n");
   printf("\t3.  Insertar por Posicion \n");
   printf("\t4.  Eliminar por Posicion \n");
   printf("\t5.  Insertar por Valor \n");
   printf("\t6.  Eliminar por Valor \n");
   printf("\t0.  SALIR \n\n");
   printf("\tDigite su opcion => ");
   scanf("%d",&op);
  }while(op<0 || op>7);
  return(op);
}

void LeerVector(int **X, int *dimX)
{
   int N, i, val;
   printf("Ingrese dimension del vector : ");
   scanf("%d", &N);  
  
   *X=(int*)malloc(N*sizeof(int));
  
   if(*X == NULL)
   {
      printf("Error: No hay memoria suficiente...\n");
      system("pause");
      exit(1);
   }
   else
   {
      printf("\nIngrese los datos del vector ...\n\n");
      for(i=0;i<N;i++)
      {
         printf("X[%d] = ", i + 1);
         scanf("%d", *X+i);
      }
      *dimX=N;
   }
      
}

void MostrarVector(int *X, int dimX)
{
   if(X==NULL){
      printf("El vector esta VACIO ...");
   }
   else{
      printf("\nVECTOR [%d] = ", dimX);
      for(int i=0;i<dimX;i++)
      {
         printf("%4d", *(X+i));
      }
   }
}
  
void InsertarxPosic(int **X, int *dimX, int Pos)
{
   int val;
  
   if(*X == NULL){
      printf("\nEl vector esta VACIO ...\n\n");
   }
   else{
      if(Pos<*dimX && Pos>=0){
         Redimensionar_Aumentar(*X, dimX); //Redimensionar1(*X, dimX);
         for(int i=*dimX; i>Pos; i--){
            *(*X+i) = *(*X+(i-1));
         }
         printf("\n...Valor a Insertar -> "); scanf("%d", &val);
         *(*X+Pos) = val;
         MostrarVector(*X, *dimX);
      }
      else{
         printf("\nError: Posicion fuera de rango ...\n");
      }
   }
}
  

void InsertarxValor(int **X, int *dimX, int Val)
{
   int i, Hallado, Pos;
  
   i=0; Hallado=0;
   if(*X == NULL){
      printf("\nEl vector esta VACIO ...\n\n");
   }
   else{
         while(i<*dimX && !Hallado){
            if(*(*X+i)==Val){
            Hallado = 1;
            Pos = i;
            }
            i = i+1;
         }
   }
   if(Hallado){
      InsertarxPosic(&*X, dimX, Pos);
   }
   else{
      printf("\nError: Valor no encontrado ...\n");
   }
}

void EliminarxPosic(int **X, int *dimX, int Pos)
{  
  
   if(*X == NULL){
      printf("\nEl vector esta VACIO ...\n\n");
   }
   else{
      if(Pos<*dimX && Pos>=0){
         for(int i=Pos; i<*dimX; i++){
            *(*X+i) = *(*X+(i+1));
         }
         Redimensionar_Disminuir(*X, dimX); //Redimensionar2(*X, dimX);    
         MostrarVector(*X, *dimX);
      }
      else{
         printf("\nError: Posicion fuera de rango ...\n");
      }
   }
}

void EliminarxValor(int **X, int *dimX, int Val)
{
   int i, Hallado, Pos;
  
   i=0; Hallado=0;
   if(*X == NULL){
      printf("\nEl vector esta VACIO ...\n\n");
   }
   else{
      while(i<*dimX && !Hallado){
         if(*(*X+i)==Val){
            Hallado = 1;
            Pos = i;
         }
      i = i+1;
      }
   }  
   if(Hallado){
      EliminarxPosic(&*X, dimX, Pos);
   }
   else{
      printf("\nError: Valor no encontrado ...\n");
   }
}
  
void Redimensionar1(int *X, int *dimX)
{
   X = (int *)realloc(X,(*dimX+1)*sizeof(int));
   *dimX=*dimX+1;  
}

void Redimensionar2(int *X, int *dimX)
{
   X = (int *)realloc(X,(*dimX-1)*sizeof(int));  
   *dimX=*dimX-1;
}

void Redimensionar_Aumentar(int *X, int *dimX)
{
   int *A;
   int n=*dimX;
   n = n+1;
   A = (int *)malloc(n*sizeof(int));
   for(int i=0; i<n-1;){
      *(A+i) = *(X+i);
      i = i+1;
   }
   *dimX = n;
   X = A;
}

void Redimensionar_Disminuir(int *X, int *dimX)
{
   int *A;
   int n=*dimX;
   n = n-1;
   A = (int *)malloc(n*sizeof(int));
   for(int i=0; i<n;){
      *(A+i) = *(X+i);
      i = i+1;
   }
   *dimX = n;
   X = A;
}

void Linea()
{
   printf("\t==================================\n");
}[/color][/tt][/li]
[li][/li]
[/list]