#include <stdio.h>
#include <stdlib.h>
typedef struct Elemento {
int valor;
struct Elemento*prox;
} Elemento;
typedef struct Lista {
Elemento*Inicio;
Elemento*Fim;
} Lista;
Lista*CriandoLista() {
Lista
*lista
=(Lista
*)malloc(sizeof(Lista
)); lista->Inicio=NULL;
lista->Fim=NULL;
return lista;
}
Elemento*CriandoElemento(int n) {
Elemento
*novo
=(Elemento
*)malloc(sizeof(Elemento
)); novo->prox=NULL;
novo->valor=n;
return novo;
}
void AddLista(Lista*lista,Elemento*novo) {
if(lista->Inicio==NULL) {
lista->Inicio=novo;
lista->Fim=lista->Inicio;
} else {
lista->Fim->prox=novo;
lista->Fim=novo;
}
}
void Imprimir(Lista*lista) {
Elemento*aux=lista->Inicio;
while(aux!=NULL) {
aux=aux->prox;
}
}
void AddOrdenado(Lista*nvlista, Elemento* elemento) {
if (nvlista->Inicio == NULL){
nvlista->Inicio = nvlista->Fim = elemento;
return;
}
Elemento *atual = nvlista->Inicio;
Elemento *anterior = NULL;
while (atual != NULL && atual->valor < elemento->valor){
anterior = atual;
atual = atual->prox;
}
if (atual == NULL){ //novo maior que todos
nvlista->Fim->prox = elemento;
nvlista->Fim = elemento;
}
else {
if (anterior == NULL){
elemento->prox = nvlista->Inicio;
nvlista->Inicio = elemento;
}
else {
elemento->prox = anterior->prox;
anterior->prox = elemento;
}
}
}
void Ordenar(Lista*lista) {
Lista*nvlista=CriandoLista();
Elemento *no_atual = lista->Inicio;
while(no_atual != NULL) {
Elemento *novo = CriandoElemento(no_atual->valor);
AddOrdenado(nvlista, novo);
no_atual = no_atual->prox;
}
Imprimir(nvlista);
}
int main() {
Lista*lista=CriandoLista();
int n[]= {5,10,9,1,4,2,14,21,7};
for(int i=0; i<sizeof(n)/sizeof(int); i++) {
AddLista(lista,CriandoElemento(n[i]));
}
Imprimir(lista);
Ordenar(lista);
}