Liste Chainée en C
Jonathan
-
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
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:
- Liste Chainée en C
- Liste déroulante excel - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Site dangereux liste - Guide
- Liste site streaming illégal - Accueil - Services en ligne
4 réponses
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 &
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 &
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
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
Re,
J'ai corrigé les quelques erreurs qu'il y avait dans ton code.
Sur ma machine, il marche.
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
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
strncpy(newElement->n,name,30);