// Fct pour remonter un elt dans le tas void monter(Tas *tas, int i){ if(a_un_pere(i)) return; int index=pere(i); if((tas->elem[index]->c)>(tas->elem[i]->c)) { echanger(tas, i, index); monter(tas, index); } }
void monter(Tas *t, int i) { if (!hasPere(i)) return; int up = pere(i); if (t->tab[up]->dist > t->tab[i]->dist) { swap(t, i, up); t->indiceNoeud[t->tab[i]->num]=up; monter(t, up); } }
/* inserer un nouvel element dans le tas en le placant a la derniere position et en le faisant remonter */ void ajouter( Tas *t, Elem *el, double poids) { int i = 0; int p = 0; int s = 0; if(t->nbNoeud == t->nbMax) { printf("Tas plein"); return; } el->poids = poids; //inserer l'élément dans le tableau des valeurs t->val[el->numero] = el; //inserer le numero sur le haut du tas t->tas[t->nbNoeud] = el->numero; t->val[el->numero]->posTas = t->nbNoeud; //trier le tas i = t->nbNoeud; while(i != 0 ) { p = pere(i); #ifdef DEBUG printf("Ajouter i : %d p : %d\n", i, p); #endif if(compare(t, i, p)) { //swap de i et p s = t->tas[i]; t->tas[i] = t->tas[p]; t->tas[p] = s; //stocker la valeur dans le tas t->val[t->tas[p]]->posTas = p; t->val[t->tas[i]]->posTas = i; //remonter au pere i = p; } else { //element plus grand que son pere, fini i = 0; } } //incrementer le nombre de noeuds t->nbNoeud++; }
void miseAJour(Tas *t, Elem *el) { int i = 0; int p, s; if(t->val[el->numero] == NULL) { #ifdef DEBUG printf("Le noeud n'existe pas.\n"); #endif return; } else { i = t->val[el->numero]->posTas; } while(i != 0 ) { p = pere(i); #ifdef DEBUG printf("MaJ i : %d p : %d\n", i, p); #endif if(compare(t, i, p)) { //swap de i et p s = t->tas[i]; t->tas[i] = t->tas[p]; t->tas[p] = s; //stocker la valeur dans le tas t->val[t->tas[i]]->posTas = i; t->val[t->tas[p]]->posTas = p; //remonter au pere i = p; } else { //element plus grand que son pere, fini i = 0; } } }
void supprimer(Tas *t, Elem *el) { int i = 0; int j, d, g, s; int idx = el->numero; if(t->val[idx] == NULL) { #ifdef DEBUG printf("Le noeud n'existe pas.\n"); #endif return; } else { i = t->val[idx]->posTas; } #ifdef DEBUG printf("Element trouve : %d\n", i); #endif //decrementer le nombre de noeud t->nbNoeud--; if(i == t->nbNoeud) { //c'est le dernier élément l'effacer uniquement t->tas[t->nbNoeud] = -1; return; } //echanger le dernier noeud avec le noeud à supprimer //et effacer le dernier noeud t->tas[i] = t->tas[t->nbNoeud]; t->tas[t->nbNoeud] = -1; //stocker la valeur dans le tas t->val[t->tas[i]]->posTas = i; //remonter du pere si il existe if(i != 0) { i = pere(i); } //reordonner tous les noeuds au dessous du pere while(i >= 0) { //initialiser le noeud a une valeur impossible j = -1; d = droite(i); g = gauche(i); if((d < t->nbNoeud) && compare(t, d, i)) { if(compare(t, g, d)) { //fils gauche existe et est le plus petit des deux fils j = g; } else { //fils droit existe et est plus petit que le pere j = d; } } else { if((g < t->nbNoeud) && compare(t, g, i)) { //fils gauche existe et est le plus petit que le pere j = g; } //le pere est le plus petit arrêter } if(j>=0) { //il faut faire un swap avec le pére s = t->tas[i]; t->tas[i] = t->tas[j]; t->tas[j] = s; //stocker la valeur dans le tas t->val[t->tas[i]]->posTas = i; t->val[t->tas[j]]->posTas = j; } //j est le nouveau pére i = j; } }