No* removerNo( No *no, int valor ) { No* temp; if ( valor == no->valor ) { // o nó não tem filhos if ( no->esquerda == no->direita ) { free( no ); return NULL; // o nó a ser removido não tem filho à esquerda } else if ( no->esquerda == NULL ) { temp = no->direita; free( no ); return temp; // o nó a ser removido não tem filho à direita } else if ( no->direita == NULL ) { temp = no->esquerda; free( no ); return temp; // o nó a ser removido tem filhos em ambos os lados } else { No *aux = no->direita; temp = no->direita; while ( temp->esquerda != NULL ) { temp = temp->esquerda; } temp->esquerda = no->esquerda; free( no ); return aux; } } else if ( valor < no->valor ) { no->esquerda = removerNo( no->esquerda, valor ); } else { no->direita = removerNo( no->direita, valor ); } return no; }
//Escalona cada processo de acordo com o quantum do processador //e o quantum solicitado pelos processos void escalonarProcessos(TNo **inicioDaFila, int quantum) { TNo *aux = (*inicioDaFila); int t=0, tempoDeProcessamento; while(aux) //enquanto houverem processos { tempoDeProcessamento = quantum; //tempo que um processo vai ter de processador if(aux->instanteDeEntrada < 0) //se o instante de entrada for inválido, ou seja, o processo ainda não usou o processador, aux->instanteDeEntrada = t; //insere o instante em que o processo entrou no processador pela primeira vez while(tempoDeProcessamento && aux->q) //ou o processo usa todo o seu tempo ou já pode ser encerrado { aux->q--; tempoDeProcessamento--; t++; //incrementa o tempo de uso total do processador } if(!(aux->q)) //se o processo atual já foi encerrado { printf("%s, iniciou no quantum %i e foi finalizado no quantum %i\n", aux->id, aux->instanteDeEntrada, t-1); aux = removerNo(inicioDaFila, aux); //remove ele da fila } else aux = aux->prox; //chama o próximo processo da lista } }
bool remover( ArvoreBinariaBusca *arvore, int valor ) { /* * Algoritmo iterativo. * Não estudaremos! É um pouco complicado... */ /* * Algoritmo recursivo. */ bool achou = contemNo( arvore->raiz, valor ); if ( achou ) { arvore->raiz = removerNo( arvore->raiz, valor ); } return achou; }