Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1420 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Un tableau de liste chaînée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Un tableau de liste chaînée

n°1913633
Duc_onlajo​y
Posté le 10-08-2009 à 17:58:04  profilanswer
 

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

mood
Publicité
Posté le 10-08-2009 à 17:58:04  profilanswer
 

n°1913640
Un Program​meur
Posté le 10-08-2009 à 18:07:44  profilanswer
 

Tu assignes NULL a un s_LIsteDArrete.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°1913710
Duc_onlajo​y
Posté le 10-08-2009 à 20:41:15  profilanswer
 

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  :??:  

n°1913812
Arry
Posté le 11-08-2009 à 09:04:26  profilanswer
 

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
n°1913883
Duc_onlajo​y
Posté le 11-08-2009 à 11:25:37  profilanswer
 

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.

n°1913914
Arry
Posté le 11-08-2009 à 12:01:04  profilanswer
 

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
n°1914207
Sve@r
Posté le 12-08-2009 à 08:38:46  profilanswer
 

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.
n°1914808
Duc_onlajo​y
Posté le 13-08-2009 à 14:47:19  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Un tableau de liste chaînée

 

Sujets relatifs
mettre des div a l'interieur d'un tableauObtenir la liste des appels entre deux break points
Problème tableauProbleme de trier par ordre alphabétique de tableau
Récupérer nombre dans un tableaudoublons dans un tableau
Macro Excel : tableau dynamique[EXCEL] Liste clients -> recherche géographique
[VBS] Tableau dynamique croiséTableau ou liste linéaire chaînée?
Plus de sujets relatifs à : Un tableau de liste chaînée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR