#include <stdio.h>
#include <stdlib.h>

typedef struct Noeud {
	int valeur;
	struct Noeud* suivant;
} Noeud;

Noeud* ajoutTete(Noeud* teteliste, int n);
Noeud* ajoutFin(Noeud* teteliste, int n);
Noeud* ajoutKieme(Noeud* teteliste, int k, int n);
Noeud* supprTete(Noeud* teteliste);
Noeud* supprFin(Noeud* teteliste);
Noeud* supprKieme(Noeud* teteliste, int k);
void menu();
void afficher (Noeud* teteliste);
int scanInt(char* question);

int main()
{
    int action;
    Noeud* teteliste = NULL;
    do
    {
        afficher (teteliste);
        printf("\n");
        menu();
        int res;
        do
        {
            res = scanf("%d",&action);
            char ch;
            while ((ch = getchar()) != '\n' && ch != EOF); 
        } while (res!= 1);
        switch (action)
        {
               case 0: teteliste = ajoutTete(teteliste, scanInt("Saisir une valeur entiere: ")); break;
               case 1: teteliste = ajoutFin(teteliste, scanInt("Saisir une valeur entiere: ")); break;
               case 2: teteliste = ajoutKieme(teteliste, scanInt("Saisir une position: "), scanInt("Saisir une valeur entiere: ")); break;
               case 3: teteliste = supprTete(teteliste); break;
               case 4: teteliste = supprFin(teteliste); break;;
               case 5: teteliste = supprKieme(teteliste, scanInt("Saisir une position: ")); break;
        }
    } while (action !=6);
    return 0;
}

int scanInt(char* question)
{
        printf("%s\n", question);
        int n;
        scanf("%d",&n);
        char ch;
        while ((ch = getchar()) != '\n' && ch != EOF); 
        return n;
}

void afficher (Noeud* teteliste)
{
     Noeud* l = teteliste;
     printf("Liste actuelle:\nteteliste = ");
     while (l!=NULL)
     {
           printf("%d --> ",l->valeur);
           l = l->suivant;
     }
     printf("NULL\n");
}

Noeud* ajoutTete(Noeud* teteliste, int n)
{
       Noeud* noeud = (Noeud*)malloc(sizeof(Noeud));
       noeud->valeur = n;
       noeud->suivant = teteliste;
       return noeud;
}

Noeud* ajoutFin(Noeud* teteliste, int n)
{
     Noeud* noeud = (Noeud*)malloc(sizeof(Noeud));
     noeud->valeur = n;
     noeud->suivant = NULL;

     if (teteliste == NULL) return noeud;
     Noeud* l = teteliste;
     while (l->suivant!=NULL)
     {
           l = l->suivant;
     }
     l->suivant = noeud;
     return teteliste;
}
     
Noeud* ajoutKieme(Noeud* teteliste, int k, int n)
{
     if (k<0)
     {
               printf("k negatif, ajout impossible\n");
               return teteliste;
     }
     if (k==0) return ajoutTete(teteliste, n);
     if (teteliste == NULL)
     {               
               printf("k trop grand, ajout impossible\n");
               return teteliste;
     }
     Noeud* l = teteliste;
     while (l!=NULL && k>1)
     {
           l = l->suivant;
           k--;
     }
     if (l==NULL)
     {
               printf("k trop grand, ajout impossible\n");
               return teteliste;
     }
     Noeud* noeud = (Noeud*)malloc(sizeof(Noeud));
     noeud->valeur = n;
     noeud->suivant = l->suivant;
     l->suivant = noeud;
     return teteliste;
}     
       
Noeud* supprTete(Noeud* teteliste)
{
       if (teteliste == NULL) return NULL;
       Noeud* noeud = teteliste->suivant;
       free(teteliste);
       return noeud;
}

Noeud* supprFin(Noeud* teteliste)
{
     if (teteliste == NULL) return NULL;
     if (teteliste->suivant == NULL)
     {
                            free(teteliste);
                            return NULL;
     }
     Noeud* l = teteliste;
     while (l->suivant->suivant!=NULL)
     {
           l = l->suivant;
     }
     free(l->suivant);
     l->suivant = NULL;
     return teteliste;
}

Noeud* supprKieme(Noeud* teteliste, int k)
{
     if (k<0)
     {
               printf("k negatif, suppression impossible\n");
               return teteliste;
     }
     if (k==0) return supprTete(teteliste);
     if (teteliste == NULL)
     {               
               printf("k trop grand, suppression impossible\n");
               return teteliste;
     }
     Noeud* l = teteliste;
     while (l->suivant!=NULL && k>1)
     {
           l = l->suivant;
           k--;
     }
     if (l->suivant==NULL)
     {
               printf("k trop grand, suppression impossible\n");
               return teteliste;
     }
     Noeud* noeud = l->suivant;
     l->suivant = l->suivant->suivant;
     free(noeud);     
     return teteliste;
}

void menu()
{
     printf("0 - ajoutTete\n");
     printf("1 - ajoutFin\n");
     printf("2 - ajoutKieme\n");
     printf("3 - supprTete\n");
     printf("4 - supprFin\n");
     printf("5 - supprKieme\n");
     printf("6 - quitter\n");
}
