Eu estou aprendendo C e eu achei esse code interessante, acho que a autora chama-se Luiza, dou todos os créditos a ela e eu queria tirar uma dúvida acerca dele. Como eu poderia adicionar a temperatura das cidades na lista, exibi-las e fazer com que seja exibido na lista na ordem da cidade mais fria para a mais quente, por exemplo? Quem puder me ajudar, agradeço muito.
#include <stdlib.h>
#include <string.h>
enum OpcoesMenu{SAIR=0,CRIAR_LISTA,INSERIR_CIDADE,REMOVER_CIDADE,IMPRIMIR_LISTA,VERIFICAR_LISTA_VAZIA,LIBERAR_MEMORIA};
#define TAMMAX_CIDADE 51
struct no {
char cidade[TAMMAX_CIDADE];
struct no * anterior;
struct no * proximo;
};
typedef struct no No;
int is_vazia(No * lista) {
return (lista->anterior == NULL && lista->proximo == NULL && strcasecmp(lista->cidade,"") == 0);
}
No * criar_elemento() {
No * e = (No*) malloc(sizeof(No));
e->anterior = e->proximo = NULL;
e->cidade[0] = '\0';
return e;
}
// Insere no final
void inserir(No * lista, char * nome_cidade) {
if (is_vazia(lista)) {
strncpy(lista->cidade, (const char *) nome_cidade, strlen(nome_cidade));
} else {
No * tmp = lista;
while(tmp->proximo != NULL) { tmp = tmp->proximo; }
No * e = criar_elemento();
strncpy(e->cidade, (const char *) nome_cidade, strlen(nome_cidade));
e->anterior = tmp;
e->proximo = NULL;
tmp->proximo = e;
}
}
No * pesquisar (No * inicio_lista, char * nome_cidade) {
No * tmp;
if (is_vazia(inicio_lista)) {
tmp = NULL;
} else {
tmp = inicio_lista;
while(tmp != NULL) {
if (strcasecmp(tmp->cidade, nome_cidade) == 0) return tmp;
tmp = tmp->proximo;
}
}
return tmp;
}
No * remover(No * lista, No * elemento) {
No * tmp_inicio;
if (elemento == lista) {
tmp_inicio = lista;
tmp_inicio = elemento->proximo;
tmp_inicio->anterior = NULL;
} else {
tmp_inicio = elemento->anterior;
tmp_inicio->proximo = elemento->proximo;
tmp_inicio = lista;
}
free(elemento);
return tmp_inicio;
}
void imprimir(No * lista) {
if (is_vazia(lista)) {
puts("Não há elementos na lista.");
} else {
No * tmp = lista;
while(tmp != NULL) {
printf("%s\n", tmp->cidade);
tmp = tmp->proximo;
}
}
}
void liberar_memoria(No * lista) {
if (lista->proximo == NULL) {
free(lista);
} else {
return liberar_memoria(lista->proximo);
}
}
void menu_geral() {
printf("\n\t\t>-------------------- MENU --------------------<\n\n");
printf("%d) Sair\n", SAIR);
printf("%d) Criar lista\n", CRIAR_LISTA);
printf("%d) Inserir cidade\n", INSERIR_CIDADE);
printf("%d) Remover cidade\n", REMOVER_CIDADE);
printf("%d) Imprimir lista\n", IMPRIMIR_LISTA);
printf("%d) Verificar se lista está vazia\n", VERIFICAR_LISTA_VAZIA);
printf("%d) Liberar lista\n", LIBERAR_MEMORIA);
}
char * menu_ler_cidade() {
char nome[TAMMAX_CIDADE];
printf("Informe o nome da cidade: ");
fgets(nome, TAMMAX_CIDADE, stdin);
(*strrchr(nome, '\n')) = '\0';
return strdup(nome);
}
int main() {
int opcao;
char * nome_cidade;
No * lista = NULL;
while(1) {
menu_geral();
printf("Opção: ");
scanf("%d%*c", &opcao);
if (opcao == SAIR) break;
if (lista == NULL && opcao != CRIAR_LISTA) {
puts("A lista não foi criada.");
} else {
switch(opcao) {
case CRIAR_LISTA:
lista = criar_elemento();
break;
case INSERIR_CIDADE:
puts("\t\t------------- INSERIR CIDADE ------------------");
nome_cidade = menu_ler_cidade();
if (pesquisar(lista, nome_cidade) == NULL) {
inserir(lista, nome_cidade);
} else {
puts("Cidade já inserida na lista.");
}
break;
case REMOVER_CIDADE:
puts("\t\t------------- REMOVER CIDADE ------------------");
nome_cidade = menu_ler_cidade();
No * registro = pesquisar(lista, nome_cidade);
if (registro == NULL) {
puts("Cidade não localizada.");
} else {
lista = remover(lista, registro);
}
break;
case VERIFICAR_LISTA_VAZIA:
printf("A lista%sestá vazia\n", is_vazia(lista)? " " : " não ");
break;
case IMPRIMIR_LISTA:
imprimir(lista);
break;
case LIBERAR_MEMORIA:
liberar_memoria(lista);
lista = NULL;
break;
default:
printf("\nDigite uma das opções validas.\n");
}
}
}
if (lista != NULL) liberar_memoria(lista);
return 0;
}```