pabloliva87

Test FuDePan

Jul 19th, 2011
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.60 KB | None | 0 0
  1. /* Examen de tesinas para FuDePAN */
  2.  
  3. /** TADs usados en la resolucion */
  4. typedef struct {
  5.     unsigned int index;     /* El indice del arreglo que estamos recorriendo */
  6.     int ended;      /* Flag para indicar si llegamos al final del arreglo (1),
  7.                 o todavia se lo esta recorriendo (0) */
  8. } ArrayIndex;  
  9.  
  10. /** Funciones Auxiliares */
  11.  
  12. /* Assignandcheck coloca el valor de array[arrindex.index] en res[place], aumenta arrindex.index en 1,
  13.    y verifica si se ha llegado al final de array; si es asi, le da el valor 1 a arrindex.ended;
  14.    devuelve el nuevo valor de arrindex */
  15. ArrayIndex assignandcheck (ArrayIndex arrindex, const int place, const unsigned int size, const int array[], int * res) {
  16.     res[place] = array[arrindex.index];
  17.     arrindex.index ++;
  18.     if (arrindex.index == size) {  
  19.         arrindex.ended = 1;
  20.     }
  21.     return arrindex;
  22. }
  23.  
  24. /* Arraychunkcopy toma copyamount elementos desde la posicion arrindex de array,
  25.    y los va colocando en res a partir de la posicion resindex */
  26. void arraychunkcopy (const unsigned int arrindex, const unsigned int copyamount, const unsigned int resindex, const int array [], int * res) {
  27.     unsigned int i;
  28.     for (i=0; i<copyamount; i++) {
  29.         res[resindex+i] = array[arrindex+i];
  30.     }
  31. }
  32.  
  33. /** La funcion requerida en el enunciado */
  34.  
  35. unsigned int merge(const int array1[], unsigned int size1, const int array2[], unsigned int size2, int result[])
  36.     {
  37.  
  38.     ArrayIndex fstindex, sndindex; /* Indices para recorrer el primero y segundo arreglos, respectivamente */
  39.  
  40.     unsigned int i;
  41.     unsigned int remainder; /* La cantidad de elementos de un arreglo que falta copiar, cuando se termino
  42.                    el recorrido del otro arreglo */
  43.  
  44.     const unsigned int size_result = size1 + size2;
  45.    
  46.     fstindex.index = 0;
  47.     fstindex.ended = 0;
  48.     sndindex.index = 0;
  49.     sndindex.ended = 0;
  50.    
  51.     i = 0;
  52.     while (i<size_result && fstindex.ended == 0 && sndindex.ended == 0) {  
  53.         /* Si no se llego al final de ninguno de los arreglos, comparamos el primer elemento de cada arreglo */
  54.         if (array1[fstindex.index] <= array2[sndindex.index]) {
  55.             fstindex = assignandcheck (fstindex, i, size1, array1, result);
  56.         } else {
  57.             sndindex = assignandcheck (sndindex, i, size2, array2, result);
  58.         }
  59.         i++;
  60.     }
  61.     if (i<size_result) { /* Si el ciclo termino, pero no recorrimos ambos arreglos... */
  62.                 /*... entonces falta copiar parte de un arreglo */
  63.         remainder = size_result - i;
  64.        
  65.         if (sndindex.ended == 1) {
  66.             arraychunkcopy (fstindex.index, remainder, i, array1, result);
  67.         } else if (fstindex.ended == 1) {
  68.             arraychunkcopy (sndindex.index, remainder, i, array2, result);
  69.         }
  70.     }
  71.      
  72.     return size_result;
  73. }
Add Comment
Please, Sign In to add comment