Ejemplo n.º 1
0
// 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);
  }
}
Ejemplo n.º 2
0
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);
  }
}
Ejemplo n.º 3
0
/* 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++;
}
Ejemplo n.º 4
0
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;
    }
  }
}
Ejemplo n.º 5
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;
  }
}