0
I have this List simply chained and n know how to order it. I need to sort by name and number.
#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;
Registro *Ordenar;
Ordenar=inicio->prox;
Registro *aux;
while(Ordenar!=NULL)
{
aux=Ordenar->prox;
while(aux!=NULL)
{
if(aux->matricula<Ordenar->matricula)
{
ss=Ordenar->matricula;
Ordenar->matricula=aux->matricula;
aux->matricula=ss;
}
}
Ordenar=Ordenar->prox;
aux=aux->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;
}
}
}
}
Speaking of performance... I did this analysis for some sorting methods in Java. Average time to sort 30,000 elements: better implementation of
BubbleSort
gave1692.41 ms
;MergeSort
gave4.29 ms
– Jefferson Quesado
Isac, I think it would be better to just do the topological change, without changing the content of each node, changing only the pointers. I did something similar here: https://answall.com/a/246301/64969
– Jefferson Quesado
@Jeffersonquesado Yes would certainly be better and more efficient as indicated in the notes. I did not do this not only to change the logic that the AP already had and also because it is considerably more complicated. Later on I will probably complement the answer with this solution as well.
– Isac