Interrogations sur les structures et liste chainées

Le
jean mike
#define CDESIGN 5
#define CQTE 10

typedef struct art3
{
char Name[CDESIGN];
long qte ;
struct art3 *suiv ;
} listele ;

listele *deb, *bkup, *nouv, *a ; /* A */

if ((deb = malloc(listele) == NULL))
{
printf("Pas de memoire dispo.") ;
exit(EXIT_FAILURE) ;
}

i = 0 ;
nouv = bkup = deb ; /* B */
deb->suiv = NULL ; /* C */

do
{
printf("Enregistrement no. %d", i+1) ;
printf("Designation (5 caract. max., "0" pour quitter : ") ;
nbcar = ReadTxt(Bufftxt, CDESIGN, 1) ;
strncpy(nouv->Name, Buffer, nbcar+1) ;

if ((strcmp(nouv->Name, "0"))
{
printf("Quantite :") ;
nbcar = ReadTxt(Buffdigits, CQTE, 2) ;
nouv->qte = ReadDigit(Buffdigits) ;

if (strcmp(nouv->Name, deb->Name) < 0) /* D */
{
nouv->suiv = deb ;
deb = nouv ;
}
else /* si nouv->Name est alphabetiquement plus grand */
{
if (nouv != deb)
{
for (a = deb ; a->suiv != NULL && strcmp(a->suiv->Name, nouv-
>Name) < 0 ; a = a->suiv) /* E */
;
nouv->suiv = a->suiv ;
a->suiv = nouv ;
}
}
bkup = nouv ;

if ((nouv = malloc(sizeof(listele))) == NULL)
{
printf("Plus de memoire") ;
i++ ;
break ;
}
i++ ;
}
else
bkup = nouv ;

} while (strcmp(bkup->Name, "0")) ;

if (i > 0)
{
printf("Nbr d'enregistrements : %d", i) ;
printf("Afficher la liste ? (o/n)") ;
rep = getc(stdin) ;

if (rep == 'o')
{
HEADER(s)
for (a = deb, ; a != NULL ; a = a->suiv)
printf(" %-22st%ld", a->Name, a->qte) ;
}

for (a = deb ; a != NULL ; a = nouv)
{
nouv = a->suiv ;
free(a) ;
}
}


/* A */

listele *deb, *bkup, *nouv, *a ; /* A */

*deb, *bkup, *nouv, *a sont des pointeurs pour accueillir des donnes
de type listelepour linstant, ils ne pointent pas vers une adresse
ne mmoire, ils sont simplement dclars pour recevoir des donnes =
de
type prdfinies.

/* B */
nouv = bkup = deb ;

Ici nouv et bkup recoivent ladresse en mmoire de deb

/* C */

deb->suiv = NULL ;

deb->suiv recoit ladresse nulle

/* D */ si nouv est alphabetiquement plus petit que deb. Comment est-
ce que la comparaison peut se faire lors de la premire saisie? Ce que
jai compris jusqu prsent sur les pointeurs et variable non
initialiss cest quils peuvent contenir nimporte quoi. Et ici nu=
l
part deb a t initialis, il a seulement reu un espace mmoire =
la
ligne A mais malloc ninitialise pas, a serait plutt calloc et
encore ce nest pas pour des caractresalors, je me pose la
question avec quoi nouv est compar?

/* E */ strcmp(a->suiv, nouv->name) < 0
Lauteur :
Il faut effectuer la comparaison avec lelement suivant et non avec
lelement actuel, afin de vrifier avant quel element de la liste il
faut insrer le nouveau. Cela serait impossible si on comparat nouv-
>name et a->name. En effet, on ne disposerait plus alors de ladresse
ncessaire du prdcesseur dans la liste. En procdant ainsi on ins=
re
le nouvel lment avant le premier qui lui est alphabtiquement
suprieur ou gal. Pour cela on actualise de manire adquate les
pointeurs nouv->suiv et a->suiv.

Je ne suis pas sre de comprendre : on ne disposerait plus alors de
ladresse ncessaire du prdcesseur dans la liste
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Antoine Leca
Le #23124361
jean mike écrivit :
/* A */

listele *deb, *bkup, *nouv, *a ; /* A */



<couic>
/* B */
nouv = bkup = deb ;

Ici nouv et bkup recoivent l’adresse en mémoire de deb



Donc quand on écrit dans deb->xxx, on écrit en même temps dans nouv->xxx
et dans bkup->xxx


/* C */

deb->suiv = NULL ;

deb->suiv recoit l’adresse nulle



Et de même pour nouv->suiv et pour bkup->suiv !


/* D */ si nouv est alphabetiquement plus petit que deb. Comment est-
ce que la comparaison peut se faire lors de la première saisie?



Cf. supra: en fait ils sont identiques, deb->Name et nouv->Name sont un
seul et unique objet.


/* E */
Je ne suis pas sûre de comprendre : «on ne disposerait plus alors de
l’adresse nécessaire du prédécesseur dans la liste»



Fait un dessin sur une feuille de papier, et suis les opérations une par
une : une liste chaînée est très facile à visualiser. La symbologie
habituelle, c'est une boîte pour un objet structure (alloué par
malloc()), et une flèche pour un pointeur. Au départ tu as


deb-------
nouv-------
bkup--------
+---------+
->| |
| suiv---------->NULL
| |
+---------+

Au troisième tour, tu auras

deb-------
nouv---
+------+ +------+ +------+ +------+
->| | ->| | /->| | /->| |
| suiv-->??? | suiv--/ | suiv--/ | suiv-->NULL
| | | | | | | |
+------+ +------+ +------+ +------+

Crayon et gomme, il n'y rien de mieux en algorithmique !


Antoine
Publicité
Poster une réponse
Anonyme