Ir ao conteúdo
  • Cadastre-se

MuriloHB

Membro Júnior
  • Posts

    6
  • Cadastrado em

  • Última visita

Tudo que MuriloHB postou

  1. Caso alguem tenha alguma dúvida, o problema se encontrava na função push, especificamenten o trecho: aux = P->topo; while(aux != NULL && aux->info > x ){ proximo = aux; aux = aux->ant; } proximo->ant = p; p->ant = aux; } proximo = NULL; aux = NULL; } Realizei a seguinte alteração: aux = P->topo; //vai procurar o lugar correto pra inserir o elemento while(aux != NULL && aux->info > x ){ proximo = aux; aux = aux->ant; } // se tiver que inserir no começo if (aux == P->topo) { p->ant = P->topo; P->topo = p; } // se for no final else if (aux == NULL) { proximo->ant = p; p->ant = NULL; } // se for no meio else { p->ant = aux; proximo->ant = p; } } proximo = NULL; aux = NULL; } Agora o programa roda normalmente!
  2. Eu tenho o DEV C++ aqui também, mas ele dá a mesma coisa. Na hora de compilar ele aponta: Compilation results... -------- - Errors: 0 - Warnings: 0 - Output Filename: C:\Users\Murilo\Desktop\dev.exe - Output Size: 130,6328125 KiB - Compilation Time: 2,81s Mas na hora que eu rodo o programa, informo os elementos da Pilha e dou Enter, o programa também para de funcionar.
  3. Então, eu uso o CodeBlocks pra compilar e quanto eu rodo o programa ele não mostra onde estão os erros, apenas aponta " Exercício.exe parou de funcionar... "
  4. Olá galera! Então, estou tendo problemas com o seguinte exercício de Algoritmos e Estrutura de Dados: Escreva um algoritmo para ordenar os elementos de uma pilha durante o processo de inserção - push(x). Após todas as inserções, os elementos da pilha devem estar dispostos em ordem crescente, estando o maior valor no topo da pilha e o menor, na primeira posição válida da pilha. Entrada: Todos os elementos a serem inseridos na pilha separados por espaço, aqui os elementos não estão ordenados. Saída: Elementos na pilha, sendo que o topo da pilha é o primeiro elemento a ser exibido, e assim por diante... Ex de Entrada: 6 1 9 4 3 2 10 22 Ex de Saída: 22 10 9 6 4 3 2 1 OBS PARA OBTER A ENTRADA: Leia cada linha utilizando a função fgets, utilizando como ponteiro de arquivo stdin. Para obter cada número da linha lida, utilize a função strtok. A conversão de cada número obtido com strtok para seu valor inteiro pode ser feita com a função atoi. Então, eu escrevi meu código e na minha cabeça a lógica está completamente correta, no entando quando executo dá erro e o programa para de funcionar... Meu código está assim: #include <stdio.h>#include <stdlib.h>typedef struct node { int info; struct node *ant;}node;typedef struct Pilha{ node *topo;}Pilha;Pilha *P;void cria(Pilha *P){ P->topo = NULL;}void push(Pilha *P, int x){ node *p; node *aux; node *proximo; proximo = NULL; aux = NULL; p =(node*)malloc(sizeof(node)); if(p == NULL){ printf("Erro de alocacao!"); exit(1); } else{ p->info = x; if(P->topo == NULL){ p->ant = NULL; P->topo = p; } else{ aux = P->topo; while(aux != NULL && aux->info > x ){ proximo = aux; aux = aux->ant; } proximo->ant = p; p->ant = aux; } proximo = NULL; aux = NULL; }}void converte(char string[], Pilha *P){ char *pch; int x; pch = strtok(string," "); while (pch != NULL){ x = atoi(pch); push(P, x); pch = strtok (NULL, " "); }}void imprime(Pilha *P){ node *p; if(P->topo == NULL){ printf("A Pilha esta vazia!"); exit(1); } else{ p = P->topo; while(p!=NULL){ printf("%d ", p->info); p = p->ant; } }}void esvazia(Pilha *P){ node *p, *aux; p = P->topo; while(p != NULL){ aux = p; p = p->ant; free(aux); } free(P);}int main(){ char string[6000]; Pilha *P = (Pilha*) malloc (sizeof(Pilha)); cria(P); printf("Informe os valores da pilha: "); fgets(string, 6000, stdin); converte(string, P); imprime(P); esvazia(P); return 0;} Gostaria de saber o que estou errando, pois realmente não tenho a menor ideia. Agradeço a atenção!
  5. Olá galera, tudo bem? Então... Hoje na minha aula de Algoritmos e Estruturas de Dados meu professor me passou um exercício para entrega, o qual basicamente diz que: Dadas duas filas encadeads e dinâmicas L1 e L2, previamente ordenadas de forma crescente , crie uma terceira fila L3 com os elementos de intersecção da fila L1 com a fila L2. Entrada: A entrada será composta de duas linhas. A primeira são todos os elementos de L1 separados por espaço e a segunda, todos os elementos de L2 separados por espaço. Saida: Fila L3 com todos os elementos separados por espaço. Exemplo de entrada: 1 4 5 10 4 5 11 Saída: 4 5 Além disso, ele adiciona que, para obter a entrada, é necessário ler cada linha utilizando a função fgets e para obter cada número da linha lida, é necessário utilizar a função strtok. Ainda, a conversão de cada número obtido com strtok para seu valor inteiro deve ser feita com a função atoi. No caso, eu escrevi meu código , mas quando tento rodar ele dá erro, falando que o programa parou de funcionar... Aqui está como o código está no momento: #include <stdio.h>#include <stdlib.h>typedef struct NO { int cont; struct NO *prox;}no;typedef struct Fila { no *inicio, *fim;}Fila;Fila *F1;Fila *F2;Fila *F3;void cria(Fila *F){ F->inicio = NULL; F->fim = NULL;}int IsEmpty(Fila *F){ if(F->inicio = NULL){ return; } else return (0);}void entra(Fila *F, int x){ no *p; p =(no*)malloc(sizeof(no)); if(p = NULL){ printf("Erro de alocacao"); exit(1); } else{ p->prox = NULL; p->cont = x; if(F->inicio = NULL){ F->inicio = p; } else F->fim->prox = p; F->fim = p; }}void sai(Fila *F){ no *p; if(IsEmpty(F)){ printf("A fila ja esta vazia!"); exit(1); } else{ p = F->inicio; F->inicio = F->inicio->prox; if(F->inicio = NULL){ F->fim = NULL; } free(p); }}int main(){ cria(F1); cria(F2); cria(F3); char string[6000]; printf("Informe os valores crescentes da Fila 1: "); fgets(string, 6000, stdin); converte(string, F1); printf("Informe os valores crescentes da Fila 2: "); fgets(string, 6000, stdin); converte(string, F2); compara(F1,F2); imprime(F3); esvazia(F1); esvazia(F2); esvazia(F3);}int converte(char string[], Fila *F){ char *pch; int x; pch = strtok(string," "); while (pch != NULL){ x = atoi(pch); entra(F, x); pch = strtok (NULL, " "); }}int compara(Fila *F1, Fila *F2){ no *p, *q; int x; p = F1->inicio; q = F2->inicio; while(p->prox != NULL){ while(q->prox != NULL){ if(p->cont == q->cont); x = &p; entra (F3, x); p = p->prox; } }}void imprime(Fila *F){ no *p; p = F->inicio; while(p != NULL){ printf("%d ", p->cont); p = p->prox; }}void esvazia(Fila *F){ no *p, *temp; p = F->inicio->prox; temp = F->inicio; while(p != NULL){ free(temp); temp = p; p = p->prox; }} Se puderem me dar dicas de como corrigir o código ou apontar alguma função que eu tenha feito errado ficarei muito agradecido! Obrigado.
  6. Olá pessoal, eu recebi um trabalho para entregar no qual eu tenho que criar uma calculadora utilizando pilhas e com a notação polonesa reversa. No entando estou tendo muitas dificuldades de como começar a mesma, visto que não consegui acompanhar muito bem a matéria... Nesse trabalho, o professor especificou que deveríamos utilizar sua notação para a Pilha Estática, sendo que sua estrutura foi definida como: typedef struct pilha_dinamica PILHA_DINAMICA;typedef struct NO{ ITEM *item; struct NO *anterior;} NO;struct pilha_dinamica{ NO *topo; int tamanho;}; Essa calculadora trabalha apenas com números positivos e inteiros e tem as quatro operações: adição, subtração, multiplicação e divisão. Além disso tem a tecla C (clear) , que esvazia a pilha e a tecla E (enter) que empilha um 0, e deve ser usada para indicar que vai ser fornecido um número. Comecei o trabalho tentando primeiramente implementar as funções básicas da pilha, mas tenho muita dúvida se elas foram feitas corretamente... Gostaria que vocês dessem uma olhada e apontessem possíveis erros e melhorias no mesmo: #include <stdio.h>#include <stdlib.h>typedef struct pilha_dinamica PILHA_DINAMICA;typedef struct NO{ ITEM *item; struct NO *anterior;} NO;struct pilha_dinamica{ NO *topo; int tamanho;};//Criando a pilha dinamicamentePILHA_DINAMICA *criar_pilha(){ PILHA_DINAMICA *P = (PILHA_DINAMICA*)malloc(sizeof(PILHA_DINAMICA)); if(P == NULL){ printf("Erro de memoria!"); exit(1); } else{ P->topo = NULL; P->tamanho = 0; } return pilha;}//Apagar a pilhavoid apagar_pilha(PILHA_DINAMICA *P){ if(!vazia(P)){ NO *paux = (P)->topo; while(paux != NULL){ NO *patual = paux; paux = paux->anterior; free(patual); } } free(P); P = NULL;}//Verifica se a pilha está vaziaint vazia(PILHA_DINAMICA *P){ return(P->topo = NULL);}//Empilha um elemento na pilhavoid empilha(PILHA_DINAMICA *P, int *x){ NO *novo = (NO*)malloc(sizeof(NO)); novo->item = *x; if(vazia(P)){ P->topo = novo; novo->anterior = NULL; } novo->anterior = P->topo; P->topo = novo; P->tamanho++; }//Desempilha um elemento da pilhaint desempilha(PILHA_DINAMICA *P){ int N; if(vazia(P)){ printf("A pilha ja esta vazia!\n\n"); exit(1); } //no caso de haver apenas 1 nó na pilha else if(P->tamanho == 1){ N = P->topo->item; free(P->topo); P->topo = NULL; } else NO *temp; N = P->topo->item; temp = P->topo; P->topo = P->topo->anterior; free(temp); temp = NULL; return N;} Se o código estiver ok, eu posso começar a pensar em como farei para unir a calculadora a essa lógica da pilha e assim fazer um trabalho de qualidade. Agradeço a atenção e ajuda de todos!

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!