Probleme dans les listes en c

Résolu/Fermé
abdess111 Messages postés 40 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 22 mai 2008 - 28 févr. 2008 à 12:32
abdess111 Messages postés 40 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 22 mai 2008 - 11 mars 2008 à 21:03
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

3 réponses

SebManfred Messages postés 484 Date d'inscription mardi 28 août 2007 Statut Membre Dernière intervention 20 mai 2011 128
28 févr. 2008 à 12:58
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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
28 févr. 2008 à 13:05
0
abdess111 Messages postés 40 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 22 mai 2008 1
11 mars 2008 à 21:03
merci :-)
0