Probleme dans les listes en c
Résolu
abdess111
Messages postés
40
Date d'inscription
Statut
Membre
Dernière intervention
-
abdess111 Messages postés 40 Date d'inscription Statut Membre Dernière intervention -
abdess111 Messages postés 40 Date d'inscription Statut Membre Dernière intervention -
slt tt le monde jai un probleme:j'arrive pas a comprendre comment on inialise une liste des entiers;voila un exemple
#include<stdio.h>
#include<stdlib.h>
struct test{
int val;
struct test *suivant;
};typedef struct test dtest;
main()
{
int n,i;
dtest *premier,*nouveau,*precedent;
printf("saisi la taille de ta liste\n");
scanf("%d",&n);
premier=malloc(n*sizeof(dtest));
printf("saisi votre premier valeur\n");
scanf("%d",&premier->val);
precedent=premier;
for(i=1;i<n;i++)
{
nouveau=malloc(n*sizeof(dtest));
precedent->suivant=nouveau;
precedent=nouveau;
printf("saisi un element\n");
scanf("%d",&nouveau->val);
}
precedent->suivant=NULL;
printf("votre liste\n");
while(premier != NULL)
{
printf("%d\t",premier->val);
premier=premier->suivant;
}
}
jai pas compris bcp d chose:
pour koi on a declarer 3 pointeur premier et nouveau et precedent plus un pointeur (suivant) dans la structure
pour koi ils ont fait
nouveau=malloc(n*sizeof(dtest));
precedent->suivant=nouveau;
precedent=nouveau;
et si vous pouvez me donnez un exemple tres simple pour declarer et initailiser et afficher une liste
merci bcp
#include<stdio.h>
#include<stdlib.h>
struct test{
int val;
struct test *suivant;
};typedef struct test dtest;
main()
{
int n,i;
dtest *premier,*nouveau,*precedent;
printf("saisi la taille de ta liste\n");
scanf("%d",&n);
premier=malloc(n*sizeof(dtest));
printf("saisi votre premier valeur\n");
scanf("%d",&premier->val);
precedent=premier;
for(i=1;i<n;i++)
{
nouveau=malloc(n*sizeof(dtest));
precedent->suivant=nouveau;
precedent=nouveau;
printf("saisi un element\n");
scanf("%d",&nouveau->val);
}
precedent->suivant=NULL;
printf("votre liste\n");
while(premier != NULL)
{
printf("%d\t",premier->val);
premier=premier->suivant;
}
}
jai pas compris bcp d chose:
pour koi on a declarer 3 pointeur premier et nouveau et precedent plus un pointeur (suivant) dans la structure
pour koi ils ont fait
nouveau=malloc(n*sizeof(dtest));
precedent->suivant=nouveau;
precedent=nouveau;
et si vous pouvez me donnez un exemple tres simple pour declarer et initailiser et afficher une liste
merci bcp
A voir également:
- Probleme dans les listes en c
- Liste déroulante en cascade - Guide
- Liste déroulante dans excel - Guide
- Lister les disques cmd - Guide
- Comment mettre sa liste d'amis en privé sur facebook - Guide
- Problème liste de diffusion whatsapp - Guide
3 réponses
Salut,
malloc t'alloue un espace mémoire et te renvoie l'adresse de cet espace. si tu ne le récupère pas, il est inutilisable et ne peut pas être désalloué. c'est une fuite mémoire. nouveau sert à ça
premier est le pointeur de tête de ta liste, c'est lui qui te permet d'avoir le début de ta liste.
tu accède aux différents éléments de ta liste en partant du 1er et en te balladant de proche en proche, d'un élément à un autre, en utilisant le pointeur suivant de la structure, qui pointe, comme son nom l'indique, l'élément suivant de ta liste.
précédent, comme suivant, sont 2 pointeurs qui vont te permettre de travailler sur ta liste, d'ajouter ou d'effacer des maillons, que ça soit en début, au milieu ou à la fin de ta liste
par exemple, si tu as une liste de 30 éléments et que tu veux en ajouter un en 10e position, du créé ton maillon par :
nouveau = (test)malloc(sizeof(test));
ensuite, tu positionne ton pointeur suivant sur le 9e élément de ta liste par :
int nb = 9; // si tu veux aller sur le 9e... remplace par n si tu veux aller sur le n-ième
suivant = premier;
for(int i=1;i<nb;i++)
{
suivant = suivant->suivant;
}
ensuite, tu fais pointer le pointeur suivant de ton nouveau maillon sur la fin de ta chaine (dans cet ordre, sinon tu perds la fin de ta chaine, et là, c'est la GROSSE fuite mémoire)
nouveau->suivant = suivant->suivant;
enfin, tu insère ton nouveau maillon après le 9e :
suivant->suivant = nouveau;
j'espère avoir répondu à ta question
malloc t'alloue un espace mémoire et te renvoie l'adresse de cet espace. si tu ne le récupère pas, il est inutilisable et ne peut pas être désalloué. c'est une fuite mémoire. nouveau sert à ça
premier est le pointeur de tête de ta liste, c'est lui qui te permet d'avoir le début de ta liste.
tu accède aux différents éléments de ta liste en partant du 1er et en te balladant de proche en proche, d'un élément à un autre, en utilisant le pointeur suivant de la structure, qui pointe, comme son nom l'indique, l'élément suivant de ta liste.
précédent, comme suivant, sont 2 pointeurs qui vont te permettre de travailler sur ta liste, d'ajouter ou d'effacer des maillons, que ça soit en début, au milieu ou à la fin de ta liste
par exemple, si tu as une liste de 30 éléments et que tu veux en ajouter un en 10e position, du créé ton maillon par :
nouveau = (test)malloc(sizeof(test));
ensuite, tu positionne ton pointeur suivant sur le 9e élément de ta liste par :
int nb = 9; // si tu veux aller sur le 9e... remplace par n si tu veux aller sur le n-ième
suivant = premier;
for(int i=1;i<nb;i++)
{
suivant = suivant->suivant;
}
ensuite, tu fais pointer le pointeur suivant de ton nouveau maillon sur la fin de ta chaine (dans cet ordre, sinon tu perds la fin de ta chaine, et là, c'est la GROSSE fuite mémoire)
nouveau->suivant = suivant->suivant;
enfin, tu insère ton nouveau maillon après le 9e :
suivant->suivant = nouveau;
j'espère avoir répondu à ta question
Salut,
regarde ici, c'est fait pour ;-)
http://www.commentcamarche.net/faq/sujet 7444 liste simplement chainee
regarde ici, c'est fait pour ;-)
http://www.commentcamarche.net/faq/sujet 7444 liste simplement chainee