en fait j ai un probleme de faire la multiplication de deux matrices surtout que je me suis obligé d utuliser ce 2 structure


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
typedef struct _cellule{
  int nbZeroGauche, nbZeroHaut;/* nb de zéo à gauche et en haut de la cellule */
  double valeur;/* valeur de la cellule */
  struct _cellule *suivanteBas, *suivanteDroite;
}cellule;
 
typedef struct _matrice{
  cellule **colonne, **ligne;
  int tailleColonne, tailleLigne;
}matrice;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
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;
}
merci d avance