예제 #1
0
/**
* Realiza a busca de um valor na lista e retorna
* o nó com este valor.
* @param valor
*/
void ListaDescritor::busca(int valor)
{
    No *noBusca = NULL;
    if(this->vazia())
    {
        cout<<"Lista se encontra vazia."<<endl;
        exit(1);
    }
    else if(this->descritor->getAnt()->getInfo() == valor)
    {
        noBusca = this->descritor->getAnt(); //primeiro nó da lista
    }
    else if(this->descritor->getProx()->getInfo() == valor)
    {
        noBusca = this->descritor->getProx(); //ultimo nó da lista
    }
    else
    {
        No *l = this->descritor->getAnt(); // primeiro nó da lista
        while(l!= NULL && l->getInfo()!= valor)
        {
            l = l->getProx();
        }
        noBusca = l;
    }

    //DSGRAPH
    DSGraph ds;
    //DSGRAPH
    if(noBusca != NULL)
    {
        //DSGRAPH
        showComment("Valor %d encontrado...", valor);
        ds.showCPP(this->descritor, 1, noBusca);
        //DSGRAPH
    }
    else
    {
        //DSGRAPH
        showComment("Valor %d nao encontrado...", valor);
        ds.showCPP(this->descritor);
        //DSGRAPH
    }
}
예제 #2
0
파일: fila.cpp 프로젝트: ufjf-dcc/dsgraph
/**
 * Operação de desenfileiramento (dequeue)
 * @return valor desenfilerado
 */
int Fila::desenfileira()
{
    No *f;
    int valor;
    if(this->vazia())
    {
        //DSGRAPH
        showComment("Fila esta vazia.");
        //DSGRAPH
        exit(1);
    }
    f = this->inicio;
    valor = f->getInfo();
    this->inicio = this->inicio->getProx();
    delete f;
    if(this->vazia())
        this->fim = NULL;
    return valor;
}
예제 #3
0
void Lista::insereNo(int valor){

	if(pri==NULL)
		inserePri(valor);
	else{
		No *p = new No();
	 	No *temp = new No();
	 	No *temp2 = new No();
	  
	 	temp2->atribuiInfo(valor);
	  
		for( p=pri ; p!= NULL ; p = p->consultaProximo()){

		 	temp = p;
		}
		  
		temp->atribuiProximo(temp2->info);
	}
}
예제 #4
0
int Lista::tamanhoLista(){

	if(pri != NULL){

		int i = 0;

		No *p;

		for(p = pri; p != NULL; p = p->consultaProximo()){

			i++;
			p = p->consultaProximo();
		}

		return i;
	}
	else
		cout<<"Lista Vazia"<<endl;

	exit(0);
}
예제 #5
0
int main(){

	 int vertices = 5;
	 Grafo *g = new Grafo(vertices);

	 g->vertices[0].insereVizinho(1);
	 g->vertices[1].insereVizinho(2);
	 g->vertices[2].insereVizinho(3);
	 g->vertices[3].insereVizinho(0);
	 
	 g->profundidade(false);
	// cout << g->contadorProfundidade<<endl;
	
	No *p = new No();
	
	
	for(p = g->conexos->pri;p != NULL; p=p->consultaProximo()){
		cout << p->info<<endl;
	}
	
	return 0;
}
예제 #6
0
파일: lista.cpp 프로젝트: ufjf-dcc/dsgraph
/**
 * Insere um novo elemento na lista.
 * @param item
 */
void ListaEncadeada::insere(int item)
{
    No* novo = new No();
    novo->setInfo(item);
    novo->setProx(NULL);
    if(this->prim == NULL)
    {
        this->prim = novo;
    }
    else
    {
        // vai até o final da lista
        No* temp = this->prim;
        while(temp->getProx() != NULL)
        {
            temp = temp->getProx();
        }

        // faz ultimo apontar para o novo nó
        temp->setProx(novo);
        novo->setAnt(temp);

    }
}
예제 #7
0
		No* rotacaoDupla(No* p, int direcao){

			
			No* aux;
			No* nPai;

			if(direcao == ESQUERDA)			
				aux = p->getNoDir()->getNoEsq();
			else if(direcao == DIREITA)
				aux = p->getNoEsq()->getNoDir();

			if(p->temNoPai() == true){
				nPai = p->getPai();
				if(aux->getChave() > nPai->getChave()){
					nPai->setNoDir(aux);
				}
				else{
					nPai->setNoEsq(aux);
				}
			}

			if(direcao == ESQUERDA){
				rotacaoSimples(p->getNoDir(), DIREITA);
				p->setNoDir(aux);
				rotacaoSimples(p,ESQUERDA);
			}else if(direcao == DIREITA){
				rotacaoSimples(p->getNoEsq(), ESQUERDA);
				p->setNoEsq(aux);
				rotacaoSimples(p, DIREITA);
			}

			if(aux->temNoEsq() == true){
				if(aux->getNoEsq()->temNoEsq() == true){
					aux->getNoEsq()->getNoEsq()->setPai(aux->getNoEsq());
				}
				if(aux->getNoEsq()->temNoDir() == true){
					aux->getNoEsq()->getNoDir()->setPai(aux->getNoEsq());
				}
			}
			if(aux->temNoDir() == true){
				if(aux->getNoDir()->temNoEsq() == true){
					aux->getNoDir()->getNoEsq()->setPai(aux->getNoDir());
				}
				if(aux->getNoDir()->temNoDir() == true){
					aux->getNoDir()->getNoDir()->setPai(aux->getNoDir());
				}
			}

			return aux;

		}
예제 #8
0
		No* rotacaoSimples(No *p, int direcao){
			No *aux;
			No *saida;
			No *nPai;

			if(direcao == ESQUERDA){
				saida = p->getNoDir();
				if(p->getNoDir()->temNoEsq()){
					p->getNoDir()->getNoEsq()->setPai(p);
				}
				if(p->temNoPai() == true){
					nPai = p->getPai();
					p->getNoDir()->setPai(nPai);
					if(saida->getChave() > nPai->getChave()){
						nPai->setNoDir(saida);
					}
					else{
						nPai->setNoEsq(saida);
					}
					saida->setPai(nPai);
				}
				else{
					saida->setPai(NIL);
				}

				p->setPai(p->getNoDir());
				aux = p->getNoDir()->getNoEsq();
				p->getNoDir()->setNoEsq(p);
				p->setNoDir(aux);

			}else if(direcao == DIREITA){

				saida = p->getNoEsq();
				
				if(p->getNoEsq()->temNoDir() == true){
					p->getNoEsq()->getNoDir()->setPai(p);
				}

				if(p->temNoPai()){
					nPai = p->getPai();
					p->getNoEsq()->setPai(nPai);
					if(saida->getChave() > nPai->getChave()){
						nPai->setNoDir(saida);
					}
					else{
						nPai->setNoEsq(saida);
					}
					saida->setPai(nPai);
				}
				else{
					saida->setPai(NIL);
				}

				p->setPai(p->getNoEsq());
				aux = p->getNoEsq()->getNoDir();
				p->getNoEsq()->setNoDir(p);
				p->setNoEsq(aux);

			}

			return saida;

		}
예제 #9
0
//Constrói a árvore
void Tree::buildTree(int frq[])
{
    for(int i = 0; i < 256; i++)
    {
        if(frq[i] != 0)
        {
            No* temp = new No(frq[i], true, i);
            lista->append(temp);
        }
    }

    while(lista->length() > 2)
    {
        //bubblesort
        lista->bubblesort();
        //lista->print();

        //pegando o segundo Nó da lista
        lista->moveToStart();
        //cout << lista->getValue()->getContent() << "/" ;
        lista->next();
        No* temp2 = lista->getValue();

        //cout << temp2->getContent() << " " ;

        //criando o Nó pai do primeiro e do segundo Nó
        lista->moveToStart();
        No* temp = new No(lista->getValue()->getFrequencia() + temp2->getFrequencia() , false);
        lista->moveToStart();

        //Setando os dois filhos
        temp->setFilhos(lista->getValue(), temp2);
        lista->moveToStart();

        //Excluindo os dois filhos
        lista->remove();
        lista->moveToStart();
        lista->remove();
        lista->moveToStart();

        //inserindo o Nó pai
        lista->insert(temp);
    }

    if(lista->length() == 2)
    {
        lista->bubblesort();

        //Pegando o segundo elemento
        lista->moveToStart();
        lista->next();
        No* temp2 = lista->getValue();

        //criando o Nó Raiz
        lista->moveToStart();
        root = new No(lista->getValue()->getFrequencia() + temp2->getFrequencia(), false);
        lista->moveToStart();

        //Setando os dois filhos do Nó raiz
        root->setFilhos(lista->getValue(), temp2);
        lista->moveToStart();
    }
    else
    {
        std::cout << "eRRO!" << std::endl;
    }
}
예제 #10
0
//Procura o último elemento que corresponda a uma codificação dada
std::string Tree::procurafinal(string codificacao)
{
    unsigned char buffer;
    std::string aux_s;
    aux_s.clear();
    ofstream write;

    const char* aux_ch = filename.c_str();

    write.open(aux_ch, std::ios::out | std::ios::binary | std::ios::app);




    if(write.is_open())
    {


        Pilha<No>* pilhadeCodigo = new Pilha<No>();
        pilhadeCodigo->push(root);

        for(int i = 0; i < codificacao.length();i++)
        {


            No* temp = new No();
            if(codificacao[i] == '0')
            {

                temp = pilhadeCodigo->topValue()->getLeftChild();
                if(temp->isLeaf() == false)
                {
                    pilhadeCodigo->push(temp);
                }
                else
                {
                    buffer = temp->getContent();
                    pilhadeCodigo->clear();
                    pilhadeCodigo->push(root);

                    write << buffer;


                }
            }
            else if(codificacao[i] == '1')
            {
                temp = pilhadeCodigo->topValue()->getRightChild();
                if(temp->isLeaf() == false)
                {
                    pilhadeCodigo->push(temp);
                }
                else
                {
                    buffer = temp->getContent();
                    pilhadeCodigo->clear();
                    pilhadeCodigo->push(root);

                    write << buffer;


                }
            }

        }

    }
    else
    {
        cout << "eRRO!" << endl;
    }

    write.close();



    //achar as folhas
    //jogar a folha achada no 'buffer'


    return aux_s;
}