Un tableau de liste chaînée

Un tableau de liste chaînée - C - Programmation

Marsh Posté le 10-08-2009 à 17:58:04    

Bonjour
 
Pour des besoins de flexibilité dans mon programme j'utilise des listes chaînées. Mais si j'arrive à utiliser une liste chaînée seule, là je dois utiliser un "tableau de liste chaînée", le tout dans une structure. Malheureusement je dois faire une erreur, c'est certain car j'ai une erreur à la compilation. Voici un extrait de mon code qui ne marche pas!
Merci de votre aide.
 

Code :
  1. typedef struct{/** Une arrete possède deux points en trois dimensions */
  2. s_Point3D sPoint[2];
  3. }s_Arrete;
  4. typedef struct{/**Liste chainé d'arrete                   */
  5.     s_Arrete sArrete;
  6.     struct s_ListeDArrete * sArreteSuivante;
  7. }s_ListeDArrete;
  8. typedef struct{/** tableau de liste chainée  */
  9.     int iNombreDeListe;
  10.     s_ListeDArrete *Listes;
  11. }s_tableauDeListeDArrete;
  12. void vCalculDesArretes( [...] ,s_tableauDeListeDArrete *listeDesArretes){
  13.     [...]
  14.     listeDesArretes->iNombreDeListe = iNombreDeNiveau;
  15.     listeDesArretes->Listes = malloc(sizeof(s_ListeDArrete)*iNombreDeNiveau);
  16.     for(i=0; i<iNombreDeNiveau; i++){
  17.         listeDesArretes->Listes[i] = NULL;
  18.     }
  19.     [...]
  20. }


 
L'erreur de compilation est  :

20: error: incompatible types in assignement

Reply

Marsh Posté le 10-08-2009 à 17:58:04   

Reply

Marsh Posté le 10-08-2009 à 18:07:44    

Tu assignes NULL a un s_LIsteDArrete.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 10-08-2009 à 20:41:15    

Bin oui, justement, l'objectif c'est d'initiaiser la liste chainée, donc de mettre le premier element à NULL.
Et là je comprend pas pourquoi ça marche pas  :??:  

Reply

Marsh Posté le 11-08-2009 à 09:04:26    

Dans ton exemple
listeDesArretes->Listes[i] est un tableau de type structure s_ListeDArrete
Tu dois donc l'affecter à l'aide d'une variable de même type.


---------------
Mon Feed-Back
Reply

Marsh Posté le 11-08-2009 à 11:25:37    

Hmmm, en cherchant et en m'inspirant de vos réponses j'ai modifié ainsi :  
 

Code :
  1. typedef struct{/** tableau de liste chainée  */
  2.     int iNombreDeListe;
  3.     s_ListeDArrete **Listes;
  4. }s_tableauDeListeDArrete;


 
Et il semble que ça marche!
En effet j'avais besoin non d'un tableau mais d'un tableau de pointeur pour initialiser chaque liste chainée!
 
Merci de vos conseils qui m'ont bien guider.

Reply

Marsh Posté le 11-08-2009 à 12:01:04    

Par contre fait bien attention à ton allocation de mémoire.
 
Tu as maintenant un tableau de pointeurs, donc le malloc doit ressembler à ça :
listeDesArretes->Listes = malloc(sizeof(s_ListeDArrete*)*iNombreDeNiveau);
 
Fait également attention à l'allocation mémoire de chaque structure sur lesquelles pointent les pointeurs compris dans ton tableau ainsi qu'à leur desallocation


---------------
Mon Feed-Back
Reply

Marsh Posté le 12-08-2009 à 08:38:46    

Duc_onlajoy a écrit :

Et il semble que ça marche!
En effet j'avais besoin non d'un tableau mais d'un tableau de pointeur pour initialiser chaque liste chainée!


 
D'où l'importance de bien découper ses objets. C'est pourquoi je préconise toujours, quand on gère une liste chainée, de définir un type pour le chainon et aussi un type pour la liste. Ca permet de pouvoir traiter la liste elle-même comme une entité manipulable (et le type qui gère la liste peut inclure ses propres outils comme "nb d'éléments", "element courant", etc...)
 

Code :
  1. // Arrête
  2. typedef struct{
  3.     s_Point3D sPoint[2];
  4. }t_Arrete;
  5. // Chainon d'arrêtes
  6. typedef struct s_ChainonArrete {
  7.     t_Arrete Arrete;
  8.     struct s_ChainonArrete* next;
  9. }t_ChainonDArrete;
  10. // Liste d'arrêtes
  11. typedef struct {
  12.     t_ChainonDArrete* first;
  13.     size_t nb_elements;
  14. } t_ListeDArretes
  15. // Tableau de listes
  16. typedef struct{
  17.     int iNombreDeListe;
  18.     t_ListeDArrete* Listes;
  19. }t_tableauDeListeDArrete;


 
Ensuite, te suffit de définir un simple t_tableauDeListeDArrete item. Tu veux taper dans une liste particulière, tu tapes dans item.Listes[n]. Tu ne t'embêtes plus avec ces  **. Chaque objet possède son propre type associé...
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 13-08-2009 à 14:47:19    

Merci de tout ces conseils. C'est vrai que cela gagne du temps et simplifie la logique des structures.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed