intercala.cpp

// $Id$

/* 
   COMIENZO DE DESCRIPCION 

   Escriba procedimientos para intercalar ({\it merge}): 
   (i) dos listas ordenadas {\tt L1} y {\tt L2} en una nueva lista 
   {\tt L}; (ii) un vector {\tt VL} de {\tt n} listas ordenadas 
   como nueva lista {\tt L}. Notar que {\it intercalar} ({\it merge}) 
   implica en ambos casos que la nueva lista {\tt L} debe resultar 
   tambi\'en {\it ordenada}.
   keywords: lista

   FIN DE DESCRIPCION 
*/
// -----------------------------------------------------------------
#include <iostream>
#include <limits.h>
#include "./util.h"
using namespace std ;

// -----------------------------------------------------------------
// intercala (merge) dos listas ordenadas L1 y L2 como nueva lista L
template <typename t>
void intercala_2L (list<t> &L1,list<t> & L2 ,list<t> &L){ 
  typename list<t>::iterator p,q;
  t x1,x2;
  L.clear();         // reinicializa nueva lista L
  p=L1.begin();      // iterador para recorrer lista L1
  q=L2.begin();      // iterador para recorrer lista L2
  while (p!=L1.end() && q!=L2.end()) {
    x1=*p;
    x2=*q;
    if (x1<=x2) {
       L.insert(L.end(),x1);
       p++;}
    else {
       L.insert(L.end(),x2);
       q++; 
    } // end if
  } // end while
  while (p!=L1.end()) {L.insert(L.end(),*p++);} // eventual resto L1
  while (q!=L2.end()) {L.insert(L.end(),*q++);} // eventual resto L2
}

// -------------------------- --------------------------------------
// intercala el vector VL de "n" listas ordenadas como nueva lista L
template <typename t>
void intercala_vn (vector< list<t> > &VL, list<t> &L){ 
  typename list<t>::iterator p,q,z;
  int n;
  t x1,x2;
  L.clear();         // reincializa nueva lista L
  // copia la primera lista L_0 del vector VL en la lista L
  n=VL.size();
  q=VL[0].begin();   // iterador para la lista L_0
  z=VL[0].end();     // posicion del fin de la lista L_0
  while (q!=z) L.insert (L.end(),*q++); // notar: inserta al final
  // ahora intercala las restantes del vector en la lista L
  for (int i=1;i<n;i++) {
    p=L.begin();        // iterador para recorrer la nueva lista L
    q=VL[i].begin();    // iterador para recorrer la lista L_i
    z=VL[i].end();      // fin de la lista L_i
    while (p!=L.end() && q!=z) { 
      x1=*p;
      x2=*q;
      if (x1<=x2) {p++;}           // no inserta y avanza
      else {p=L.insert(p,x2);q++;} // inserta y refresca posicion 
    } // end while
    // pasa el remanente de la lista L_i a la nueva lista L
    while (q!=z) L.insert(L.end(),*q++); // notar: inserta al final
  } // end i
}

//--------------------------------------------------------------------
int main() {
  typedef int dato;
  typedef list<dato> lista;
  typedef vector<lista> vecto_l;
  int v0[]={2,4,6,8,11,13,14,-1};
  int v1[]={1,3,5,7,9,27,-1};
  int v2[]={2,4,6,8,42,50,-1};
  int n=3 ; // hay 3 listas
  lista L1,L2,L;
  cout << endl;
  cout << "intercala 2 listas ordenadas L1 y L1 como lista L " << endl;
  // arma lista ordenada L1
  insertl (L1,v1,-1);
  cout << "lista L1: ";
  printl(L1);
  // arma lista ordenada L2
  insertl (L2,v2,-1);
  cout << "lista L2: ";
  printl(L2);

  // intercala listas L1 y L2 en L
  intercala_2L(L1,L2,L); 
  cout << "lista L intercalada: ";
  printl(L);

  cout << endl;
  cout << "intercala un vector VL de N listas ordenadas " << endl;

  // numero de listas "n"
  cout << "numero de listas ; n = " << n << endl;
  vecto_l VL (n);  // constructor del vector de listas

  // arma lista ordenada L1
  insertl (VL[0],v0,-1);
  insertl (VL[1],v1,-1);
  insertl (VL[2],v2,-1);

  // imprime cada lista
  for (int i=0;i<n;i++) {
    cout << "lista L [" << i << "]: ";printl(VL[i]);
  } // end for
  // intercala las N listas en una unica lista
  intercala_vn (VL,L); 
  cout << "lista L intercalada: ";
  printl (L);

  cout << endl;
  return 0;
}
//--------------------------------------------------------------------

Generated by GNU Enscript 1.6.6.