Lista Duplamente Encadeada em C

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;
}```
struct no {
    char cidade[TAMMAX_CIDADE];
    int temperatura;
    struct no * anterior;
    struct no * proximo;
};

Para exibir, sugiro ordenar o vetor de acordo com a temperatura da cidade, aí sim, você consegue exibir tranquilamente.

1 curtida