Adloun

Insérer en fin sans pointeur de queue

Exercice · niveau 2 · informatique (MP2I/MPI), chapitre 7 — Structures séquentielles : listes, piles, files

Énoncé

Un programme construit une liste chaînée en ajoutant éléments à la fin, sans garder de pointeur sur le dernier maillon. Quel est le coût total ? Le mesurer, puis corriger.

Corrigé


/* Ajoute x en fin. Renvoie la tete. Cout : Theta(n) -- on RETRAVERSE tout. */
maillon* inserer_fin(maillon* tete, int x) {
    maillon* neuf = malloc(sizeof(maillon));
    neuf->valeur = x; neuf->suivant = NULL;
    if (tete == NULL) { return neuf; }
    maillon* m = tete;
    while (m->suivant != NULL) { m = m->suivant; }
    m->suivant = neuf;
    return tete;
}

Le -ième appel traverse maillons, donc le total vaut

Mesuré :


n =  5000 : 0,013 s        n = 20000 : 0,218 s        n = 80000 : 3,545 s
n = 10000 : 0,052 s        n = 40000 : 0,890 s

Le temps est multiplié par chaque fois que double : la signature du quadratique, comme l'annonçait le calcul.

Les deux corrections, et il faut savoir choisir entre elles.

Le défaut à nommer, parce qu'il revient sous mille formes : on a placé dans une boucle une opération dont le coût dépend de la taille déjà construite. C'est le même défaut que strlen dans la condition d'une boucle au chapitre chap:langage-c, et que la concaténation répétée de chaînes. Chaque appel semble innocent ; c'est leur somme qui est quadratique, et aucun profil d'exécution ne le dira tant que reste petit.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.