Liste Chainée en C

Fermé
Jonathan - 19 nov. 2008 à 23:07
 Jonathan - 20 nov. 2008 à 01:13
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

4 réponses

Droopy_ Messages postés 248 Date d'inscription dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009 25
19 nov. 2008 à 23:58
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 dimanche 16 novembre 2008 Statut Membre Dernière intervention 17 janvier 2009 25
20 nov. 2008 à 00:00
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
19 nov. 2008 à 23:13
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 nov. 2008 à 00:08
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
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