Heap CriaHeapAux(int n, funcCompara *comp, void *elems[]) { /* Cria um heap vazio; se 'elems' não é nulo, preenche com os valores do vetor 'elems' e transforma num heap. */ ImplHeap ih = (ImplHeap) MALLOC(sizeof(RegHeap)+(n-1)*sizeof(void *)); ih->tamMax = n; ih->comp = comp; if (!elems) { ih->tam = 0; } else { int i; memcpy(ih->vetor, elems, n); ih->tam = n; /* Transformar numa heap */ for (i = (ih->tam - 2) / 2; i >= 0; i--) Desce(ih, i); } return ih; } /* CriaHeapAux */
Heap CriaHeapAux(int n, funcCompara *comp, void *elems[]) { /* Cria um heap vazio; se 'elems' não é nulo, preenche com os valores do vetor 'elems' e transforma num heap. */ int i; ImplHeap ih = MALLOC(sizeof(RegHeap)+(n-1)*sizeof(void *)); ih->tamMax = n; ih->tam = 0; ih->comp = comp; if(elems != NULL){ /*Copia os valored de elems para o heap*/ for(i = 0; i < n && elems[i] != NULL; i++){ ih->vetor[i] = elems[i]; (ih->tam)++; } /*Faz a organizacao do heap*/ for(i = (ih->tam - 2)/2; i >= 0; i--){ Desce(ih, i); } } return (Heap) ih; } /* CriaHeapAux */
void * RemoveHeap(Heap h) { ImplHeap ih = h; void *ret = NULL; if (ih->tam==0) { printf("FP vazia\n"); exit(0); } ret = ih->vetor[0]; ih->tam--; ih->vetor[0] = ih->vetor[ih->tam]; Desce(ih, 0); return ret; } /* removeHeap */
void * RemoveHeap(Heap h) { ImplHeap ih = (ImplHeap) h; void *ret = NULL; if (ih->tam == 0) { printf("FP vazia\n"); exit(0); } ret = ih->vetor[0]; /*Salva em ret o maior valor do Heap*/ /*Faz o ultimo elemento do vetor ser o primeiro e chama a funcao desce, que reorganiza o vetor corretamente*/ (ih->tam)--; ih->vetor[0] = ih->vetor[(ih->tam)]; Desce(ih, 0); return ret; } /* removeHeap */
void * RemoveHeap(Heap h) { /* Remove e devolve o elemento máximo (de acordo com a função 'comp') da FP. Interrompe a execução do programa se a FP está vazia. */ ImplHeap ih = h; void *ret = NULL; /* Armazenarà o elemento a ser removido */ /* Se o tamanho da Fp for 0, nap ha mais elemento para serem removidos */ if (ih->tam == 0) { printf("FP vazia\n"); exit(0); } /* Remove o primeiro elemento da fila e coloca o últimono lugar, descendo-o para seu lugar * correto */ ret = ih->vetor[0]; ih->vetor[0] = ih->vetor[ih->tam-1]; ih->tam--; Desce(ih, 0); return ret; } /* removeHeap */
void ConstroiHeap(ImplHeap ih) { /* Recebe uma lista qualquer e a transforma em uma heap */ for (int i = (ih->tam-2)/2; i >= 0; i--) Desce(ih, i); } /* Constroi Heap */