Liste générique en C

Liste générique en C - C - Programmation

Marsh Posté le 07-03-2008 à 19:02:08    

Bonjour a tous, j'aimerais faire une liste générique, mais j'ai un peu de mal...
Je voudrais instancier cette liste generique en liste de caractere.  

Code :
  1. typedef struct t_Liste{
  2.   void * Ptr_val;         // pointeur sur un type de valeur desire
  3.   struct t_Liste* Suiv; // pointeur sur element suivant
  4. } t_Liste;


 
J'ai une fonction ajouter_fin, qui ajoute un element en fin de liste:

Code :
  1. /* ajoute un pointeur sur valeur en fin de liste*/
  2. int Ajouter_fin(t_Liste * L, void * Ptr_valeur)
  3. {
  4.   t_Liste * temp;
  5.   // attribuer de l'espace
  6.   temp=(t_Liste*)malloc(sizeof(struct t_Liste));
  7.  
  8. if (L == NULL) /* si liste vide*/
  9.   {
  10.     L=temp;
  11.     L->Ptr_val = Ptr_valeur; //pointer valeur
  12.     L->Suiv = NULL; //fin de liste
  13.   }
  14.   else
  15.   {
  16.     temp=L;
  17.     while (temp->Suiv != NULL) {
  18.         temp=temp->Suiv;
  19.     }
  20.     /*on est arrive a la fin de la liste*/
  21.     temp->Ptr_val=Ptr_valeur;
  22.     temp->Suiv=NULL;
  23.   }
  24.   return 0;
  25. }


 
et mon main:

Code :
  1. int main()
  2. {
  3.    
  4.     struct t_Liste * Liste_char;
  5.     Liste_char = (t_Liste*)malloc(sizeof(struct t_Liste));
  6.     Liste_char = NULL;
  7.     char vide; //pour vider le saut ligne du buffer
  8.     char * c;
  9.     c=(char *)malloc(sizeof(char));
  10.    
  11.     printf("Taper le caractere a ajouter: \n" );
  12.     *c=getchar();
  13.     while (*c != '0') {
  14.       vide=getchar();
  15.       Ajouter_fin(Liste_char,c);
  16.       c=(char *)malloc(sizeof(char));
  17.       printf("Taper le caractere a ajouter: \n" );
  18.       *c=getchar();     
  19.     }
  20.    
  21.     printf("debut: %p\n",Liste_char->Ptr_val);
  22.     printf("Affichage de la liste\n" );
  23.     Afficher_liste(Liste_char);
  24.     system("pause" );   
  25. }


 
Les soucis: - ma liste est toujours vide!
                - afficher un type donné (ici caractere) alors que en generique j'ai <void * ptr_val> comme valeur de l'element de la liste?

Reply

Marsh Posté le 07-03-2008 à 19:02:08   

Reply

Marsh Posté le 07-03-2008 à 20:12:44    

déjà ces deux lignes me semblent contradictoires :

Code :
  1. Liste_char = (t_Liste*)malloc(sizeof(struct t_Liste));
  2. Liste_char = NULL;


 
 
ensuite dans ta fonction "int Ajouter_fin(t_Liste * L, void * Ptr_valeur)",le "t_List *L" alloué via la commande :

Code :
  1. temp=(t_Liste*)malloc(sizeof(struct t_Liste));


 
ne sera jamais retransmi au main donc ta liste sera toujours nulle
 
pour éviter cela, tu peux par example utiliser un pointeur de pointeur :

Code :
  1. int Ajouter_fin(t_Liste ** L, void * Ptr_valeur)


 
et passer en argument l'adresse du pointeur de liste :

Code :
  1. Ajouter_fin(&Liste_char, c);


Message édité par yoyo+ le 07-03-2008 à 20:19:41
Reply

Marsh Posté le 08-03-2008 à 11:56:12    

merci beaucoup pour ta reponse,
est ce que quelque chose comme ca ferait l'affaire alors ?
 

Code :
  1. /* ajoute un pointeur sur valeur en fin de liste*/
  2. int Ajouter_fin(t_Liste ** L, void * Ptr_valeur)
  3. {
  4.    t_Liste * temp;
  5.    // attribuer de l'espace
  6.    temp=(t_Liste*)malloc(sizeof(struct t_Liste));
  7. if (*L == NULL) /* si liste vide*/
  8.    {
  9.      *L=temp;
  10.      *L->Ptr_val = Ptr_valeur; //pointer valeur
  11.      *L->Suiv = NULL; //fin de liste
  12.    }
  13.    else
  14.    {
  15.      temp=*L;
  16.      while (temp->Suiv != NULL) {
  17.          temp=temp->Suiv;
  18.      }
  19.      /*on est arrive a la fin de la liste*/
  20.      temp->Ptr_val=Ptr_valeur;
  21.      temp->Suiv=NULL;
  22.    }
  23.    return 0;
  24. }


 
merci d'avance :)

Reply

Sujets relatifs:

Leave a Replay

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