Liste en C

linkcr15 -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,
Voila, je souhaiterai créer une liste d'entier en C et ensuite les afficher mais toute la liste ne sera pas forcément affichée. Par exemple, la liste pourrait contenir les valeurs de 1 a 9 mais on ne pourrait afficher que 3,4,7,9. Je cherche donc comment définir ce genre de variable et comment l'utiliser pour ne choisir que certains entiers dans cette liste.
De plus, je voudrais savoir s'il est possible de définir un typedef d'un autre typdef, comme ceci :

typedef struct T_case
{
int lig, col;
};
typedef T_case L_Case;

Merci d'avance pour vos réponses et je reste à votre disposition!

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Ton type ne définit pas une liste ! Il faut que le type s'appelle récursivement pour ça...

    #include <stdlib.h>
    
    typedef struct _liste // définition d'un maillon d'une liste
    {
       int n; // la valeur du maillon
       _liste* succ; // un maillon de liste connaît son successeur dans la liste
    } 
    *Liste; // pour plus de commodité, on définit un type Liste
    
    const size_t size_Liste = (sizeof _liste); // taille à allouer pour un maillon
    
    int main() 
    {
       Liste liste = (Liste) malloc(size_Liste); // allocation mémoire d'un maillon
       liste->n = 5; // définition de la valeur du maillon
       liste->succ = NULL; // définition du maillon suivant (ici aucun)
       free(liste); // libération de la mémoire du maillon
       return 0; 
    }

    La confiance n'exclut pas le contrôle
    0
    1. linkcr15 Messages postés 423 Statut Membre 12
       
      Euh ok je crois avoir compris la liste chaînée.
      Mais si je veux faire une liste pour les entiers de 1 à 9 je ne vois pas vraiment comment faire =/
      Avec un for ou un while avec liste->succ = n++; ?
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      Il ne faudra surtout pas oublier d'allouer chaque maillon en mémoire et de terminer le dernier par NULL.

      int main() 
      {
      	Liste liste = (Liste) malloc(size_Liste);
      
      	int i;
      	Liste k=liste;
      	for (i=1; i<9; i++)
      	{
      		k->n = i;
      		k->succ = (Liste) malloc(size_Liste);
      		k=k->succ;
      	}
      	k->n=i;
      	k->succ=NULL;
      	
      	return 0; 
      } 
      0
  2. linkcr15 Messages postés 423 Statut Membre 12
     
    Désolé, je n'ai peut être pas était trés clair. En fait je posais deux questions dans un seul topic.
    En fait une liste d'entiers se définit par une liste chaînée en C?
    Est-ce qu'il est possible d'avoir des commentaires sur les lignes que tu me donnes stp? Je ne comprends pas ce que ces commandes font. Merci pour ta réponse en tout cas.
    0
    1. KX Messages postés 19031 Statut Modérateur 3 020
       
      Alors oui on peut faire des typedef de typedef, en fait le typedef est utilisé sur un type et donne un nouveau type donc ce nouveau type peut très bien servir à en définir encore un nouveau.

      Par contre T_case n'est pas un type généré par typedef, mais par struct, si tu veux créer un type qui englobe le tout tu dois le mettre entre l'accolade et le point-virgule, ce qui du coup va peut-être régler ton problème :

      typedef struct T_case // T_case est un struct
      {
      int lig, col;
      } L_Case; // L_Case est le typedef de struct T_case

      Pour les listes chaînées je vais rajouter des commentaires ^^
      0
    2. linkcr15 Messages postés 423 Statut Membre 12
       
      Ok je te remercie pour cette précision sur les définitions de type et sur mon erreur dans mon code =)
      0