Donc tu as décidé de garder les listes ordonnées. Ce n'est pas obligatoire mais bon.
Pour commencer je te recommande de créer une structure de donnée "matrice" qui contiendra tout ce que tu as besoin de savoir sur la matrice :
Code:
1 2 3 4 5 6
| typedef struct {
int nblignes;
int nbcolonnes;
cellule *lignes; /* Tableau de nblignes elements de type cellule * */
cellule *colonnes; /* Tableau de nbcolonnes elements de type cellule * */
} matrice; |
Ensuite tu peux te faire deux fonctions qui, étant donnée une matrice et une cellule, retourneront le numéro de ligne de la cellule dans la matrice, ou le numéro de colonne de la cellule dans la matrice. Ca pourrait donner :
Code:
1 2
| int ligne(const matrice *m, const cellule *c);
int colonne(const matrice *m, const cellule *c) |
D'ailleurs si tu te débrouille bien tu peux factoriser la quasi totalité du code dans une fonction commune, mais c'est un détail.
La fonction ligne() regardera consécutivement chacune des listes chainées m->lignes[i], en suivant à chaque fois le chainage "ligne" à la recherche de la cellule c. Dès que c est trouvée, elle retourne i.
La fonction colonnes() fait la même chose, mais en regardant m->colonnes[i] et en suivant à chaque fois le chainage "col".
Ensuite tu peux te faire deux fonctions qui se chargent d'insérer une cellule c au bon endroit dans une ligne ou une colonne, en retournant la nouvelle ligne ou colonne :
Code:
1 2
| cellule *insere_dans_ligne(cellule *ligne, cellule *cell, int numcol);
cellule *insere_dans_colonne(cellule *colonne, cellule *cell, int numligne); |
La fonction insere_dans_ligne() parcourra la liste chaine ligne en suivant le chainage "ligne". Pour chaque cellule de la liste, elle appèle colonne() pour récupérer le numéro de colonne de l'élément en cours, et elle le compare à numcol (numéro de colonne de la nouvelle cellule à insérer). Dès qu'elle trouve une cellule dont le numéro de colonne est supérieur à numcol, et s'arrête, et insère la nouvelle cellule cell devant l'élément courant. Evidemment ça suppose qu'a chaque tours de boucle tu mémorises l'élément précédent, puisque dans la liste chainée on ne peut insérer un nouvel élément
qu'après un autre élément.
La fonction insere_dans_colonne() est très similaire, et là encore en se débrouillant bien on peut factoriser tout le code dans une fonction commune.
Voilà, je pense que c'est suffisamment détaillé. Tu vois que la bonne démarche est de découper le gros problème en petits sous-problèmes, qui auront chacun leur propre fonction. C'est beaucoup plus simple que d'essayer de tout faire en local dans ta boucle. Et plus propre, et plus facile à maintenir.