/*
 * Instituto Superior de Engenharia do Porto
 *
 * Estruturas de Informação
 *
 * 2000/2001
 *
 * ------------------------------------------
 *
 * Classe de Lista Ordenada de Inteiros
 *
 * listaord.cpp
 *
 */

#include <iostream.h>
#include "listaord.h"
#include "..\\ei-include\\erro.h"

ListaOrdenada::ListaOrdenada(const ListaOrdenada& o) : ListaInteiros(o)
{
}

ListaOrdenada& ListaOrdenada::operator=(const ListaOrdenada& o)
{
	removerTodos();
	copia(*this, o.m_pInicio);
	return *this;
}


bool ListaOrdenada::inserir(int iValor)
{
	NoInteiro* pNo = new NoInteiro(iValor);
	//pNo->m_nConteudo = iValor;

	// lista esta' vazia => inserir unico elemento
	if (vazia())
	{
		pNo->m_pProx = NULL;
		m_pInicio = pNo;
	}
	else
	{
		// encontrar local correcto para inserir

		// novo elemento e' menor que o inicio => inserir no principio
		if (iValor < m_pInicio->m_nConteudo)
		{
			pNo->m_pProx = m_pInicio;
			m_pInicio = pNo;
		}
		else
		{
			NoInteiro* pAnt = m_pInicio;
			for (NoInteiro* pVis = m_pInicio->m_pProx; pVis != NULL && iValor > pVis->m_nConteudo; pVis = pVis->m_pProx)
				pAnt = pVis;

			// pAnt aponta para o elemento onde deve ser feita a inserção
			pNo->m_pProx = pAnt->m_pProx;
			pAnt->m_pProx = pNo;
		}
	}

	return true;
}

bool operator==(const ListaOrdenada& a, const ListaOrdenada& b)
{
	return operator==( (ListaInteiros&)a, (ListaInteiros&)b);
}

ListaOrdenada operator+(const ListaOrdenada& a, const ListaOrdenada& b)
{
	ListaOrdenada laux(a);

	for (ListaInteiros::NoInteiro* p = b.m_pInicio; p != NULL; p = p->m_pProx)
		laux.inserir(p->m_nConteudo);

	return laux;
}

