| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 
 | matrice *MultiplierrMatrices2(matrice *m1,matrice *m2,matrice *mul){
  int i,j, val, nbZeroGauche, *nbZeroHaut, *XCel1, *XCel2;
  double valpdt;
  cellule *cel, **celHaut=NULL, *celPrec=NULL;
 
  /* on test que les matrices aient le même format sinon on retourn NULL */
  if(m1->tailleLigne != m2->tailleColonne || m1->tailleLigne != m2->tailleColonne)
    return NULL;
 
  mul->tailleLigne=m1->tailleLigne;
  mul->tailleColonne=m2->tailleColonne;
  mul->ligne=(cellule**)malloc(sizeof(cellule*)*mul->tailleLigne);
  mul->colonne = (cellule**)malloc(sizeof(cellule*)*mul->tailleColonne);
 
  nbZeroHaut = (int*)malloc(sizeof(int)*mul->tailleColonne);
  celHaut = (cellule**)malloc(sizeof(cellule*)*mul->tailleColonne);
 
  for(i=0;i<mul->tailleColonne;i++){
    nbZeroHaut[i]=0;
    celHaut[i] = NULL;
  }
 
  for(i=0;i<mul->tailleLigne; i++){
    nbZeroGauche = 0;/* permet de retenir le nb de 0 entre la prochaine cellule et la cellule la plus à doirte de la ligne */
    celPrec = NULL;/* permet de retenir la dernière celulle la plus à droite dans la ligne */
    for(j=0;j<mul->tailleColonne;j++){
 
      valpdt = valeurCellule(m1, i, j) * valeurCellule(m2, i, j) + valeurCellule(m1, i, j+1) * valeurCellule(m2, i, j+1);
 
 
     if(valpdt==0){/* on retient qu'il ne faut pas ajouter de cellule et on ajoute un zéro */
        nbZeroHaut[j]++;
        nbZeroGauche++;
      }else{/* on ajoute la cellule dans la matrice produit */
        cel = (cellule*)malloc(sizeof(cellule));
        cel->suivanteBas = cel->suivanteDroite = NULL;
        cel->valeur = valpdt;
        cel->nbZeroGauche = nbZeroGauche;
        cel->nbZeroHaut = nbZeroHaut[j];
        nbZeroGauche = 0;
        nbZeroHaut[j] = 0;
        if(celHaut[j]){/* si on a retenu qu'on a déjà fait une cellule dans cette colonne, on lui dis que la suivante est celle qu'on vien de créer */
          celHaut[j]->suivanteBas = cel;
        }else/* on n'a encore rien ajouter dans la case de produit, donc on le fait :) */
          mul->colonne[j] = cel;
        /* puis, on met la cellule adns le tableau afin de lui affecter plus tard la suivante si il y en aura une */
        celHaut[j] = cel;
        if(celPrec)/* pareil qu'avant mais on teste sur la ligne */
           celPrec->suivanteDroite = cel;
        else
          mul->ligne[i] = cel;
        celPrec = cel;
      }
    }
  }
  free(nbZeroHaut);
  free(celHaut);
  return mul;
} | 
Partager