Ir para conteúdo
Entre para seguir isso  
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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
Entre para seguir isso  

  • Conteúdo Similar

    • Por cauai
      Olá,
      Eu estou tentando criar uma lista de vendedores que irão receber o contato de clientes através do meu site. É uma plataforma wordpress, porém tenho completo acesso ao código php.
      Até agora, só achei maneiras de enviar para múltiplos e-mails, como cópia, ou separando por departamento à escolha do cliente, utilizando o Contact Form 7, o que não é meu desejo.
      Quero algo como isso:
       
      Não sei se o Contact Form 7 me permitiria algo desse tipo, ou se teria mesmo que fazer pelo php. Mas aceito ajuda para ambos os casos.
    • Por rafael93728
      Gostaria de saber como posso remover apenas o canal "Verde", já tentei excluí-lo, porém as outras camadas se tornam amarelas e ciano.

    • Por matt.valenzza@gmail.com
      Preciso fazer uma lista duplamente encadeada para ela inserir os números, mostrando eles, localizar em qual posição eles estão e excluir. Eu fiz o código, mas preciso que os números mostrem o número atual, o anterior e o próximo. Que na hora de compilar, que ele mostre o numero anterior, o atual e o próximo em um pequeno menuzinho.
       
      Segue o código que eu criei até agora. 
       
       
       
       
      #include <stdio.h> struct Lista{ int num; struct Lista *prox; struct Lista *ant; }; struct Lista* criarNovoElemento(){ struct Lista *novo = NULL; novo = malloc(sizeof(struct Lista)); printf("Informe o numero..: "); scanf("%i", &(*novo).num); (*novo).prox = NULL; return novo; } inserir (struct Lista **a){ if (*a == NULL){ *a = criarNovoElemento(); } else{ struct Lista *aux; aux = *a; while( (*aux).prox != NULL){ aux = (*aux).prox; } (*aux).prox = criarNovoElemento(); } } mostrar(struct Lista **a){ if (*a == NULL){ printf("\n....Cadastro vazio....\n"); } else{ struct Lista *aux; aux = *a; while( aux != NULL){ printf("\nAtual..: %i", (*aux).num); aux = (*aux).prox; } } printf("\n"); system("pause"); } localizar (struct Lista **a){ if (*a == NULL){ printf("\n....Cadastro vazio....\n"); } else{ int num = 0; int achei = 0; int cont = 0; printf("Informe o numero: "); scanf("%i", &num); struct Lista *aux; aux = *a; while( aux != NULL && achei == 0){ cont += 1; if ((*aux).num == num){ achei = 1; } aux = (*aux).prox; } if (achei == 1){ printf("\n.....Achei na posicao: %i.....\n", cont); } else{ printf("\n.....Nao Achei....\n"); } } printf("\n"); system("pause"); } excluir(struct Lista **a){ if (*a== NULL){ // verificar se existe algum elemento na lista printf("\n....Cadastro vazio....\n"); } else{ struct Lista *aux =*a; a= (**a).prox; free(aux); } printf("\n"); system("pause"); } main (){ struct Lista *inicio = NULL; int opcao = 0; while(opcao != 9){ system ("cls"); printf("\n[1] Inserir Elemento"); printf("\n[2] Mostrar Elemento"); printf("\n[3] Localizar Elemento"); printf("\n[4] Excluir "); printf("\n[9] Finalizar"); printf("\nInforme a opcao: "); scanf("%i", &opcao); switch(opcao){ case 1 : inserir(&inicio); break; case 2 : mostrar(&inicio); break; case 3 : localizar(&inicio); break; case 4 : excluir(&inicio); break; case 9 : printf("Programa finalizado"); } } }  
    • Por freitaz
      Essa parte é da tela de Cadastro 
      <?php $executivo = new Executivo(); if ($_SERVER["REQUEST_METHOD"] == "GET") { //Using GET $titulo = $_GET['titulo']; $categoria = $_GET['categoria']; $file = $_GET['arquivo']; $action = $_GET['action']; } if (isset($_POST["exepublicar"])) { $titulo = $_POST['titulo']; $categoria = $_POST['categoria']; $action = $_POST['action']; $file = $_POST['filetext']; #Informações do Arquivo // Check if the form was submitted if ($_SERVER["REQUEST_METHOD"] == "POST") { // Check if file was uploaded without errors $filename = $_FILES["file"]["name"]; $filetype = $_FILES["file"]["type"]; $filesize = $_FILES["file"]["size"]; // Verify file extension $ext = pathinfo($filename, PATHINFO_EXTENSION); // Verify file size - 5MB maximum $maxsize = 5 * 1024 * 1024; if ($filesize > $maxsize) die("ERRO: Tamanho máximo de arquivo igual a 5MB."); // Check whether file exists before uploading it if (file_exists("uploads/executivo/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " já existe na pasta."; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/executivo/" . $_FILES["file"]["name"]); } } #fim do Arquivo print_r($fmsg); $executivo->setTitulo($titulo); $executivo->setCategoria($categoria); $executivo->setArquivo($filename); try { if ($action == "alterar") { if ($filename == "") { $executivo->setArquivo($file); } else { if (file_exists("uploads/executivo/" . $file)) { $path = 'uploads/executivo/' . $file; unlink($path); } } $executivo->update($executivo->getTitulo(), $executivo->getCategoria(), $executivo->getArquivo()); $texto = "Atualizado com sucesso"; } else { $executivo->insert($executivo->getTitulo(), $executivo->getCategoria(), $executivo->getArquivo()); $texto = "Inserido com sucesso"; } print_r($texto); } catch (PDOException $e) { echo 'ERRO: ' . $e->getMessage(); } } ?> a parte da classe 
       
      public function update($titulo, $categoria, $arquivo) { try { $sql = "UPDATE $this->table SET titulo = :titulo, categoria = :categoria, arquivo= :arquivo WHERE id = :id"; $stmt = DB::prepare($sql); $stmt->execute(array('id' => $id, 'titulo' => $titulo, 'categoria' => $categoria, 'arquivo' => $arquivo)); } catch (PDOException $e) { echo 'ERROR: ' . $e->getMessage(); } } Quando efetuo a alteração ele insere e não atualiza, 
      desde já agradeço a ajuda
    • Por Rafael Freitas
      Fala galera!
       
      Seguinte, estou precisando inserir o qr-code na exibição do PDF, porém, já tentei de varias formas e não tive sucesso. Ainda sou iniciante, então não tenho tantos recursos assim.
      Se alguém puder dar uma força, agradeço.
       
      Está funcionando da seguinte forma: eu uso o mpdf para exibir uma página php como um pdf e até aí tudo bem. Porém, eu preciso que no final da página, ele também exiba a imagem do qr-code com a url da página.
      Eu até tenho um código que já está fazendo isso, exibindo em qr-code o url. O que não estou conseguindo é fazer a inserção desse código no meu php (que abre como pdf).
       
      Segue o código:
      $html = "<fieldset> <div class='container1'> <div class='espaco_vazio'></div> <div class='logo'><h1><img src='logo.png' alt='Ambiental' /></h1></div> </div> <div class='numero_laudo'> </div> <div class='cabecalho'>MANIFESTO PARA TRANSPORTE DE RESÍDUO PERIGOSO CLASSE I, CONFORME NBR 10004/2004 - MRT Nº <strong>".$result['id']."</strong> </div> <div class='cabecalho-gerador'><strong>GERADOR</strong> </div> <div class='cabecalho2'> <div class='container_1_cabecalho'> <b>Razão Social:</b> ".$result['razao_social']."<br> <b>Nome Fantasia:</b> ".$result['nome_fantasia']."<br> <b>Endereço:</b> ".$result['endereco'].", ".$result['numero']."<br> <b>Cidade:</b> ".$result['cidade']."<br> </div> <div class='container_2_cabecalho'> <b>CNPJ:</b> ".$result['cnpj']."<br> <b>Cep:</b> ".$result['cep']."<br> <b>Bairro:</b> ".$result['bairro']."<br> <b>UF:</b> ".$result['uf']."<br> </div> </div> <div class='cabecalho-gerador'><strong>DESCRICÃO DO RESÍDUO (CLASSE I)</strong> </div> <table class='tabela1'> <tr> <td style='width:300px' height='25px' bgcolor='#B8E4BA'><center><b>DESCRIÇÃO (RESÍDUO)</b></center></td> <td style='width:80px' bgcolor='#B8E4BA'><center><b>CÓD. IBAMA</b></center></td> <td style='width:80px' bgcolor='#B8E4BA'><center><b>QUILO</b></center></td> <td style='width:80px' bgcolor='#B8E4BA'><center><b>LITRO</b></center></td> <td style='width:80px' bgcolor='#B8E4BA'><center><b>CÓD. ONU</b></center></td> <td style='width:80px' bgcolor='#B8E4BA'><center><b>Nº RISCO</b></center></td> </tr> <tr> <td style='padding-left:10' height='20px'>RESÍDUO OLEOSO DA CAIXA SEPARADORA</td> <td><center>130508</center></td> <td style= bgcolor='#E5E5E5'><center></center></td> <td><center>".$result['residuo_oleoso']."</center></td> <td><center>3082</center></td> <td><center>90</center></td> </tr> <tr> <td style='padding-left:10' height='20px'>FRASCOS, TRAPOS E FILTRO DE AR</td> <td><center>150110</center></td> <td><center>".$result['frasco_trapo']."</center></td> <td style= bgcolor='#E5E5E5'><center></center></td> <td><center>3175</center></td> <td><center>40</center></td> </tr> <tr> <td style='padding-left:10' height='20px'>FILTRO DE ÓLEO USADO</td> <td><center>160113</center></td> <td><center>".$result['filtro_de_oleo']."</center></td> <td style= bgcolor='#E5E5E5'></td> <td><center>3175</center></td> <td><center>40</center></td> </tr> </table> <div class='cabecalho-outros1'>OUTROS</div> <div class='cabecalho-outros3'></div><br> <div class='cabecalho-gerador3'><strong>TRANSPORTADOR</strong> </div> <div class='cabecalho2'> <div class='container_1_cabecalho'> <b>Razão Social:</b> HA SERVICOS DE RECICLAGEM EIRELI<br> <b>Nº Licença:</b> 053/2014 SEMURB<br> <b>Endereço:</b> ROD. BR 101 - KM08 1999<br> <b>Cidade:</b> PARNAMIRIM<br> </div> <div class='container_2_cabecalho'> <b>CNPJ:</b> 10.793.274/0001-39<br> <b>Cep:</b> 59.149-090<br> <b>Bairro:</b> EMAUS<br> <b>UF:</b> RN<br> </div> <div class='carros'> Veículo utilizado: MYR-7209 [&nbsp;".$result['c1']."&nbsp;] - MOO-0558 [&nbsp;".$result['c2']."&nbsp;] - QFH-3373 [&nbsp;".$result['c3']."&nbsp;] - QFY-3590 [&nbsp;".$result['c4']."&nbsp;] - QFH-3403 [&nbsp;".$result['c5']."&nbsp;] - QFL-3527 [&nbsp;".$result['c6']."&nbsp;]</div> <div class='condutor'><strong>Condutor:</strong> ".$result['condutor']."</div> <div class='carros2'><i>Obs: Para o transporte a classe é a 09 conforme determina a ONU</i></div> </div> <div class='cabecalho-gerador3'><strong>DESTINADOR FINAL</strong> </div> <div class='cabecalho2'> <div class='container_1_cabecalho'> <b>Razão Social:</b> GILDENOR B. CANUTO S. AMBIENTAIS - EIRELI<br> <b>Nº Licença:</b> 2018-118207/TEC/LO-0014<br> <b>Endereço:</b> SITIO RANCHO DA VELHA, 2010<br> <b>Cidade:</b> GOVERNADOR DIX SEPT ROSADO<br> </div> <div class='container_2_cabecalho'> <b>CNPJ:</b> 18.495.068/0001-54<br> <b>Cep:</b> 59.790-000<br> <b>Bairro:</b> ZONA RURAL<br> <b>UF:</b> RN<br> </div> </div> <br> <div class='qr'>Este Comprovante de Recolhimento de Resíduos deverá ter sua autenticidade comprovada no endereço eletrônico:<br> http://... ou pelo celular lendo o QRCODE abaixo:</div> ######################################### Código que exibe o QR $URL="http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; $tamanho="170"; //Define o tamanho da imagem em px $qrcode="http://chart.apis.google.com/chart?chs=$tamanhox$tamanho&cht=qr&chl=$URL"; $alt="Use um leitor de QR-Code para abrir esta página"; echo "<img src='$qrcode' alt='$alt' width='$tamanho px' height='$tamanho px' />"; </fieldset>";  
×

Informação importante

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