Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

otaviohpf

Inserir ordenado na lista encadeada(ligada)

Recommended Posts

Olá, estou com um problema: tenho que ler um arquivo de .csv que contem simulações de jogos entre dois times e/ou consultas ao ranking.
Foi especificado que o numero de consultas é muito maior que o numero de simulações de jogos.
Para não ficar muito custoso pensei em sempre inserir os times após cada simulação já de maneira ordenada, e se o time já tiver feito algum outro jogo, eu removo e insiro novamente ordenado.


/****************************    Estruturas    ****************************/
typedef int TipoChave;
typedef struct TipoTime {
char *nome;
int  classificacao;
int  pontos;
}TipoTime;
typedef struct TipoItem{
TipoChave Chave;
TipoTime Time;
}TipoItem;
typedef struct TipoCelula *TipoApontador;
typedef struct TipoCelula{
TipoItem Item;
TipoApontador Prox;
}TipoCelula;
typedef struct TipoLista{
TipoApontador Primeiro, Ultimo;
}TipoLista;

/****************************    Funcoes    ****************************/
void FLVazia (TipoLista *Lista);
int Vazia(TipoLista Lista);
void Insere (TipoItem x, TipoLista *Lista);
void Retira (TipoApontador p, TipoLista *Lista, TipoItem *Item);
void Imprime (TipoLista Lista);
void ImprimeNoArquivoDeSaida (TipoLista Lista);
int pesquisarTime(TipoLista *L , char *nome, TipoCelula *Celula);
void inserirOrdenado(TipoLista Lista , TipoItem *Time);
void atualizaVitoria(TipoLista Lista, TipoItem *Item, TipoApontador p);
void atualizaEmpate(TipoLista Lista, TipoItem *Item, TipoApontador p);
/*Função que faz uma lista vazia*/
void FLVazia (TipoLista *Lista){
Lista -> Primeiro = (TipoApontador) malloc (sizeof(TipoCelula));
Lista -> Ultimo   =  Lista -> Primeiro;
Lista -> Primeiro -> Prox = NULL;
}

int Vazia(TipoLista Lista){
return (Lista.Primeiro == Lista.Ultimo);
}

/*Insere na lista*/
void Insere (TipoItem x, TipoLista *Lista){
Lista -> Ultimo -> Prox = (TipoApontador) malloc (sizeof (TipoCelula));
Lista -> Ultimo = Lista -> Ultimo -> Prox;
Lista -> Ultimo -> Item = x;
Lista -> Ultimo -> Prox = NULL;
}
/*Remove da lista*/
void Retira (TipoApontador p, TipoLista *Lista, TipoItem *Item){
TipoApontador q;
if ( (Vazia(*Lista)) || (p == NULL) || (p -> Prox == NULL) ){
  printf ("\nErro: lista vazia ou posicao nao existe!!\n");
  return;
}

q = p -> Prox;
*Item = q -> Item;
p -> Prox = q -> Prox;
if (p -> Prox == NULL){
  Lista -> Ultimo = p;
}
free (q);
}
/*Imprime a lista*/
void Imprime (TipoLista Lista){
TipoApontador Aux;
Aux = Lista.Primeiro -> Prox;
while (Aux != NULL){
  printf ("%d \n" , Aux -> Item.Chave);
  Aux = Aux -> Prox;
}
}
/*void ImprimeNoArquivoDeSaida (TipoLista Lista){
TipoApontador Aux;
Aux = Lista.Primeiro -> Prox;
while (Aux != NULL){
  fprintf (ArqSaida,"%d, \n" , Aux -> Item.Chave);
  Aux = Aux -> Prox;
}
}*/
//pesquisa se já existem o time na lista.
int pesquisarTime(tlista *L,char *nome, TipoCelula *Celula){
    TipoCelula *p;
    TipoTime *Time;
   while (p !=NULL){
                 Time = L->nome;
                 if (strcmp(nome,Time->nome)==0){
                    return 1;
                 }
    }
    return 0;
}
/*Esta função faz a inserção na lista de maneira ordenada*/
void inserirOrdenado(TipoLista Lista **p, *Time)
{
    lista *atual, *novo, *anterior;
    int num;
    novo = (lista *) malloc(sizeof(lista));
    atual = *p;
    anterior = NULL;
    novo->valor = Time;
    if(atual == NULL){
            novo->prox = NULL;
            *p = novo;
    } else{
            while(atual != NULL && atual->valor < num){
                    anterior = atual;
                    atual = atual->prox;
            }
            novo->prox = atual;
            if(anterior == NULL){
                    *p = novo;
            } else{
                    anterior->prox = novo;
            }
    }
}
/*A função recebe o time vitorioso, copia para um time temporário.
chama a função Retira, para remover o item da lista
soma os 3 pontos da vitória e insere novamente de maneira ordenada*/
void atualizaVitoria(TipoLista Lista, TipoTime Time, TipoApontador p){
TipoItem ItemTemp;
//Copia o time para um TipoTime temporário.
ItemTemp.Time.nome = Item.Time.nome;
ItemTemp.Time.classificacao = Item.Time.classificacao;
ItemTemp.Time.pontos = Item.Time.pontos+3;//Ponteiro ou conteudo ?
Retira ( p, *Lista, *Item);
inserirOrdenado( Lista **p, *ItemTemp);

}
/*A função recebe os times que empataram(um por vez), copia para um time temporário.
chama a função Retira, para remover o item da lista
soma o 1 ponto da vitória e insere novamente de maneira ordenada*/
void atualizaEmpate(TipoLista Lista, TipoItem *Item, TipoApontador p){
TipoItem ItemTemp;
ItemTemp.Time.nome = Item.Time.nome;
ItemTemp.Time.classificacao = Item.Time.classificacao;
ItemTemp.Time.pontos = Item.Time.pontos+3;//Ponteiro ou conteudo ?
Retira ( p, *Lista, *Item);
inserirOrdenado( Lista **p, *ItemTemp);

}

int main(){
/************************** VARIAVEIS *****************************/
    char buffer[100];
    int i = 0;
    int flag = 1;
    TipoLista Campeonato;
    TipoItem ItemAux;
    char *Acao;
    char *TipoDaAcao;
    char *NomeDoTime1;
    char *NomeDoTime2;
/************************ LEITURA ARQUIVOS *******************************/

    FILE *ArqEntrada; // leitura dos comandos
    FILE *ArqSaida;   // resultado dos comandos
    FILE *ArqRanking; // arquivo do ranking ordenado
    ArqEntrada = fopen("entrada.csv","r");
    ArqSaida   = fopen("saida.csv", "w");
    ArqRanking = fopen("ranking.csv","r");

    if (ArqEntrada == NULL)    {
                    printf ("\nERRO: Arquivo de entrada incorreto!");
    }
    if (ArqSaida == NULL){
            printf("\nERRO: Arquivo de saida incorreto!");
    }

    if (ArqRanking == NULL){
            printf("\nERRO: Ranking nao encontrado. Sera gerado um novo.");
            ArqRanking = fopen("ranking.csv","w");
            flag = 0;
    }
/************************ CARREGANDO SIMULAÇÕES ANTERIORES *******************************/
    if (flag==1){
    fgets (buffer, 100, ArqRanking);
            while (!feof(ArqRanking)){
                    printf ("\n");
                    ItemAux.Time.nome = atoi (strtok (buffer, ","));
                    printf ("\nNome: %s", ItemAux.Time.nome);
                    ItemAux.Time.classificacao = atoi (strtok (buffer, ","));
                    printf ("\nClassificacao: %d", ItemAux.Time.classificacao );
                    ItemAux.Time.pontos = atoi(strtok (NULL, ","));
                    printf ("\nPontuacao: %d", ItemAux.Time.pontos);
                    fgets (buffer, 100, ArqRanking);
            }
   }
/************************ LEITURA DA ENTRADA *******************************/
   while (!feof(ArqEntrada)){
                   Acao = strtok (NULL, ",");
                   if      (strcmp("CONSULTA", Acao)==0){
                                    TipoDaAcao = atoi (strtok (buffer, ","));
                                    NomeDoTime1 = atoi (strtok (buffer, ","));
                                    //if (pesquisarTime(&Campeonato, *NomeDoTime1, ItemAux )==0){
                                    if (1){
                 printf("/nERRO: Time nao encontrado para consulta.");
                                    }
                                    if (strcmp("PONTUACAO", Acao)==0){
                                            fprintf(ArqSaida, "%s,%s,%d", TipoDaAcao, NomeDoTime1, ItemAux.Time.pontos);
                                    }
                                    else if (strcmp("RANKING", Acao)==0){
                                            fprintf(ArqSaida, "%s,%s,%d", TipoDaAcao, NomeDoTime1, ItemAux.Time.classificacao);
                                    }
                                    }
                    else if(strcmp("VITORIA", Acao)==0){
                                    NomeDoTime1 = atoi (strtok (buffer, ","));
                                    NomeDoTime2 = atoi (strtok (buffer, ","));
                                    if (1){//*pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )*/){
                                            atualizaVitoria(Campeonato, *Item, p);
                                            }
                                    else if(1){ //(pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )==0){
                                            //Como somar os 3 pontos para inserir ordenado?
                                            inserirOrdenado(Campeonato p, *Time);
                                    }
                                    if (1){ //(pesquisarTime(*NomeDoTime2, Campeonato, ItemAux )==0){
                                            inserirOrdenado(Campeonato p, *Time);
                                    }
                   /* else if(strcmp("EMPATE", Acao)==0){
                                    NomeDoTime1 = atoi (strtok (buffer, ","));
                                    NomeDoTime2 = atoi (strtok (buffer, ","));
                                    /* pesquisarTime retorna 1 se o time for encontrado e 0 se não.
                                    if (pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )){
                                            atualizaEmpate(Campeonato, *Item, p);
                                            }
                                    /* pesquisarTime retorna 1 se o time for encontrado e 0 se não.
                                    else if (pesquisarTime(*NomeDoTime1, Campeonato, ItemAux )==0){
                                            //Como somar o 1 ponto para inserir ordenado?
                                            inserirOrdenado(Campeonato p, *Time);
                                    }
                                    /* pesquisarTime retorna 1 se o time for encontrado e 0 se não.
                                    if (pesquisarTime(NomeDoTime2, Campeonato, ItemAux )){
                                            atualizaEmpate(Campeonato, *Item, p);
                                            }
                                    /* pesquisarTime retorna 1 se o time for encontrado e 0 se não.
                                    else if (pesquisarTime(*NomeDoTime2, Campeonato, ItemAux )==0){
                                            //Como somar o 1 ponto para inserir ordenado?
                                            inserirOrdenado(Campeonato p, *Time);
                                    }
                                  */
                            }
                    else{
                            printf("/nErro: Primeiro argumento invalido.");
                    }
   }
/************************ IMPRIME RANKING *******************************/
   ImprimeNoArquivoDeSaida(Campeonato);

    fclose(ArqEntrada);
    fclose(ArqSaida);
    fclose(ArqRanking);

    return 0;
}

Fiz o código desta maneira porém estou com muitas duvidas quanto as passagens dos parâmetros para as funções. Vocês podem me ajudar ? Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ment0r
      Boa tarde pessoal, tudo bem?

      É possível remover o cabeçalho e rodapé da impressão de uma página html via php, css ou javascript? Já adianto que não gostaria de gerar pdf, mas sim saber se é possível remover ou não.
      Obrigado a todos.
       

    • Por luigiferrari
      Gostaria de fazer um programa onde o usuário digitaria o tamanho de conjuntos e quantas linhas possui os conjuntos, exemplo:

      Seguindo, o programa perguntaria qual conjunto o usuário quer adicionar o valor, e então o valor seria adicionado nas linhas, e qnd cheio, seria o FIFO.
      Mas minhas principais duvidas seriam:
      1- Como eu crio um vetor dentro de outro (não necessariamente precisa ser um vetor, aceito sugestões de como fazer isso)
      2- Caso eu faça com o vetor, teria que gerar x vetores, por exemplo, caso o usuário colocasse em "qts conjuntos: 5" teria que criar 5 conjuntos(vetores) diferentes. Como faço isso?!
      Lembrando aceito qualquer sugestão, estou fazendo em C# mas tbm entendo de Python e PHP caso tenha alguma ideia.
    • Por Carlos Antoliv
      Olá, senhores.
       
      Sei que existem diversos tópicos por aí sobre esse assunto, contudo, não consegui solucionar o problema, mesmo depois de 1 dia tentando fazer algo até simples.
       
      Seguinte, estou pegando o id de um produto e tentando jogar em outra tabela, pelo checkbox.
      ex:
       
      id    produto
      23   lapis
      43  caneta
       
      pelo checkbox, a pessoa escolhe o produto e adicona em uma lista, que é outro banco. Se pessoa selecionar mais de 1 item da lista, o laço só envia para o banco apenas 1 item de qualquer forma.
       
      Vou postar o Código:
       
      Código do INSERT:
       
          $check1 = (isset($_POST["check"]) && $_POST["check"] != null) ? $_POST["check"] : "";     foreach($check1 as $check){                         $stmt = $conexao->prepare("INSERT INTO tb_itemProdKit (fk_tb_kit, fk_usuarios, fk_tb_produtos) VALUES (?, ?, ?)");                  $stmt->bindParam(1, $nome_prod);         $stmt->bindParam(2, $idSessao);         $stmt->bindParam(3, $check);                if ($stmt->execute()) {             if ($stmt->rowCount() > 0) {                 echo "Dados cadastrados com sucesso!";                 $id_prod = null;                 $nome_prod = null;                 $idSessao = null;                 $check = null;                             header("Location: item-produto-kit.php");exit;                              } else {                 echo "Erro ao tentar efetivar cadastro";             }         } else {                throw new PDOException("Erro: Não foi possível executar a declaração sql");         }     } } } catch (PDOException $erro) {         echo "Erro: " . $erro->getMessage();     }    
       
      Agora o código do checkbox:
       
             if ($stmt->execute()) {                 while ($rs = $stmt->fetch(PDO::FETCH_OBJ)) {                       echo "<tr>";                     echo "<td><input type='checkbox' name='check[]' id='check' value='".$rs->id_prod."'</td><td class='lista_usuario'>".$rs->nome_produto."</td><td class='lista_usuario'>".$rs->desc_prod."</td><td class='lista_usuario'>".$rs->peso_liq_prod                                ."</td>"                                ;                     echo "</tr>";                 }             }else {                 echo "Erro: Não foi possível recuperar os dados do banco de dados";             }     } catch (PDOException $erro) {         echo "Erro: ".$erro->getMessage();     }     echo "</form>"    
          ?>  
       
       
      Está cadastrando apenas 1 item e não múltiplos itens.
       
      abço!!
       
       
       
       
       
    • Por joaoluizbt
      Eu tenho um campo com vários itens separados por vírgula,

      Qtd
      UM
      Descrição
                     1,2                                 
                 caneta,papel          
      mas preciso que eles sejam exibidos no formulário um embaixo do outro.

      Qtd
      UM
      Descrição
           1 2                                 
      caneta
      papel          
      Existe alguma forma de fazer isso só com html?
       
      o meu código apenas aponta para o campo e a informação já vem assim separada com vírgula. Como alterar?
       
      <td style="width: 10.58%; padding: .75pt .75pt .75pt .75pt;" width="10%">
      <p class="MsoNormal">            {{db.field123}}           </p>
      </td>
       
    • Por lucassilvaeq
      Alguém poderia me ajudar com essa questão ?
       
      Implemente um algoritmo utilizando a linguagem C, que leia um numero indeterminado de valores inteiros. 
      O valor 0 (zero) finaliza a entrada de dados. Para cada valor lido, determinar se ele e um número par ou ímpar. 
      Se o numero for par, então incluí-lo na FILA PAR; caso contrario, incluí-lo na FILA ÍMPAR. 
      Apos o término da entrada de dados, retirar um elemento de cada fila alternadamente (iniciando-se pela FILA ÍMPAR) ate que ambas as filas estejam vazias. Se o elemento retirado de uma das filas for um valor positivo, entao incluí-lo em uma PILHA; caso contrario, remover um elemento da PILHA. 
      Finalmente, imprimir o conteúdo da pilha.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.