#include <stdio.h>
#include <stdlib.h>

/* Structure représentant un maillon d'une liste chaînée */
typedef struct Maillon {
    double valeur;
    struct Maillon *suivant;
} Maillon;

/* Fonction pour afficher une liste chaînée */
void afficher_liste(Maillon *tete) {
    Maillon *courant = tete;
    while (courant != NULL) {
        printf("%lf ", courant->valeur);
        courant = courant->suivant;
    }
    printf("\n");
}

/* Fonction pour ajouter une valeur dans une liste triée */
Maillon *ajouter_valeur(Maillon *tete, double valeur) {
    /* Création d'un nouveau maillon */
    Maillon *nouveau = (Maillon *)malloc(sizeof(Maillon));
    if (nouveau == NULL) {
        perror("Erreur d'allocation mémoire");
        exit(EXIT_FAILURE);
    }
    nouveau->valeur = valeur;
    nouveau->suivant = NULL;

    /* Si la liste est vide ou si la valeur doit être ajoutée en tête */
    if (tete == NULL || valeur <= tete->valeur) {
        nouveau->suivant = tete;
        return nouveau;
    }

    /* Recherche de l'emplacement pour insérer la nouvelle valeur */
    Maillon *courant = tete;
    while (courant->suivant != NULL && courant->suivant->valeur < valeur) {
        courant = courant->suivant;
    }

    /* Insertion du nouveau maillon */
    nouveau->suivant = courant->suivant;
    courant->suivant = nouveau;

    return tete;
}

/* Programme principal */
int main(int argc, char *argv[]) {
    /* Vérification des arguments */
    if (argc < 2) {
        fprintf(stderr, "Usage: %s <reel1> <reel2> ... <reelN>\n", argv[0]);
        return EXIT_FAILURE;
    }

    Maillon *liste = NULL;

    /* Conversion des arguments en double et insertion dans la liste */
    for (int i = 1; i < argc; i++) {
        double valeur = atof(argv[i]);
        liste = ajouter_valeur(liste, valeur);
    }

    /* Affichage de la liste triée */
    afficher_liste(liste);

    /* Libération de la mémoire */
    Maillon *temp;
    while (liste != NULL) {
        temp = liste;
        liste = liste->suivant;
        free(temp);
    }

    return EXIT_SUCCESS;
}
