Ir ao conteúdo
  • Cadastre-se

Ian Varejao

Membro Júnior
  • Posts

    17
  • Cadastrado em

  • Última visita

Reputação

1
  1. Não apenas isso, também há problema no scanf. Quando você quer mudar o conteúdo da variável em outra função você precisa passar o endereço dela. Se não você estará passando apenas uma cópia do conteúdo, que pertencerá a outro endereço de memoria usado apenas pela função que foi chamada. A função scanf altera o counteudo da variável com o valor lido pelo input, portanto ela necessita que seja passado o endereço da variável. tente assim: scanf("%d", endereço_da_variavel); Para obter o endereço de uma variável utilize o operador &, assim: &variável=endereço.
  2. Ok, depois de tanto tempo, o código já está muito melhor, porém continuo com a dúvida de o que colocar no arvore.h e o que colocar no fila.h. O grande problema é que no arvore.h há funcoes de arvore que usam a estrutura de fila,e por isso o arvore.h deve conhecer a estrutura de fila, e a mesma coisa acontece para o fila.h, que usa a estrutura de arvores. o que fazer quando dois header files possuem dependencia mutua?O unico jeito é juntar tudo num unico header file? ps.: Desculpa ressucitar um topico antigo, mas tenho coisa a acrescentar e ainda tenho duvida. arvore.h: /**********************************Arvore Binaria de Busca com Fila**versao Recursiva **arvore.h HEADER FILE **********************************///Estrutura de Dados typedef struct arvore { int elem; int N; struct arvore *esq,*dir; }arvore; typedef struct fila { arvore* node; struct fila *prox; }fila;//Prototipos//Arvore //Funcoes essenciais arvore* Cria(int); void Destroi(arvore**); //Funcoes de Insercao void Insere(arvore **,int); void Preenche(arvore **,int,int); //Funcoes de Remocao void Remove(arvore **,int); //Funcoes de Percurso void PreOrdem(arvore*); void EmNiveis(arvore*,fila**); void fEmNiveis(FILE*,arvore*,fila**); //Funcoes de Busca int Existe(arvore*,int); int Menor(arvore*); //Outras Funcoes void setN(arvore*);//Fila //Essenciais fila* CriaFila(arvore*); void DestroiFila(fila**); //Insercao void Enfileira(fila**,arvore*); //Remocao arvore* Desenfileira(fila**); void ImprimeFila(fila*); fila.h: /**************************FILA PARA USO EM ARVORES**HEADER FILE **************************///Estrutura de Dados typedef struct fila { arvore* node; struct fila *prox; }fila;//Prototipos das Funcoes //Essenciais fila* CriaFila(arvore*); void DestroiFila(fila**); //Insercao void Enfileira(fila**,arvore*); //Remocao arvore* Desenfileira(fila**); arvore.c: /*************************Arvore Binaria de Busca**versao Recursiva **arvore.c SOURCE FILE *************************///Headers#include <stdio.h>#include <stdlib.h>#include "arvore.h"//Funcoes essenciaisarvore* Cria(int x){ arvore *novo=(arvore*) malloc(sizeof(arvore)); novo->elem=x; novo->N=1; novo->esq=novo->dir=NULL;}void Destroi(arvore **p){ if(*p != NULL) { Destroi(&(*p)->esq); Destroi(&(*p)->dir); (*p)->esq=(*p)->dir=NULL; free(*p); }}//Funcoes de Insercaovoid Insere(arvore **A,int x){ arvore *p=(*A); if(p!=NULL) { if(p->elem > x) Insere(&p->esq,x); else if(p->elem < x) Insere(&p->dir,x); else printf("Elemento já existente!\n"); } else { p=Cria(x); (*A)=p; }}void Preenche(arvore **A,int x,int y){ if(x<y) { int meio= (x+y)/2; Insere(A,meio); Preenche(&(*A)->esq,x,meio); Preenche(&(*A)->dir,meio+1,y); }}//Funcoes de Remoçaovoid Remove(arvore **A,int x){ arvore *p=(*A); if(p!=NULL) { if(p->elem != x) { if(p->elem > x) Remove(&p->esq,x); else Remove(&p->dir,x); } else { if(p->esq == p->dir) { (*A)=NULL; free(p); } else if(p->esq == NULL) { (*A)=p->dir; free(p); } else if(p->dir == NULL) { (*A)=p->esq; free(p); } else { int y=Menor(p->dir); Remove(&p->dir,y); p->elem=y; } } }} //Funcoes de Percursovoid PreOrdem(arvore *p){ if(p!=NULL) { printf("Elemento: %d \tTamanho: %d\n",p->elem,p->N); PreOrdem(p->esq); PreOrdem(p->dir); }}void EmNiveis(arvore *p,fila **F){ if(p!=NULL) { if(*F==NULL) Enfileira(F,NULL); Enfileira(F,p->esq); Enfileira(F,p->dir); printf("%d ",p->elem); p=Desenfileira(F); if(p==NULL && *F!=NULL) { printf("\n"); p=Desenfileira(F); Enfileira(F,NULL); } EmNiveis(p,F); }}void fEmNiveis(FILE *fp,arvore *p,fila **F){ if(p!=NULL) { if(*F==NULL) Enfileira(F,NULL); Enfileira(F,p->esq); Enfileira(F,p->dir); fprintf(fp,"%d ",p->elem); p=Desenfileira(F); if(p==NULL && *F!=NULL) { fprintf(fp,"\n"); p=Desenfileira(F); Enfileira(F,NULL); } fEmNiveis(fp,p,F); }} //Funcoes de Buscaint Existe(arvore *p,int x){ if(p!=NULL) { int y=p->elem; if(y!=x) { if(y > x) Existe(p->esq,x); else Existe(p->dir,x); } else return 1; } else return 0;}int Menor(arvore *p){ if(p!=NULL) { if(p->esq!=NULL) Menor(p->esq); else return p->elem; }}//Outras Funcoesvoid setN(arvore *p){ if(p!=NULL) { if(p->esq != NULL) { setN(p->esq); p->N+=p->esq->N; } if(p->dir != NULL) { setN(p->dir); p->N+=p->dir->N; } }} fila.c: /**************************FILA PARA USO EM ARVORES**SOURCE FILE **************************///Header Files#include <stdio.h>#include <stdlib.h>#include "arvore.h"//Funcoes Essenciaisfila* CriaFila(arvore *A){ fila *novo= (fila*) malloc(sizeof(fila)); novo->prox=NULL; novo->node=A;}void DestroiFila(fila **F){ if(*F!=NULL) { DestroiFila(&(*F)->prox); free(*F); (*F)=NULL; }}//Funcoes de Insercaovoid Enfileira(fila **F,arvore *A){ if(*F!=NULL) { fila *novo=CriaFila(A); novo->prox=(*F); (*F)=novo; } else (*F)=CriaFila(A);}//Funcoes de Remocaoarvore* Desenfileira(fila **F){ if(*F!=NULL) { if((*F)->prox!=NULL) Desenfileira(&(*F)->prox); else { arvore *A=(*F)->node; free(*F); (*F)=NULL; return A; } }}//Funcoes de Percursovoid ImprimeFila(fila *F){ if(F!=NULL) { if(F->node != NULL) printf("%d ",F->node->elem); ImprimeFila(F->prox); } else printf("\n");}
  3. Minha funcao Preenche(arvore **A,int x,int y) insere os elementos de x a y de forma balanceada na arvore.O problema é que o ultimo elemento, y, não está sendo inserido. A funcao deve ser alterada de forma que este elemento passe a ser inserido mas sem mudar suas propriedades: .A funcao deve ser recursiva .A funcao nao pode ter argumentos contadores ou argumentos flags .A funcao nao pode usar variaveis static .A funcao nao pode repetir subproblemas (nao pode inserir o mesmo elemento mais de uma vez) Se alguem tiver alguma ideia responda o post. código do Preenche(): void Preenche(arvore **A,int x,int y){ if(x<y) { int meio= (x+y)/2; Insere(A,meio); Preenche(&(*A)->esq,x,meio); Preenche(&(*A)->dir,meio+1,y); }} Código completo do programa: //Arvore Binaria de Busca (Recursiva)//Headers#include <stdio.h>#include <stdlib.h>//Estrutura de Dadostypedef struct arvore{ int elem; int N; struct arvore *esq,*dir;}arvore;//Prototipos //Funcoes essenciais arvore* Cria(int); void Destroi(arvore**); //Funcoes de Insercao void Insere(arvore **,int); void Preenche(arvore **,int,int); //Funcoes de Remocao void Remove(arvore **,int); //Funcoes de Percurso void PreOrdem(arvore*); //Funcoes de Busca int Existe(arvore*,int); int Menor(arvore*); //Outras Funcoes void setN(arvore*);//Funcoes essenciaisarvore* Cria(int x){ arvore *novo=(arvore*) malloc(sizeof(arvore)); novo->elem=x; novo->N=1; novo->esq=novo->dir=NULL;}void Destroi(arvore **p){ if(*p != NULL) { Destroi(&(*p)->esq); Destroi(&(*p)->dir); (*p)->esq=(*p)->dir=NULL; free(*p); }}//Funcoes de Insercaovoid Insere(arvore **A,int x){ arvore *p=(*A); if(p!=NULL) { if(p->elem > x) Insere(&p->esq,x); else if(p->elem < x) Insere(&p->dir,x); else printf("Elemento já existente!\n"); } else { p=Cria(x); (*A)=p; }}void Preenche(arvore **A,int x,int y){ if(x<y) { int meio= (x+y)/2; Insere(A,meio); Preenche(&(*A)->esq,x,meio); Preenche(&(*A)->dir,meio+1,y); }}//Funcoes de Remoçaovoid Remove(arvore **A,int x){ arvore *p=(*A); if(p!=NULL) { if(p->elem != x) { if(p->elem > x) Remove(&p->esq,x); else Remove(&p->dir,x); } else { if(p->esq == p->dir) { (*A)=NULL; free(p); } else if(p->esq == NULL) { (*A)=p->dir; free(p); } else if(p->dir == NULL) { (*A)=p->esq; free(p); } else { int y=Menor(p->dir); Remove(&p->dir,y); p->elem=y; } } }} //Funcoes de Percursovoid PreOrdem(arvore *p){ if(p!=NULL) { printf("Elemento: %d \tTamanho: %d\n",p->elem,p->N); PreOrdem(p->esq); PreOrdem(p->dir); }}//Funcoes de Buscaint Existe(arvore *p,int x){ if(p!=NULL) { int y=p->elem; if(y!=x) { if(y > x) Existe(p->esq,x); else Existe(p->dir,x); } else return 1; } else return 0;}int Menor(arvore *p){ if(p!=NULL) { if(p->esq!=NULL) Menor(p->esq); else return p->elem; }}//Outras Funcoesvoid setN(arvore *p){ if(p!=NULL) { if(p->esq != NULL) { setN(p->esq); p->N+=p->esq->N; } if(p->dir != NULL) { setN(p->dir); p->N+=p->dir->N; } }} //Funcao Principalint main(){ arvore *A=NULL; Preenche(&A,1,8); setN(A); PreOrdem(A); Destroi(&A); return 0;}
  4. voce está usando a biblioteca math? se sim, algumas versões do gcc precisam de -lm para incluir a biblioteca. gcc prog.c -lm (inclui a libmath)
  5. Ian Varejao

    Ajuda com Vetores

    Observe que como vetor deve ter no mínimo Tamanho(vetor1) + Tamanho(vetor2) na hora que é criado, ou você estará acessando memoria que não devia acessar. Só usar int vetor[8] e não terá erro. O valor de N é alterado na função através de seu apontador, portando passe o endereço de N (&N) como argumento. exemplo: Insere(vetor3,vetor1,0,&N); void Insere(int *vetor,int x,int pos,int *N) { if(pos<(*N))//Enquanto não tiver percorrido todo o vetor { if(vetor[pos]!=x) Insere(vetor,x,pos+1,N);//Verifique se encontrou x } //Se encontrou, não faça nada(sem repetição) else//Varreu todo o vetor e não encontrou x? { vetor=x;//Insere o x na ultima posição do vetor (*N)++;//E aumenta o tamanho N do vetor } } ​ ​ ​
  6. Mesa é uma subsequencia da string Papel, Mesa, Cadeira. Para descobrir isso, você pode usar bibliotecas já prontas, ou pode criar uma função que faz isso: Busque pela letra M -se encontrar, teste o próximo caractere ('e') -se o próximo caractere for e -teste o próximo - e assim por diante até ter testado todos caracteres de "Mesa" -se não -Busque pela próxima letra M na sequencia -se encontrar -... -continue ate encontrar "Mesa" ou ate chegar ao final da string "Papel, Mesa, Cadeira" Não é tão difícil, já fiz em um trabalho, mas não o tenho mais.
  7. gets() serve para ler string. Em C uma string é uma cadeia de caracteres terminada por '\0'.OU SEJA, 'a' é char e "a\0" não é char. getchar() le um único caractere, e retorna o caractere lido. ou seja char c; c=getchar(); vai ler um caracter e atribui-lo à variável c. scanf("%c",&c); também pode ser usado para ler um caractere e atribui-lo a variável c. note, porém, que '\n' (new line ou ENTER) é um caractere, e portanto será lido, então faça o tratamento correto da leitura. char c;int LINHAS,COLUNAS,i,j;printf("digite o numero de linhas e de colunas: ");scanf("%d %d",LINHAS,COLUNAS);//Cria a matrizchar MATRIZ[LINHAS][COLUNAS];for(i=0;i<LINHAS;i++)//note que começa do 0 e não do 1.{ for(j=0;j<COLUNAS;j++) { while((c=getchar())=='\n');//vai procurar por um caractere diferente de \n ate achar MATRIZ[i][j]=c; }}
  8. Melhorou, mais ainda não está 100%. voce declarou duas variaveis (s e n) do tipo char, mas não as usa em nenhum momento. Observe também que voce nao as inicializa ( nao atribui nada a elas ) então elas ficam com "lixo de memoria". O código está correto, mas veja se é isso que voce pensou: char s='s',n='n',estado;if(estado == s)if(estado == n) Neste caso, voce estaria comparando duas variáveis do tipo char. É muito bom que você desde cedo já comenta seu código, continue com essa boa prática, mas lembre-se também de endentar o código.
  9. Acho que ele quis forçar a usar alocaçao estatica, que é até mais fácil, basta saber o tamanho da matriz ( que o usuario vai inserir como entrada) no momento de declarar a matriz.Então, nao se preocupe com isso de nao poder usar stdlib.h. Para percorrer uma matriz voce pode usar dois for(): int i,j; for(i=0; i<Numero_de_linhas; i++) { printf("linha %d:",i); for(j=0;j< Numero_de_Colunas; j++) printf(" %d",M[j]); printf("\n"); } Alguns compiladores (g++ e versões atualizadas do gcc) permitem declarar a variavel dentro do for: for(int i=0;i<10;i++); Me diga exatamente onde você não está conseguindo para eu ajudar mais facilmente.Nao posso dar a resposta, voce tem que conseguir por si mesmo.
  10. Qual é a forma mais rápida de se executar operação de troca de variáveis? 1.Usando uma variavel auxiliar. 2.Usando multiplos XOR ( operador ^ em C) 3.Usando a stack com comandos in line Assembly ( só funciona para variaveis Globais) 4.Usando a stack em Assembly puro, e juntando a função ao código em C na compilação.
  11. Ian Varejao

    Onde aprender C

    Um livro que me ajudou muito foi Linguagem C, do Luís Damas, é bem didatico e vem com exercicios, alguns resolvidos, outros para treinar.Para realmente aprender C só treinando bastante e fuçando em tudo que a linguagem tem a oferecer por pura curiosidade. Um site bom que sempre uso quando esqueço algo ou vejo algo que não conhecia ainda, é o cplusplus.com, é otimo para rever informações muito especificas como o tipo de retorno de uma função. Um forum bom para tirar ocasionais duvidas, creio que você já conheça algum.
  12. Sim, o professor mostrou na aula essa versao com ponteiro para ponteiro no lugar de ficar comparando toda hora se é maior ou menor. Eu vou tentar desse seu jeito, porque do jeito que eu fiz o codigo funciona como esperado porém na compilaçao aparece aviso: e um erro estranho que nao faz o menor sentido.
  13. Não, eu me refro ao percurso em niveis, onde voce percorre nivel por nivel, e visita os elementos na ordem em que aparecem no nivel, da esquerda pra direita. Exemplo: A B C D E F G H I J K L M N O P ... onde eu uso o No NULL para indicar que devo inserir '\n'.
  14. Uma arvore binaria de busca, que usa fila para executar o percurso em niveis.
  15. Tenho 1 arquivo.c Quero separar ele em 3 codigos fontes: 1 com a main 1 com a Arvore 1 com a Fila #include <stdio.h>#include <stdlib.h>typedef struct NoA{ int elem; struct NoA *esq,*dir,*pai;}NoA;typedef struct Arvore{ int N,H; NoA *raiz;}Arvore;typedef struct NoF{ NoA* elem; struct NoF *prox,*ant;}NoF;typedef struct Fila{ int Tamanho; NoF *primeiro,*ultimo;}Fila;void ConstroiA(Arvore *);void DestroiA(Arvore *,NoA *);NoA* Busca(Arvore *,int );NoA* BuscaMenor(NoA *);void Insere(Arvore *,int);void Remove(Arvore *,int);void Enumera(Arvore *);void ConstroiF(Fila *);void DestroiF(Fila *);void Enfileira(Fila *, NoA *);NoA* Desenfileira(Fila *);//MAINint main(){ printf("Testando a Arvore!\n"); Arvore A; ConstroiA(&A); int i,N=3000; Insere(&A,22); for(i=1;i<=N;i++) Insere(&A,i%2?i*2:i*3); Enumera(&A); for(i=1;i<=N;i++) Remove(&A,i%2?i*2:i*3); for(i=1;i<N;i++) Insere(&A,i%2?i*2:i*3); DestroiA(&A,A.raiz); return 0;}//Funcoesvoid ConstroiA(Arvore *A){ A->N=A->H=0; A->raiz=NULL;}void DestroiA(Arvore *A,NoA *{ if(B!=NULL){ DestroiA(A,B->esq); DestroiA(A,B->dir); free(;}}NoA* Busca(Arvore *A,int x){ NoA *pai,*prox=A->raiz; if(prox == NULL){ printf("A arvore está vazia!\n"); return NULL;} while(prox->elem != x){ pai=prox; if(x > prox->elem) prox=prox->dir; else prox=prox->esq; if(prox == NULL) return pai;} return prox;}NoA* BuscaMenor(NoA *A){ while(A->esq!=NULL) A=A->esq; return A;}void Insere(Arvore *A,int x){ NoA *novo,*pai; novo=(NoA *) malloc(sizeof(NoA)); novo->elem=x; novo->esq=NULL; novo->dir=NULL; if(A->raiz == NULL){ A->raiz=novo; novo->pai=NULL; return;} pai=Busca(A,x); if(x > pai->elem) pai->dir=novo; else if(x < pai->elem) pai->esq=novo; else{ printf("%d ja esta na Arvore!\n",x); return;} novo->pai=pai; A->N++;}void Remove(Arvore *A,int x){ //printf("%d\n",x); NoA *r,*pai; int f,isroot=0; r=Busca(A,x); if(r==NULL || r->elem != x) return; if(r->pai!=NULL){ pai=r->pai; f=x>pai->elem;} else isroot=1; if(r->esq == NULL && r->dir == NULL){//r nao tem filhos if(isroot) A->raiz=NULL; else if(f) pai->dir=NULL; else{ pai->esq=NULL;} free(r);} else if(r->esq == NULL){//r tem 1 filho(dir) if(isroot){ A->raiz=r->dir; r->dir->pai=NULL;} else{ if(f){ pai->dir=r->dir; r->dir->pai=pai;} else{ pai->esq=r->dir; r->dir->pai=pai;} free(r);}} else if (r->dir == NULL){//r tem 1 filho(esq) if(isroot){ A->raiz=r->esq; r->esq->pai=NULL;} else if(f){ pai->dir=r->esq; r->esq->pai=pai->dir;} else{ pai->esq=r->esq; r->esq->pai=r->dir;} free(r);} else{//r tem 2 filhos(esq e dir) pai=BuscaMenor(r->dir);//Busca pelo menor elemento na subarvore a direita de r f=pai->elem;//coloca o elemento encontrado em f Remove(A,f);//Remove f r->elem=f;//Troca f pelo elemento em r, desse jeito a arvore mantem sua logica return;} A->N--;}//Enumera Em Niveisvoid Enumera(Arvore *A){ printf("Imprimindo Arvore em \"ArvoreSaida.txt\"!\n"); FILE *fp=fopen("ArvoreSaida.txt","w"); NoA *prox=A->raiz; Fila F; int i=1; NoA *node=(NoA *) malloc(sizeof(NoA)); node->elem=0; node->esq=node->dir=NULL; ConstroiF(&F); Enfileira(&F,prox); Enfileira(&F,NULL); fprintf(fp,"nivel %d: ",i++); while(F.Tamanho){ prox=Desenfileira(&F); if(prox==NULL){ if(F.primeiro->elem==F.primeiro->ant->elem) if(!F.Tamanho) break; fprintf(fp,"\nnivel %d: ",i++); Enfileira(&F,NULL);} else{ if(!prox->elem) fprintf(fp,"X "); else{ fprintf(fp,"%d ",prox->elem); if(prox->esq!=NULL) Enfileira(&F,prox->esq); else Enfileira(&F,node); if(prox->dir!=NULL) Enfileira(&F,prox->dir); else Enfileira(&F,node);}}} free(node); fflush(fp); fclose(fp);}//Fila //Constroi void ConstroiF(Fila *F){ F->Tamanho=0; F->primeiro=F->ultimo=NULL;} //Destroi void DestroiF(Fila *F){ while(F->Tamanho--) Desenfileira(F);} //Enfileira void Enfileira(Fila *F,NoA* x){ NoF *novo; novo=(NoF *) malloc(sizeof(NoF)); novo->elem=x; novo->ant=novo; novo->prox=F->ultimo; if(F->Tamanho){ F->ultimo->ant=novo; F->ultimo=novo;} else{ F->ultimo=novo; F->primeiro=novo;} F->Tamanho++;} //Desenfileira NoA* Desenfileira(Fila *F){ NoF *p; NoA *x; p=F->primeiro; F->primeiro=p->ant; x=p->elem; free(p); F->Tamanho--; return x;}

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...