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

/* Définition de la structure pour un maillon de la liste chaînée*/
struct Node {
    int value;
    struct Node* next;
};

/* Alias pour faciliter l'utilisation de la structure*/
typedef struct Node Node;

/* Fonction pour ajouter un entier dans la liste de manière ordonnée*/
Node* insertOrdered(Node* head, int value) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    Node* current;
    newNode->value = value;
    newNode->next = NULL;

    if (head == NULL || value < head->value) {
        newNode->next = head;
        return newNode;
    }

    current = head;
    while (current->next != NULL && current->next->value < value) {
        current = current->next;
    }

    newNode->next = current->next;
    current->next = newNode;

    return head;
}

/* Fonction pour afficher les valeurs dans la liste*/
void displayList(Node* head) {
    Node* current = head;

    while (current != NULL) {
        printf("%d ", current->value);
        current = current->next;
    }

    printf("\n");
}

int main() {
    Node* head = NULL;  /* Tête de la liste*/

    while (1) {
        int userInput;

        printf("Entrez un entier (ou appuyez sur Entrée pour quitter) : ");
        if (scanf("%d", &userInput) != 1) {
            /* L'utilisateur a appuyé sur Entrée, quitter la boucle*/
            break;
        }

        /* Insérer l'entier dans la liste de manière ordonnée*/
        head = insertOrdered(head, userInput);

        /* Afficher la liste actuelle*/
        displayList(head);
    }

    /* Libérer la mémoire allouée pour la liste à la fin du programme*/
    while (head != NULL) {
        Node* temp = head;
        head = head->next;
        free(temp);
    }

    return 0;
}