intercalar elemento en vector

Iniciado por m@o_614, 15 Agosto 2012, 20:50 PM

0 Miembros y 2 Visitantes están viendo este tema.

m@o_614

Saludos estoy haciendo el siguiente código que me tiene que leer un vector de longitud n ordenado ascendente y un elemento x del mismo tipo que los
elementos del vector, intercalar x en el vector v de manera que siga ordenado.
todo esto sin utilizar funciones, solo arreglos

y llevo lo siguiente pero mi problema es en la parte que me tiene que intercalar el elemento x en el vector que no se si esta bien hecha

#include <stdio.h>
#include <stdlib.h>
#define MAX 20

/* Leer un vector de longitud n ordenado ascendente y un elemento x del mismo tipo que los
   elementos del vector, intercalar x en el vector v de manera que siga ordenado.
*/

int main()
{
    int n,i,j,v[MAX],aux,x;
    printf("Dame longitud del vector\n");
    scanf("%d",&n);
    printf("Imprimir vector\n");
    for(i=0;i<n;i++)
    {
        printf("Imprimir elemento %d\n",i);
        scanf("%d",&v[i]);
    }
    printf("Orden ascendente\n");
    for(j=0;j<n;j++)
    {
        for(i=0;i<n;i++)
        {
            if(v[i+1]>v[i])
            {
                aux=v[i+1];
                v[i+1]=v[i];
                v[i]=aux;
            }
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%d\n",v[i]);
    }
    printf("Dame elemento a intercalar\n");
    scanf("%d",&x);
    for(i=0;i<=n;i++)//Aqui le estoy creando una posicion mas al arreglo
    {
        if(x > v[i])
        {
            for(j=n;j>v[i];j--)
            {
                v[j]=v[j-1];/*Aqui recorro los elementos para insertar
                              el elemento x*/
            }
        }
    }
    return 0;
}
me falta todavia la parte en la que se inserta el elemento x en la posicion correcta sin desordenar el vector

gracias

ecfisa

#1
Hola.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
 int *vec, n_elem, elem, i, j;

 randomize();

 /* cantidad de elementos */
 printf("Cantidad de enteros?: ");
 scanf("%d",&n_elem);
 while(getchar()!='\n');

 /* dimensionar arreglo */
 vec = (int*)malloc((n_elem+1)*sizeof(int));

 /* ingreso aleatorio (0-99) */
 for(i = 0; i < n_elem; i++) vec[i] = rand()%100;

 /* buble  */
 for(i=0; i < n_elem; i++)
   for(j=0; j < n_elem; j++)
     if (vec[i] < vec[j]) {
       vec[i] ^= vec[j];
       vec[j] ^= vec[i];
       vec[i] ^= vec[j];
     }

 /* mostrar arreglo ordenado */
 printf("\nArreglo ordenado:   ");
 for(i=0; i < n_elem; i++) printf("%3d",vec[i]);

 /* pedir elemento a insertar */
 printf("\nNumero a insertar:   ");
 scanf("%d", &elem);

 /* insertar elemento */
 i = 0;
 while (elem > vec[i] && i < n_elem) i++;
 for(j = n_elem+1; j > i; j--) vec[j] = vec[j-1];
 vec[i] = elem;

 /* mostrar arreglo con elemento insertado */
 printf("\nArreglo final:      ");
 for(i=0; i < n_elem+1; i++) printf("%3d",vec[i]);

 while(getchar()!='\n');
 getchar();

 return 0;
}


Saludos.

xiruko

Citar/* buble  */
  for(i=0; i < n_elem; i++)
    for(j=0; j < n_elem; j++)
      if (vec[i] < vec[j]) {
        vec[i] ^= vec[j];
        vec[j] ^= vec[i];
        vec[i] ^= vec[j];
      }

nunca habia visto esta manera de ordenar un arreglo y me la apunto :D

solo una cosa y es que diria que en un arreglo de int no hace falta reservar un espacio al final para un null. y si reservas memoria, asegurate al final de liberarla con free(vec).

un saludo!

ecfisa

#3
Hola xiruko.

En realidad el espacio extra reservado es para el elemento a insertar. Y tenes razón, se me escapó el free... :(

Saludos.

xiruko

vaya es verdad, me olvide del objetivo del programa y no cai...  :laugh:

un saludo!

m@o_614

#5
gracias ecfisa le hice unas modificaciones a mi código ya que pensé que lo único que le faltaba era agregar  v=x para integrar el nuevo elemento en el vector sin desordenarlo, pero aunque no me marca errores no hace lo que le pido y no entiendo por qué, leí tu código pero me fue un poco difícil de entender porque todavia no domino el uso de apuntadores

#include <stdio.h>
#include <stdlib.h>
#define MAX 20

/* Leer un vector de longitud n ordenado ascendente y un elemento x del mismo tipo que los
  elementos del vector, intercalar x en el vector v de manera que siga ordenado.
*/

int main()
{
   int n,i,j,v[MAX],aux,x;
   printf("Dame longitud del vector\n");
   scanf("%d",&n);
   printf("Imprimir vector\n");
   for(i=0;i<n;i++)
   {
       printf("Imprimir elemento %d\n",i);
       scanf("%d",&v[i]);
   }
   printf("Orden ascendente\n");
   for(j=0;j<n;j++)
   {
       for(i=0;i<n;i++)
       {
           if(v[i+1]>v[i] && i+1!=n)
           {
               aux=v[i+1];
               v[i+1]=v[i];
               v[i]=aux;
           }
       }
   }
   for(i=0;i<n;i++)
   {
       printf("%d\n",v[i]);
   }
   printf("Dame elemento a intercalar");
   scanf("%d",&x);
   for(i=0;i<=n;i++)
   {
       if(x > v[i])
       {
           for(j=n;j>i;j--)
           {
               v[j]=v[j-1];
           }
       }
   }
   v[i]=x;
   for(i=0;i<=n;i++)
       printf("%d\n",v[i]);
   return 0;
}


me di cuenta que tu usas un while para ir recorriendo los elementos y dejar un espacio para el elemento nuevo, pero yo utilice el for para que me vaya recorriendo el vector uno por uno pero aun asi no funciona

gracias

ecfisa

Hola m@o_614.


#include <stdio.h>
#include <stdlib.h>

#define MAX 21

int main()
{
  int n, i, j, v[MAX], x, aux;

  /* PEDIR CANTIDAD DE ELEMENTOS */
  printf("Dame longitud del vector(maximo 20) :");
  scanf("%d",&n);
  printf("\n");

  /* PEDIR LOS ELEMENTOS */
  for(i = 0; i < n; i++) {
    printf("Elemento %d :",i+1);
    scanf("%d",&v[i]);
    printf("\n");
  }

  /* ORDENAR EL ARREGLO */
  for(i=0; i < n; i++)
    for(j=0; j < n; j++)
      if (v[i] < v[j]) {
        aux  = v[i];
        v[i] = v[j];
        v[j] = aux;
       }

  /* MOSTRAR ARREGLO ORDENADO */
  printf("Orden ascendente\n");
  for(i=0; i<n; i++) printf("%d\n",v[i]);

  /* PEDIR ELEMENTO A INSERTAR */
  printf("Dame elemento a intercalar :");
  scanf("%d",&x);
  printf("\n");

  /* INSERTAR EL ELEMENTO  */
  i = 0;
  while (x > v[i] && i <= n) i++;
  for(j = n+1; j > i; j--) v[j] = v[j-1];
  v[i] = x;

  /* MOSTRAR ARREGLO CON ELEMENTO INSERTADO EN POSICION */
  printf("Resultado\n");
  for(i=0; i<=n; i++) printf("%d\n",v[i]);

  while(getchar()!='\n');
  getchar();

  return 0;
}


Saludos.