Liste Chainée en C

Jonathan -  
 Jonathan -
Bonjour,

J'essaye de créer une liste chainée qui contient un entier et une chaine de caractère. L'utilisateur doit rentrer ces données, je veux les stocker puis afficher la liste.

Cependant je n'y arrive pas !

Voici mon code :

#include <stdlib.h>
#include <stdio.h>

typedef struct element element;
struct element
{
int a ;
char *n;
struct element *nxt;
};

typedef element* llist;

int main()
{
int a, number, w, i;
char *name;
name = (char *) malloc(30*sizeof(char));

/* Declaration of a list */
element *list = NULL;

/* We add elements to the list */
for(i=0; i<2; i++)
{
printf("Plz enter an integer \n");
scanf("%d", &number);

printf("Plz enter a char \n");
scanf("%s", name);

/* We create a new element */
element* newElement = malloc(sizeof(element));

/* We add the data to the new Element */
newElement->a = number;
newElement->n=(char*)malloc(sizeof(name));
strcpy(&newElement->n,name); <= Ici j'ai un warning

/* We set the adress */
newElement->nxt = list;

list=newElement;

printf("\n");
}

/* Display the list */
element *tmp = list;
printf("\nThe list:\n");
while(tmp != NULL)
{
printf("%d ", tmp->a);
printf("%s\n", &tmp->n);
tmp = tmp->nxt;
}
system("PAUSE");
}

J'ai un warning a l'endroit indiqué, le programme fonctionne si l'utilisateur ne rentre pas plus de 4 caractères.
J'ai essayé pas mal de choses différentes mais ca ne marche jamais :/

Donc si vous pouvez m'aidez un peu ... :)

Merci,
Jonathan
Configuration: Windows XP
Firefox 3.0.3

4 réponses

  1. Droopy_ Messages postés 252 Statut Membre 25
     
    Effectivement, moi je mettrais :

    newElement->n=(char*)malloc(sizeof(char)*30);
    Tu l'as d'ailleurs fait correctement plus haut dans ton programme.

    Pour ton warning, c'est normal, il faut mettre :

    strcpy(newElement->n,name); // Sans le &
    1
    1. Droopy_ Messages postés 252 Statut Membre 25
       
      Autre chose, je préconise plutôt la fonction strncpy avec la longueur à copier, car strcpy peut déborder allègrement.

      strncpy(newElement->n,name,30);
      0
  2. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,
    J'ai lu vraiment ton code en diagonale. Et je me suis arrêté au premier truc qui m'a choqué. Donc l'erreur est peut-être ailleurs.


    char *name;
    newElement->n=(char*)malloc(sizeof(name));

    sizeo(name)=sizeof(char*) = 4 (taille du pointeur). Et non 30 comme tu l'entendais.
    Tu peux par exemple faire tout simplement : char name[30]; et là sizeof(name) = 30.
    J'espère que l'erreur est là ;)
    Cdlt
    0
    1. Jonathan
       
      Oui, en effet il y avait un problème à ce niveau... Mais ca n'a pas résolu le problème.

      J'ai essayé la méthode plus simple que tu as proposé, mais a l'affichage cela m'affiche maximum 4 caractères.
      0
  3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Re,
    J'ai corrigé les quelques erreurs qu'il y avait dans ton code.
    Sur ma machine, il marche.
    #include <stdlib.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct element element;
    struct element
    {
        int a;
        char n[30];
        struct element *nxt;
    };
    
    typedef element* llist;
    
    
    int main()
    {
        int number, i;
        char name[30];
    
        /* Declaration of a list */
        element *list = NULL;
    
    
        /* We add elements to the list */
        for(i=0; i<5; i++)
        {
            printf("Plz enter an integer \n");
            scanf("%d", &number);
    
            printf("Plz enter a char \n");
            scanf("%s", name);
    
            /* We create a new element */
            element* newElement = malloc(sizeof(element));
    
            /* We add the data to the new Element */
            newElement->a = number;
            //newElement->n=malloc(sizeof(name));
            strcpy(newElement->n,name);
    
    
                /* We set the adress */
                newElement->nxt = list;
    
            list=newElement;
    
            printf("\n");
        }
    
    
        /* Display the list */
        element *tmp = list;
        printf("\nThe list:\n");
        while(tmp != NULL)
        {
            printf("%d ", tmp->a);
            printf("%s\n", tmp->n);
            tmp = tmp->nxt;
        }
        return 0;
    } 
    

    Sinon, à noter qu'effectivement, comme a dit Droopy_, il vaut mieux utiliser strncpy, et éviter d'utiliser scanf comme tu as fait (sans contrôler la taille). Sinon il y a des risques ;)
    De plus lorsque tu fais du malloc, faut vérifier si le pointeur n'est pas NULL, sinon, il risque d'y avoir des petits segfault si ça échoue ^^.
    Cdlt
    0
  4. Jonathan
     
    Merci Bcp! Ca marche aussi chez moi! Sympa de m'avoir débloquer!

    je vais regarder maintenant les erreurs que j'ai fais :)

    See ya
    0