Pesquisar na Comunidade
Mostrando resultados para as tags ''encadeada''.
Encontrado 5 registros
-
Boa noite! Minha primeira pergunta no fórum, vamos lá: Preciso de uma ajuda para resolver este exercício, pois tento de tudo quanto é código e não imagino como resolve-lo: "Considerando listas de valores inteiros, implemente uma função que receba como parâmetro uma lista encadeada e um valor inteiro n e divida a lista em duas, de tal forma que a segunda lista comece no primeiro nó logo após a primeira ocorrência de n na lista original. Essa função deve obedecer ao protótipo: Lista*separa(Lista * l,int n); A função deve retornar um ponteiro para a segunda subdivisão da lista original, enquanto l deve continuar apontando para o primeiro elemento da primeira subdivisão da lista." Pfr me ajudem... pfr alguém...
-
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
-
Boa tarde pessoal. Estou com uma dúvida sobre como fazer ordenação QuickSort em uma lista duplamente encadeada, estamos fazendo lista genérica com template, o código é comílado com sucesso, mas creio que existe alguma verificação necessária ou na hora de trocar os valores está dando erro, ele copia alguns valores, por exemplo. Se eu incluir "a, b, c, d" ele ordena como "c, c, a, a"; Aqui a função quicksort da lista: Caso alguém possa me ajudar, ficarei grato. Valeu!
-
#include <stdio.h> #include <stdlib.h> FILE *arquivo; typedef struct { int cod; char nome[20]; struct codigo *prox; }codigo; codigo *inicio,*fim; void abrir() { codigo p; if((arquivo=fopen("teste.txt","rb"))==NULL) { arquivo=fopen("teste.txt","a+b"); p.cod=0; fwrite(&p,sizeof(codigo),1,arquivo); } else { arquivo=fopen("teste.txt","a+b"); } } void recebe (codigo *p) { abrir(); fseek(arquivo,-sizeof(codigo),SEEK_END); fread(p,sizeof(codigo),1,arquivo); p->cod++; fclose(arquivo); abrir(); printf("\n Digite nome:"); fflush(stdin); gets(p->nome); insere(&p); fwrite(p,sizeof(codigo),1,arquivo); fclose(arquivo); } void listavz() { codigo *aux; aux=(codigo*)malloc(sizeof(codigo)); inicio=aux; fim=inicio; } void insere(codigo p) { codigo *aux; aux=(codigo*)malloc(sizeof(codigo)); fim->prox=aux; fim=aux; aux->prox=NULL; } void imprime2() { codigo *aux; while(aux!=NULL) { printf("\n Codigo:",aux->cod); printf("\n Nome:",aux->nome); aux=aux->prox; } } void imprimir() { abrir(); codigo p; while(fread(&p,sizeof(codigo),1,arquivo)) { printf("\n Codigo:%d",p.cod); printf("\n Nome:%s",p.nome); } fclose(arquivo); } int main() { int op=0; do { recebe(); fflush(stdin); scanf("%d",&op); }while(op!=2); imprimir(); printf("\n imprime 2"); imprime2(); return 0; } Com esse codigo queria implementar uma lista encadeada e esta dando erro pf alguém me ajuda rapido
-
Olá pessoa, tudo bem? Nesse código, tenho duas estruturas: uma lista que armazena números e outra lista que aramazena palavras e tem a lista citada anteriormente. typedef struct ListLine{ int value; struct ListLine *next; } ll; typedef struct ListWord{ char* oWord; char* mWord; struct ListWord *nextWord; struct ListLine *lines; } lw; Acredito que na declaração da estrutura esteja correto. Agora, segue a função para acrescentar um valor na lista de um determinado nó: void insertLine(lw* node, int where){ ll *new=(ll*)malloc(sizeof(ll)); if (new==NULL){ puts("Erro de memoria"); exit(1); } new->value=where; new->next=NULL; if (node->lines==NULL) node->lines=new; else{ ll* aux=node->lines; while (aux->next!=NULL) aux=aux->next; aux->next=new; } } Meu problema é o seguinte: quando quero adicionar um determinado valor na primeira célula da lista, ele acaba adicionando o valor também os pŕoximos nós. Agora, para adicionar em alguma célula que não seja a primeira ele não adiciona. Vou colar todo o código aqui: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> void strlwr(char* str) { size_t i; size_t len = strlen(str); for (i = 0; i < len; i++) str[i] = tolower((unsigned char) str[i]); } typedef struct ListLine{ int value; struct ListLine *next; } ll; typedef struct ListWord{ char* oWord; char* mWord; struct ListWord *nextWord; struct ListLine *lines; } lw; lw* listaWord = NULL; ll* insertLine(ll* node, int where){ ll *new=(ll*)malloc(sizeof(ll)); if (new==NULL){ puts("Erro de memoria"); exit(1); } new->value=where; new->next=NULL; if (node==NULL) node=new; else{ ll* aux=node; while (aux->next!=NULL) aux=aux->next; aux->next=new; } return node; } lw* searchWordList (char *palavra){ lw*n=listaWord; for (;n!=NULL;n=n->nextWord) if (strcmp(n->mWord,palavra)==0) break; return n; } void insertWordList (char *palavraOrig, char *palavra){ if (searchWordList(palavra)==NULL){ lw* new = (lw*)malloc(sizeof(lw)); new->oWord=(char*)malloc(strlen(palavra)+1); new->mWord=(char*)malloc(strlen(palavra)+1); if (new == NULL || new->oWord==NULL || new->mWord==NULL){ puts("Erro de memoria!"); exit(1); } strcpy(new->oWord,palavraOrig); strcpy(new->mWord,palavra); new->lines = NULL; lw*ant=NULL; lw*p=listaWord; while (p!=NULL){ ant=p; p=p->nextWord; } if (ant==NULL){ new->nextWord=listaWord; listaWord=new; } else { new->nextWord=ant->nextWord; ant->nextWord=new; } } } void printIndice(){ lw* q; for (q=listaWord;q!=NULL;q=q->nextWord){ printf("%s ",q->oWord); ll *r; for (r=listaWord->lines;r!=NULL;r=r->next) printf("%d ",r->value); puts(""); } } int main(int argc, char **argv) { int ch, i=0;//, cont=0, linha=1; char *word_dic=(char*)malloc(sizeof(char)); char *word_dic_orig=(char*)malloc(sizeof(char)); // OPEN DICTIONARY // FILE *dictionary; dictionary = fopen("dicionario.txt", "r"); if (dictionary == NULL) { printf("Erro, não foi possivel abrir o arquivo\n"); return 0; } while ((ch=fgetc(dictionary))!=EOF){ if ( (ch>=65 && ch<=90) || (ch>=97 && ch<=122)){ word_dic[i]=ch; i++; } else { strcpy(word_dic_orig,word_dic); strlwr(word_dic); insertWordList(word_dic_orig,word_dic); word_dic=(char*)calloc(0,sizeof(char)); i=0; } } fclose(dictionary); lw* q=searchWordList("a"); q->lines=insertLine(q->lines,1); q->lines=insertLine(q->lines,2); printIndice(); return 0; }