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

struct mail {
  unsigned short valeur;
  struct mail* suivant;
};

typedef struct mail maillon;

maillon* creation_liste(void) {
	int i;
	maillon* p;
	maillon* premier;
	maillon* s;
	srand(time(NULL));
	premier = (maillon*) malloc(sizeof(maillon));
	if (!premier) {
			printf("Erreur d'allocation mémoire. (1) \n");
		}
	premier->valeur = (rand() % 889) + 111;
	p = premier;
	for (i = 0; i != 9; i++) {
		s = (maillon*) malloc(sizeof(maillon));
		if (!s) {
			printf("Erreur d'allocation mémoire. (2) \n");
		}
		s->valeur = (rand() % 889) + 111;
		p->suivant = s;
		p = s;
	}
	return premier;
}

void destruction_liste(maillon* liste) {
	maillon* p = liste;
	maillon* suivant;
	while (p != NULL) {
		suivant = p->suivant;
		free(p);
		p = suivant;
	}
	printf("Destruction terminée.\n");
}

void afficher_liste(maillon* liste) {
	maillon* p;
	for (p = liste; p != NULL; p = p->suivant) {
		printf("| %d |", p->valeur);
	}
	putchar('\n');
}

unsigned short recherche_max(maillon* liste) {
	unsigned short maximum = liste->valeur;
	maillon* p;
	for (p = liste; p != NULL; p = p->suivant) {
		if (p->valeur > maximum) {
			maximum = p->valeur;
		}
	}
	return maximum;
}

void retire_dernier(maillon* liste) {
	maillon* p;
	for (p = liste; p != NULL; p = p->suivant) {
		if (p->suivant->suivant == NULL) {
			/* Il faut faire pointer l'avant dernier maillon sur NULL */
			p->suivant = NULL;
			free(p->suivant);
		}
	}
	printf("Succès.\n");
}

maillon* permutation_liste(maillon* liste) {
	maillon* p;
	maillon* temp = liste;
	for (p = liste; p->suivant != NULL; p = p->suivant) {
		p = p->suivant;
	}
	/* TODO */
	liste->valeur = p->valeur;
	liste->suivant = p;
	return liste;
}


int main(void) {
	maillon* liste = creation_liste();
	afficher_liste(liste);
	printf("Maximum de la liste : %hu\n", recherche_max(liste));
	/*retire_dernier(liste);*/
	/*afficher_liste(liste);*/
	afficher_liste(permutation_liste(liste));
	destruction_liste(liste);
	return EXIT_SUCCESS;
}