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
A voir également:

4 réponses

Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention   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
Droopy_ Messages postés 248 Date d'inscription   Statut Membre Dernière intervention   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
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
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
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
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