[C con Clase] Constructores Copia (David Fire)

John tanyin21 en hotmail.com
Jue Oct 22 16:51:26 CEST 2009


Hola David, muchas gracias por la ayuda, todo esto es un trabajo que tengo
que presentar en la universidad y el profesor quiere que se haga un
constructor que reciba dos instancias de lista para concatenar los
contenidos de las dos listas, ahora yo perfectamente pudiese hacer un método
para ello y se que funcionaria, pero según el profesor tengo que hacerlo así
como él lo especifica, yo ya tengo en mi mente el algoritmo para concatenar
las listas pero lo que me impide a seguir es el error que me da.
Con respecto al error, bueno yo uso el IDE Codeblocks, y bueno a como
mostrare a continuación en el siguiente código no me da error al compilarlo,
lo que sucede es que la aplicación se queda ahí y no hace nada.

#include <iostream>
using namespace std;

class nodo {
   public:
    nodo(int v, nodo *sig = NULL)
    {
       valor = v;
       siguiente = sig;
    }

   private:
    int valor;
    nodo *siguiente;

   friend class lista;
};

typedef nodo *pnodo;


class lista {
   public:
    lista() { primero = actual = NULL; }
    lista(lista luno, lista ldos){}
    ~lista();

    void Insertar(int v);
    void Borrar(int v);
    bool ListaVacia() { return primero == NULL; }
    int encuentraMenor();
    int encuentraMayor();
    void Mostrar();
    void Siguiente();
    void Primero();
    void Ultimo();
    bool Actual() { return actual != NULL; }
    int ValorActual() { return actual->valor; }

   private:
    pnodo primero;
    pnodo actual;
};

lista::~lista()
{
   pnodo aux;

   while(primero) {
      aux = primero;
      primero = primero->siguiente;
      delete aux;
   }
   actual = NULL;
}

void lista::Insertar(int v)
{
   pnodo anterior;

   // Si la lista está vacía
   if(ListaVacia()) {
      // Asignamos a lista un nievo nodo de valor v y
      // cuyo siguiente elemento es la lista actual
      primero = new nodo(v, primero);
   }
   else {
      // Buscar el nodo de valor menor a v
      anterior = primero;
      // Avanzamos hasta el último elemento o hasta que el siguiente tenga
      // un valor mayor que v
      while(anterior->siguiente)
         anterior = anterior->siguiente;
      // Creamos un nuevo nodo después del nodo anterior, y cuyo siguiente
      // es el siguiente del anterior
      anterior->siguiente = new nodo(v, anterior->siguiente);
   }
}

int lista::encuentraMenor(){
    nodo *aux;
    int menor,contador=0,posicion=0;
    aux = primero;
    menor = -1;
    if(ListaVacia()){
        return menor;
        } else {
            menor = aux->valor;
            while(aux){
                if(menor<=aux->valor){
                    aux=aux->siguiente;
                    contador++;
                    } else {
                        menor=aux->valor;
                        posicion=contador;
                        contador++;
                        aux=aux->siguiente;
                        }
                }
        }
    return posicion;
    }

int lista::encuentraMayor(){
    nodo *aux;
    int mayor,contador=0,posicion=0;;
    aux=primero;
    mayor= -1;
    if(ListaVacia()){
        return mayor;
        } else {
            mayor=aux->valor;
            while(aux){
                if(mayor>=aux->valor){
                    aux=aux->siguiente;
                    contador++;
                    } else {
                        mayor=aux->valor;
                        posicion=contador;
                        contador++;
                        aux=aux->siguiente;
                        }
                }
            }
    return posicion;
    }

void lista::Borrar(int v)
{
   pnodo anterior, nodo;

   nodo = primero;
   anterior = NULL;
   while(nodo && nodo->valor < v) {
      anterior = nodo;
      nodo = nodo->siguiente;
   }
   if(!nodo || nodo->valor != v) return;
   else { // Borrar el nodo
      if(!anterior) // Primer elemento
         primero = nodo->siguiente;
      else  // un elemento cualquiera
         anterior->siguiente = nodo->siguiente;
      delete nodo;
   }
}

void lista::Mostrar()
{
   nodo *aux;

   aux = primero;
   while(aux) {
      cout << aux->valor << "-> ";
      aux = aux->siguiente;
   }
   cout << endl;
}

void lista::Siguiente()
{
   if(actual) actual = actual->siguiente;
}

void lista::Primero()
{
   actual = primero;
}

void lista::Ultimo()
{
   actual = primero;
   if(!ListaVacia())
      while(actual->siguiente) Siguiente();
}

int main()
{
    lista Lista;
    lista Listados;


    Lista.Insertar(209);
    Lista.Insertar(19);
    Lista.Insertar(30);

    Listados.Insertar(100);
    Listados.Insertar(178);
    Listados.Insertar(10);
    Listados.Insertar(77);

    lista lis(Lista,Listados);


    cout <<"Esta es la posicion del dato menor:
"<<Lista.encuentraMenor()<<endl;
    cout <<"Este es la posicion del dato mayor:
"<<Lista.encuentraMayor()<<endl;




}


John
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: winmail.dat
Type: application/ms-tnef
Size: 4050 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20091022/bea23da2/attachment.bin>


Más información sobre la lista de distribución Cconclase