/** * 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 } }
/** * 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; }
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); } }
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); }
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; }
/** * 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); } }
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; }
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; }
//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; } }
//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; }