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

void BuscarMatricula();
void Inserir();
void Exibir();
void Remover();
int menu();
void OrdenaNome();


typedef struct registro {
	char nome[50];
	int matricula;
	float nota;
	struct registro *prox;
} Registro;


int menu() {
	int op;
	printf("\n\tLista Encadeada Simples-\n");
	printf("Informe a opção desejada\n");
	printf("1 - Inserir\n");
	printf("2 - Buscar pro Matricula\n");
	printf("3 - Remover\n");
	printf("4 - Ordenar por nome\n");
	printf("5 - Ordenar por Matricula\n");
	printf("6 - Exibir os elementos da Lista\n");
	printf("7 - Calcular média da turma\n");
	scanf("%d", &op);
	return op;
}



void Inserir(Registro *inicio) {
	Registro *novo;
	novo=inicio;
	if(novo->prox==NULL) { // Alocação comúm;
		novo->prox=(Registro *)malloc(sizeof(Registro));
		novo = novo->prox;
		printf("Informe o nome do aluno\n");
		scanf("%s",novo->nome);
		//__fpurge(stdin);

		printf("Informe a Matricula do Aluno\n");
		scanf("%d", &novo->matricula);

		printf("Informe a nota do Aluno\n");
		scanf("%f", &novo->nota);
		novo->prox = NULL;

	} else { // novo apontando para uma posição já alocada;
		novo=novo->prox;
		Inserir(novo);
	}

}

void Exibir(Registro *inicio) {
	Registro *Exibir;
	Exibir=inicio->prox;
	if(Exibir==NULL) {
		printf("\t-------------------------------------------------\n");
		printf("\tRegistro Vazio\n");
		printf("\t-------------------------------------------------\n");
	} else {
		do {
			printf("\t Nome do Aluno: %s | Matricula :%d | Nota: %.2f \n", Exibir->nome,Exibir->matricula,Exibir->nota );
			printf("\t-------------------------------------------------\n");
			Exibir=Exibir->prox;
		} while(Exibir!=NULL);
	}
}

void BuscarMatricula(Registro *inicio) {
	int Pesquisar_matricula;
	Registro *Buscar;
	Buscar=inicio->prox;
	if(Buscar==NULL) {
		printf("\t-------------------------------------------------\n");
		printf("\tRegistro Vazio\n");
		printf("\t-------------------------------------------------\n");
	} else {
		printf("Informe a matricula do aluno\n");
		scanf("%d", &Pesquisar_matricula);
		do {
			if(Pesquisar_matricula==Buscar->matricula) {
				printf("\t Nome do Aluno: %s | Matricula :%d | Nota: %.2f \n", Buscar->nome,Buscar->matricula,Buscar->nota );
				break;
			} else
				Buscar=Buscar->prox;
			if(Buscar==NULL)
				printf("Matricula não encontrada\n");
		} while(Buscar!=NULL);
	}
}

void Remover(Registro *inicio) {
	int Pesquisar_matricula;
	Registro *Remover;
	Registro *anterior;
	Remover=inicio->prox;
	anterior=inicio;
	if(Remover==NULL) {
		printf("\t-------------------------------------------------\n");
		printf("\tRegistro Vazio\n");
		printf("\t-------------------------------------------------\n");
	} else {
		printf("Informe a matricula do aluno\n");
		scanf("%d", &Pesquisar_matricula);
		do {
			if(Pesquisar_matricula==Remover->matricula) {
				printf("\t Aluno removido: %s | Matricula :%d | Nota: %.2f \n", Remover->nome,Remover->matricula,Remover->nota );
				anterior->prox=Remover->prox;
				free(Remover);
				break;
			} else
				Remover=Remover->prox;
			anterior=anterior->prox;
			if(Remover==NULL)
				printf("Matricula não encontrada\n");
		} while(Remover!=NULL);
	}
}

void OrdenaMatricula(Registro *inicio) {
	int ss;
	char nometemp[50];
	float notatemp;

	Registro *Ordenar;
	Ordenar=inicio->prox;
	Registro *aux;



	while(Ordenar!=NULL) {
		aux=Ordenar->prox;
		while(aux!=NULL) {
			if(aux->matricula<Ordenar->matricula) {
				ss=Ordenar->matricula;
				strcpy(nometemp,Ordenar->nome);
				notatemp = Ordenar->nota;

				Ordenar->matricula=aux->matricula;
				strcpy(Ordenar->nome, aux->nome);
				Ordenar->nota = aux->nota;

            	aux->matricula=ss;
            	strcpy(aux->nome, nometemp);
            	aux->nota = notatemp;
			}
            aux=aux->prox;
		}
		Ordenar=Ordenar->prox;
	}

}





int main() {
	Registro *inicio;
	inicio=(Registro *)malloc(sizeof(Registro));
	inicio->prox=NULL;


	int op;
	int sair=0;
	int posvalida;
	while(!sair) {
		op=menu();
		switch(op) {
		case 1: {
			Inserir(inicio);
			break;

		}
		case 2: {
			BuscarMatricula(inicio);
			break;
		}
		case 3: {
			Remover(inicio);
			break;
		}
		case 5: {
			OrdenaMatricula(inicio);
			break;
		}
		case 6: {
			Exibir(inicio);
			break;
		}
		case 7: {
			sair=1;
			break;
		}
		}

	}
    return 0;
}
