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

struct mail {
	unsigned short int valeur;
	struct mail* suivant;
};
 
typedef struct mail maillon;

void afficher(maillon* premier) 
{
	maillon* p;
	for(p = premier; p != NULL; p = p->suivant)
	{
		printf("%d ", p->valeur);
	}
	printf("\n");
}

maillon* ajouter_debut(maillon* premier,unsigned short int nouveau) 
{
	maillon* p = (maillon*) malloc(sizeof(maillon));
	if (p) 
	{
		p->suivant = premier;
		p->valeur = nouveau;
  	}
  	return p;
}

maillon* ajouter_dernier(maillon* premier,unsigned short int chiffre) 
{
	maillon* nouveau = (maillon*) malloc(sizeof(maillon));
	nouveau -> suivant = NULL;
	nouveau ->valeur = chiffre;
	maillon* p = (maillon*) malloc(sizeof(maillon));
  	for(p = premier; p != NULL; p = p->suivant)
	{
		if(p->suivant==NULL)
		{
			p->suivant=nouveau;
			return premier;
		}
	}
}

unsigned short int retirer_premier(maillon* premier)
{
	maillon* postp = (maillon*) malloc(sizeof(maillon));
	postp = premier -> suivant;
	unsigned short int chiffre = premier -> valeur;
	premier -> valeur = postp -> valeur;
	premier ->suivant = postp -> suivant;
	free(postp);
	return chiffre;
}

unsigned short int retirer_dernier(maillon* premier) 
{
	unsigned short int output;
	maillon* p = (maillon*) malloc(sizeof(maillon));
	maillon* anteP = (maillon*) malloc(sizeof(maillon));
  	for(p = premier; p != NULL; p = p->suivant)
	{
		if(p->suivant==NULL)
		{
			anteP ->suivant = NULL;
			output = p -> valeur;
			free(p);
			return output;
		}
		else
		{
			anteP = p;
		}
	}
}



maillon* circuler(maillon* premier)
{
	premier= ajouter_debut(premier,retirer_dernier(premier));
	return premier;
}

maillon* circulerAnti(maillon* premier)
{
	premier=ajouter_dernier(premier,retirer_premier(premier));
	return premier;
}

int main(int argc, char const *argv[])
{
	srand(time(NULL));
	unsigned short int number = (rand() % (999 - 111 + 1)) + 111;
	maillon *mail = malloc(sizeof(maillon));
	mail -> valeur = number;
	mail -> suivant = NULL;
	for (int i = 0; i < 9; ++i)
	{
		number = (rand() % (999 - 111 + 1)) + 111;
		mail = ajouter_debut(mail,number);
	}

	int max = mail -> valeur;
	for(maillon* p = mail; p != NULL; p = p->suivant)
	{
		if (p->valeur>max)
		{
			max = p->valeur;
		}
	}
	/*printf("le max est: %d \n", max);
	printf("la liste sans le dernier nombre:");
	retirer_dernier(mail);
	afficher(mail);
	printf("la liste cyclé: ");
	mail=circuler(mail);
	afficher(mail);
	printf("ajout de 666 à la fin : ");
	mail=ajouter_dernier(mail,666);
	afficher(mail);
	printf("suppresion du premier element: \n");
	retirer_premier(mail);
	afficher(mail);
	printf("cycle mais dans lautre sens:\n");
	mail=circulerAnti(mail);
	afficher(mail);*/

	afficher(mail);
	int rotation;
	printf("choisissez une rotation: \n");
	scanf("%d",&rotation);
	if(rotation > 0)
	{
		for (int i = 0; i < rotation; ++i)
		{
			mail=circuler(mail);
		}
		afficher(mail);
	}else
	{
		if (rotation < 0)
		{
			for (int i = 0; i < (-1*rotation); ++i)
			{
				mail=circulerAnti(mail);
			}
			afficher(mail);
		}else
		{
			afficher(mail);
		}
	}

	return 0;
}