Ir ao conteúdo
  • Cadastre-se

UmPrograma

Membro Pleno
  • Posts

    182
  • Cadastrado em

  • Última visita

Tudo que UmPrograma postou

  1. To numa duvida cruel se a funcao adiciona é assim mesmo. Pois sao tres parametros que eu passo, mas so utilizo dois. adicionado 47 minutos depois No *CriaNovo(){ No *aux; aux = malloc(sizeof(No)); return aux; } Acho que o cria no deve ser assim
  2. Boa tarde, pessoal. Como estão? (espero que bem) Estava eu a resolver um exercício de programação e me deparei com uma dificuldade enorme para criar uma função remove. Muito se dar pois nao sei o que devo remover primeiro, esquerda, direita, meio. Ou ate mesmo se removo os no. Fora que ela tem que remover o numero desejado pelo usuario. E ainda estou com uma dificuldade na função principal. #include <stdio.h> #include <stdlib.h> typedef struct _no23 { int lkey, // chave esquerda rkey, // chave direita nkeys; // n�mero de chaves struct _no23 *left, // ponteiro ao filho esquerdo *center, // ponteiro ao filho central *right; // ponteiro ao filho direito } no23; no23 *criaNo(int ch1, int ch2, int nchaves, no23 *pl, no23 *pc, no23 *pr){ no23 *n; typedef struct n{ int ch1, ch2, nchaves; struct n *p1, *pc, *pr; } no2; return n; } void adicionaChave(no23 *no, int ch, no23 *p){ /// EU QUE FIZ no->lkey = ch; } no23 **isLeaf(no23 *no){ /// EU QUE FIZ no->nkeys = 0; return 0; } no23 *quebraNo(no23 *no, int val, int *rval, no23 *subarvore){ no23 *paux; if (val > no->rkey) { // val esta mais a direita *rval = no->rkey; // promove a antiga maior paux = no->right; no->right = NULL; // elimina o terceiro filho no->nkeys = 1; // atualiza o número de chaves return criaNo(val, 0, 1, paux, subarvore, NULL); } else if (val >= no->lkey){ // val esta no meio *rval = val; // continua sendo promovido paux = no->right; no->right = NULL; no->nkeys = 1; return criaNo(no->rkey, 0, 1, subarvore, paux, NULL); } else { // val esta a mais a esquerda *rval = no->lkey; // primeiro cria o nó a direita paux = criaNo(no->rkey, 0, 1, no->center, no->right, NULL); no->lkey = val; // em seguida arruma o nó a esquerda no->nkeys = 1; no->right = NULL; no->center = subarvore; return paux; } } no23 *find(no23 *raiz, int key) { if (raiz==NULL) return NULL; // n�o encontrou if (key == raiz->lkey) return raiz; // � a chave esquerda if ((raiz->nkeys == 2) && (key == raiz->rkey)) return raiz; // � a chave direita if (key < raiz->lkey) return find(raiz->left, key); else if (raiz->nkeys == 1) return find(raiz->center, key); else if (key < raiz->rkey) return find(raiz->center, key); else return find(raiz->right, key); } /* // cria um nó com ch1, ch2 e nchaves, assim como os três ponteiros no23 *criaNo(int ch1, int ch2, int nchaves, no23 *pl, no23 *pc, no23 *pr); // verifica se o nó em questão é folha, volta 1 se sim, e 0 caso contrario int isLeaf(no23 *no); // coloca uma nova chave ch e arvore p, em um nó com apenas uma chave void adicionaChave(no23 *no, int ch, no23 *p); // Quebra um nó em dois, sendo val e subarvore, os novos dados no23 *quebraNo(no23 *no, int val, int *rval, no23 *subarvore); */ // insere val em no (se necessario retorna o novo no e um valor // rval) no23 *insere( no23 **no, int val, int *rval){ no23 *paux, *paux2; int vaux, promov; if (*no == NULL) { // arvore vazia *no = (no23 *) malloc (sizeof(no23)); *no = criaNo(val, 0, 0, NULL, NULL, NULL); // cria no folha com um valor return NULL; // nada a fazer depois } if (isLeaf(*no)){ // chegou a folha if ((*no)->nkeys == 1){ // caso fácil adicionaChave(*no, val, NULL); return NULL; } else { paux = quebraNo(*no, val, &vaux, NULL); *rval = vaux; return paux; } } else { // continua a procura if (val < (*no)->lkey) paux = insere( &((*no)->left), val, &vaux); else if (((*no)->nkeys == 1) || (val < (*no)->rkey)) paux = insere( &((*no)->center), val, &vaux); else paux = insere( &((*no)->right), val, &vaux); if (paux == NULL) // nao promoveu return NULL; else if ((*no)->nkeys == 1){ adicionaChave(*no, vaux, paux); return NULL; } else { paux2 = quebraNo(*no, vaux, &promov, paux); *rval = promov; return paux2; } } } int main(){ no23 ** aux; }
  3. Tem um livro que aborda um pouco disso. Vou deixar a referência dele ZIVIANI, Nivio. Projeto de Algoritmos: com implementações em Pascal e C. 3. ed. São Paulo: Cengage Learning, 2013. 639 p.
  4. Boa noite, pessoal. Como vão? Então, estou a realizar um trabalho sobre Árvore 2-3, para a matéria de estrutura de dados. O problema é que não encontro muitos materiais sobre esse tipo de árvore, nem livros. Somente achei um livro na biblioteca e ainda sim é meio vago. Gostaria de saber se algum de vocês tem material sobre o conteúdo que possa compartilhar. Link de site ou mesmo um livro que possa ser baixado, capítulos e afins. Desde de já, agradecido!
  5. @Flávio Pedroza Valeu.. Eu estava tentando fazer isso com strings, mas acho que não funcionou direito. Brigadão.....
  6. Boa tarde, como vão? Estava aqui estudando ordenação, aí vendo insertion sort me questionei se não era isso que já fazia. Insertio sort vai organizar um vetor na ordem desejada fazendo uma comparação do primeiro com o posterior, certo? E nas aulas de estrutura tinha o seguinte algoritmo como exemplo de insertion sort typedef int key; struct item{ key chave; }; typedef struct item Item; #define troca(A, B) {Item c = A; A = B; B = c; } // NAO ENTENDI ESSA PARTE, nem sabia que dava para fazer um programa com isso void selection(Item *v, int n){ int i, j, min; for(i = 0; i < n - 1; i++) { min = i; for(j = i + 1 ; j < n; j++) { if(v[j].chave < v[min].chave) min = j; } troca(v[i], v[min]); } } Antes eu faria o mesmo codigo, mais de uma forma mais simples e direta. Segue como seria o meu codigo. void ordenar(int vet[10]){ int i,j, aux; for(i=0;i<10;i++){ for(j=i;j<10;j++){ if(vet[i]>vet[j]){ aux=vet[i]; vet[i]=vet[j]; vet[j]=aux; } } } } Esse meu codigo é insertion sort ou para ser precisa ser com struct??? (aliás, nem sei a diferença das ordenações [estudei so essa por enquanto], mas parece que se muda uma coisinha já leva outro nome). Me parece que tem alguma coisa de swap, numero de swap.
  7. @Plástico Bolha Olá, bom dia! Outra duvida minha é em relação ao printf e ao scanf.... Eles tem algum custo. Acho que sim né O scanf atribui um valor a variavel. Na imagem anexada, apresento um algoritmo de soma de vetores. Nele sei que o custo do for é 2(n+1) . (vi em um video) Ai tenho dois for, logo ao final seria 4n + 2 , mais ainda os valores que que sao constantes (aqueles que so tem custo 1) Mas, diante do seu exposto me parece ser desnecessario realmente falar das constantes. Mas ainda em relação a soma de vetores, olhe se estou enganado. Daria ao total 4n + 9. Desconsiderei os printf, pois não sei do seu custo ao certo.
  8. Quando declaramos variáveis existe um custo para o programa? Seria um custo constante? Complexidade constante, O(1)?
  9. @Henrique - RJ Faço faculdade em Sistemas... Mas ela é meio vaga e genérica. Muito se aprende fora da faculdade. E é isso que quero fazer. Você fala de dados pessoais meus na maquina virtual? Quase não entro nela....
  10. Boa tarde, como vão? Pois bem, meus amigos, estava pensando em mudar de sistema operacional. Uso o windows e estou querendo migrar para o Linux, sendo que já o uso como subsistema do meu computador e ainda tenho uma maquina virtual. Mas como não é o sistema principal acabo que nem mexo muito nele. Queria saber o que acham sobre o Kali Linux, pois tenho interesse em pentest e computação forense. E não, não penso nesse sistema por conta da série, vim descobrir dela recentemente. Tem o Ubuntu também, mas não sei. Utilizo o windows 10 original. O que opinam?
  11. Boa tarde. Estava aqui pensando sobre a importancia da eficiencia do codigo no programa e tal. Ai analisando um programa de soma de vetores, percebi que sempre, valor assintotico, é O(n). Sempre em funcao do numero de entradas. Sendo essa o numero de operacoes, e as demais classes assintoticas ficariam desconsideras. Como somar e multiplicar constante, O(1). Minha dúvida é se nesse programa, que é ainda do vetor. (O que peguei para analisar) Soma de vetores para I de 1 até N faça S ← X + Y Fim para Número de passos = número de somas (N) Me parece que nao existe pior, medio e melhor caso nesse programa, sendo tudo em funcao do numero de entradas. É isso mesmo?
  12. Pessoal, há algum problema em ter o linux no windows, por meio de subsistema? Recomenda o que? Maquina virtual, dualboot ou esse subsistema?
  13. Acho que me expressei errado. É que teve um ponto que parecia que queria mais números de postes do que ....enfim Sou muito grato a sua ajuda. Fica com Deus, amigo.
  14. @AnsiC Se você sabia que recursividade não daria certo, porque não falou logo. Perdi o maior tempo tentando arrumar/adequar a recursividade no exercício. (Aliás, você poderia ser mais direto às vezes. Metade das coisas que você fala não tem aplicabilidade para a resolução do exercício, ora por ser conteúdo que nunca vi e você pressupõe que eu devo correr atrás e saber mesmo sendo necessário outros conteúdos como base, ora é uma conceitualização desnecessária. Talvez isso se deve ao ser nível de conhecimento em programação). Mas obrigado mesmo assim, tem me ajudado muito. @giu_d Você sempre me ajudando, valeu. (Sobre os capítulos que você sugeriu a leitura, eu meio que não conseguir entender como eles me ajudariam a resolver o problema, principalmente pelo fato de a questão ter uma função própria - constroi(int n, int *v). Mas mesmo assim foi uma leitura agradável e me permitiu da uma clareada em lista encadeada (só uma clareada mesmo hehehe)) Acho que a demora para resolver esse exercício permitiu que algumas coisas fixassem mais na minha cabeça. Tenho muito que aprender e quero muito aprender. Obrigado @AnsiC e @giu_d .
  15. Rindo da desgraça alheia, bonito. rsrs Pois bem, conseguir resolver o exercicio. E fiz com for, de tras para frente como tinha falado. Ademais, consegui tudo na funcao constroi. @AnsiC @giu_d Acharam que nao ia conseguir ne?!
  16. Aii Deus. Continuo sem entender. Mas vou tentar.
  17. @thiagorecoba20 Compreendo sua dificuldade. É chato quando não fazemos ideia de como procedes na resolução do exercício e ainda nos dizem para fazemos do nosso jeito. Aprendemos muitas vezes por assimilação. Vou tentar resolvê-lo aqui, qualquer coisa estarei postando a maneira como conseguir resolver (não estou prometendo nada, fique claro).
  18. @AnsiC Porque voce esta passando o endereco da estrutura lista (&inteiro)? @giu_d Mas nesse caso seria apenas eu mudar o for e ir pegando os ultimos numeros do vetor (acho que fazendo com que o for ja comece no 'n'). Mas nem isso adiantaria pois o codigo não funciona da forma como esta, preenchendo de tras para frente. adicionado 18 minutos depois @AnsiC Percebo que voce esta falando para criar uma funcao para cada comando, mas acho mais pratico assim. Principalmente que se nao estou conseguindo fazer so uma funcao, imagina criar um monte. Já estou muito perdido.
  19. @AnsiC Porque que quando vou preencher eu crio uma lista, mas na hora de exibir eu exibo a que foi criado no corpo principal???? adicionado 8 minutos depois Poderia olhar a funcao constroi. Lista *constroi(int n, int *v){ Lista *novo = malloc(sizeof(Lista)); int i=0; for(i=0;i<n;i++){ novo->info=v[i]; novo=novo->prox; } return novo; } Eu apaguei e comecei tudo de novo. Mas acho que ainda cometo os mesmos erros, mesmo com as funcoes sendo diferentes. adicionado 11 minutos depois @AnsiC Acho que nao estou preenchendo a lista node. Não sei. adicionado 20 minutos depois Eu poderia construir o vetor dentro da funcao, mas nao é o que o exercicio pede. Me ajuda.
  20. Não mesmo. adicionado 26 minutos depois @giu_d Faz sentido eu colocar no main um for e ir passando valor do indice de cada vez? for(i=0;i<n;i++) inserir(node,v[i]); //E a funcao ser a seguinte Lista* inserir(Lista *node, int v){ Lista* novo= (Lista*)malloc(sizeof(Lista)); if(!novo){ printf("SEM MEMORIA!\n"); exit(1); } novo->info = v; novo->prox = NULL; }
  21. @giu_d A pergunta completa....apenas para que fique mais claro o que estava tentando resolver. Valeu pela ajuda, @giu_d Sobre o livro, capítulo, vou esta lendo para conseguir resolver o exercicio. Obrigadão @AnsiC Meus professores aqui não são essa moleza não. Federal não é fácil não amigo. E sobre enfiar no ... achei desnecessário. (Acho que nunca vou entender essa falta de empatia por parte de alguns, não me refiro a você)
  22. @AnsiC Desculpe, mas assim fica um pouco difícil. Estou tentando entender e você está tratando o MEU problema como algo banal e que fosse como puramente consequência da minha falta de interesse. O que não é! Dizer que a função está errada não está ajudando. Isso eu percebi quando o programa não rodou e as demais funções funcionava. Preciso saber onde estou errando, não quero que VOCÊ resolva MEU problema, mas que me ajude apenas a identificá-los, SE possível. Sobre o operador new, se ele se tratar realmente sobre alocação dinâmica (não conheço muito bem o C++) eu acho que eu fiz. Mas no corpo principal, main. TEMOS muito o que aprender ainda, não é mesmo?
  23. @AnsiC A função exibir nem esta funcionando pois a gambiarra nao esta! E o que seria essa funcao novo? Poderia me ajudar a identificar o erro da funcao constroi e como fazer a funcao novo? adicionado 50 minutos depois @AnsiC O que é essa funcao novo? (nao encontrei em lugar algum algo assim, somente as velhas criar, inserir, retirar, exibir, liberar)
  24. Boa tarde, como vão? Estou tentando passar um vetor de n elementos a uma estrutura, na qual os nós da lista corresponderão a cada valor do vetor. Se o primeiro número for 2, o primeiro nó terá como número o número do 2. E assim sucessivamente. Mas não estou conseguir atribuir a struct os valores do vetor. Tentei resolver com um recursividade, mas não está dando certo. Alguma sugestão? Segue o código: //Questao 06. Implemente uma função que recebe um vetor de valores inteiros com n elementos e construa // uma lista encadeada armazenando os elementos do vetor nos nós da lista. #include <stdio.h> #include <stdlib.h> struct lista{ int info; struct lista *prox; }; typedef struct lista Lista; void inicia(Lista *node){ node->prox=NULL; } int vazia(Lista *node){ if(node->prox==NULL){ return 1; } else return 0; } Lista *constroi(int n, int *v){ Lista *novo=(Lista*)malloc(sizeof(Lista)*n); if(!novo){ printf("\nSem memoria disponivel!\n"); exit(1); } if(n==0){ return novo; } else{ novo->info=v[n]; constroi(n-1, v); } } void exibir(Lista *node){ if(vazia(node)){ printf("Lista vazia!\n"); return; } Lista *temp; temp = node->prox; while(temp!=NULL){ printf("%d\n", temp->info); temp=temp->prox; } } int main(){ Lista *node = (Lista*)malloc(sizeof(Lista)); int n, i; printf("Informe o tamanho do vetor: "); scanf("%d", &n); int *v; v=(int *)malloc(n*sizeof(int)); printf("\nEntre agora com os valores do vetor.\n"); for(i=0;i<n;i++){ printf("Vetor [%d]: ", i); scanf("%d", &v[i]); } constroi(n,v); exibir(node); }

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!