Ajuda com string em estrutura de dados

1. Ajuda com string em estrutura de dados

joao pedro ache virgili
joaovirgili

(usa Ubuntu)

Enviado em 31/12/2016 - 02:11h

olá, estou com um exercício em que devo ordenar um quadro de medalhas (https://www.urionlinejudge.com.br/judge/pt/problems/view/2312). Resolvi utilizar estrutura de dados lista encadeada e inserir cada país ordenadamente. Tentei fazer algo recursivo mas não consegui, não nem se tem como, então fiz por passos. Criei a função para inserir e funções auxiliares para comparar as medalhas( compara_ouro, compara_prata, compara_bronze), onde, quando as medalhas forem iguais, ele chama a próxima função. Ainda não implementei a ultima função de comparar o nome pois estou testando com esta antes disso. Acredito que a ordenação, até então, esteja correta, porém quando adiciono 2 ou mais países, ele aparece como se todos os países fossem o ultimo adicionado. Por exemplo:
Entrada
brasil 1 2 3
espanha 3 2 1
franca 2 2 2

Saída
franca 3 2 1
franca 2 2 2
franca 1 2 3

Parece que quando ele salva o ultimo nome, ele salva em toda a minha estrurura. Ja revisei o codigo mas não encontro o erro

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

struct Pais {
char *nome;
int ouro;
int prata;
int bronze;
struct Pais *prox;
struct Pais *ant;
};
typedef struct Pais pais;

pais *aloca ();
void inicia_quadro (pais *quadro);
bool quadro_vazio (pais *quadro);
void imprime_quadro (pais *quadro);
void compara_ouro (pais *atual, pais *novo);
void compara_prata (pais *atual, pais *novo);
void compara_bronze (pais *atual, pais *novo);
void compara_nome (pais *atual, pais *novo);
void insere_pais_ordenado (pais *quadro, char *Nome, int o, int p, int b);

pais *aloca () {
pais *novo=(pais*)malloc (sizeof(pais));
if(!novo) {
printf("Sem memoria\n");
exit(1);
}
else
return novo;
}

void inicia_quadro (pais *quadro) {
quadro->prox = NULL;
}
bool quadro_vazio (pais *quadro){
if (quadro->prox == NULL)
return true;
else
return false;
}

void compara_ouro (pais *atual, pais *novo) {
if (novo->ouro > atual->ouro) {
atual->ant->prox = novo;
novo->prox = atual;
novo->ant = atual->ant;
atual->ant = novo;
}
else if (novo->ouro < atual->ouro) {
while (novo->ouro < atual->ouro && atual->prox != NULL)
atual = atual->prox;
novo->prox = atual->prox;
atual->prox = novo;
novo->ant = atual;
}
else {
compara_prata (atual, novo);
}
}
void compara_prata (pais *atual, pais *novo) {
if (novo->prata > atual->prata) {
atual->ant->prox = novo;
novo->prox = atual;
novo->ant = atual->ant;
atual->ant = novo;
}
else if (novo->prata < atual->prata) {
while (novo->prata < atual->prata && atual->prox != NULL)
atual = atual->prox;
novo->prox = atual->prox;
atual->prox = novo;
novo->ant = atual;
}
else {
compara_bronze (atual, novo);
}
}
void compara_bronze (pais *atual, pais *novo) {
if (novo->bronze > atual->bronze) {
atual->ant->prox = novo;
novo->prox = atual;
novo->ant = atual->ant;
atual->ant = novo;
}
else if (novo->bronze < atual->bronze) {
while (novo->bronze < atual->bronze && atual->prox != NULL)
atual = atual->prox;
novo->prox = atual->prox;
atual->prox = novo;
novo->ant = atual;
}
else {
compara_nome (atual, novo);
}
}
void compara_nome (pais *atual, pais *novo) {

}



void insere_pais_ordenado (pais *quadro, char *Nome, int o, int p, int b) {
pais *novo = aloca();
novo->ouro = o;
novo->prata = p;
novo->bronze = b;
novo->nome = Nome;
printf("%s\n", novo->nome);
if (quadro_vazio(quadro) == true) {
novo->ant = quadro;
novo->prox = NULL;
quadro->prox = novo;
}
else {
pais *atual = aloca();
atual = quadro->prox;
compara_ouro(atual, novo);
}
}

void imprime_quadro (pais *quadro) {
while (quadro->prox != NULL) {
quadro = quadro->prox;
printf("%s %d %d %d\n", quadro->nome, quadro->ouro, quadro->prata, quadro->bronze);
}
}


int main (void) {
int n, i, ouro, prata, bronze;
char nome[20];
pais *quadro = (pais*) malloc (sizeof(pais));
inicia_quadro (quadro);
scanf("%d", &n);
for (i=0; i<n; i++) {
scanf("%s %d %d %d", &nome, &ouro, &prata, &bronze);
insere_pais_ordenado(quadro, nome, ouro, prata, bronze);
}

printf("\n");
imprime_quadro(quadro);
return 0;
}



  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts