Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Aisó

C RESOLVIDO Testar se duas pilhas P1 e P2 são iguais

Recommended Posts

Oi galera, inicialmente esse código era em visual C++ .

Fui fazendo mudanças para transforma-lo em C, só que agora não consigo mais sair do lugar, alguém pode me ajudar?

 

/*Codigo para testar se duas pilhas P1 e P2 são iguais.

Duas pilhas são iguais se possuem os mesmos elementos, na mesma ordem.

Você pode utilizar pilhas auxiliares também, se necessário. */

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>


typedef struct nodo_a{

int dado;
struct nodo_a *prox;

}nodo_b;


typedef nodo_b *pNodo;
typedef nodo_b *pPilha;


void push (pPilha *p, int x){

 pNodo no;
 no = (pNodo) malloc(sizeof (nodo_b));
 if (no != NULL){
    no -> dado = x;
    no -> prox = *p;
    *p = no;
  }
}


int pop (pPilha *p){
    pNodo no;
    int x = 0;
    no = *p;
    x = (*p)->dado;
    *p = (*p)-> prox;
    free(no);
    return x;
}


int pilha_vazia(pPilha *p){
    return (*p == NULL ? 1:0);
}


void pilhasIguais (pNodo N1, pNodo N2){
    double  faixa = true;

    if ((N1 == NULL) || (N2 == NULL)){

    printf(" Pilhas Estão Vazias", setlocale(LC_ALL,""));
    }
    else{
        while ((N1 != NULL) &&(N2 != NULL) &&(faixa)){
            if(N1 -> dato != N2 -> dato){
                faixa = false;
            }
            else {
                    N1 = N1 -> prox;
                    N2 = N2 -> prox;
            }
        }
    }
    if (( N1 == NULL) && (N2 == NULL) && (band)){
        printf("Pilhas Iguais\n");
}


 void main(){
     pPilha  P1 == NULL, P2 == NULL;

     nodo_b *p = (nodo_b *) malloc(sizeof(nodo_b));

     push(P1,8);
     push(P1,23);
     push(p1,3);
     push(P2,8);
     push(P2,23);
     push(p2,3);      

     if (!= pilha_vazia(&P1) && != pilha_vazia(&P2)){
        pilhasIguais(P1,P2);
     }

  getch();
  }

}

 

Editado por Simon Viegas
Inserir tag CODE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nos diga o que você quer e não consegue?

Você a rotina que compara? é isso.

Editado por AnsiC

Compartilhar este post


Link para o post
Compartilhar em outros sites

 Então, o que eu quero mesmo é que rode.

e não sei o que está faltando para isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu programa está com a lógica quase correta porém com a implementação errada.


O problema fundamental é que você está confundindo apontar com o que o apontador aponta

 

Por exemplo, a função push para por na pilha

void push (pPilha *p, int x){
// *p é o apontador para o topo da pilha
//  x é valor a ser adicionado a pilha

 pNodo no; // aqui declara-se uma variável que vai ter o apontador para o novo nó
 no = (pNodo) malloc(sizeof (nodo_b)); // aqui criou-se o nó 
 if (no != NULL){       // se der != NULL significa que conseguiu alocar a memória para o novo nó 
    no -> dado = x;     // no não é uma estrutura. Ele aponta para uma então o correto seria (*no)->dado = x;
    no -> prox = *p;    // aqui a mesma coisa (*no)->dado = *p; o próximo passa a apontar para o ex-topo da pilha
    *p = no;            // topo da pilha passa a apontar para o no 
  }
}


Existem vários erros de compilação e inclusão de bibliotecas que não são necessárias. além disso, esqueceu de traduzir "band" para faixa.

 

Dá uma olhada aqui e checa os comentários:
Código:

#include <stdio.h>
#include <stdlib.h>
/* #include <conio.h>
#include <locale.h>
*/

typedef struct nodo_a {
	int dado;
	struct nodo_a *prox;

} nodo_b;

typedef nodo_b *pNodo;
typedef nodo_b *pPilha;

void push(pPilha *p, int x) {
	pNodo no;
	no = (pNodo)malloc(sizeof(nodo_b));
	if (no != NULL) {
		no->dado = x;
		no->prox = *p;
		*p = no;
	}
}

int pop(pPilha *p) {
	pNodo no;
	int x = 0;
	no = *p;
	x = (*p)->dado;
	*p = (*p)->prox;
	free(no);
	return x;
}

int pilha_vazia(pPilha *p) {
	return (*p == NULL ? 1 : 0);
}

void mostra_pilha(pPilha *p) {
  pPilha ponteiro;
  ponteiro = *p;
  
  for( int i=0 ; (ponteiro != NULL) ;i++) {
    printf("Posicao %2i valor=%2i\n",i,(*ponteiro).dado);
    ponteiro = (*ponteiro).prox;
  }
  printf("Fim da pilha\n\n");
  
}

void pilhasIguais(pNodo N1, pNodo N2) {
	double faixa = 1;

	if ((N1 == NULL) || (N2 == NULL)) {
		printf(" Um das Pilhas Está vazia ");
	} else {
		while ((N1 != NULL) && (N2 != NULL) && (faixa)) {
			if (N1->dado != N2->dado) {
				faixa = 0;
			} else {
				N1 = N1->prox;
				N2 = N2->prox;
			}
		}
	}
	if ((N1 == NULL) && (N2 == NULL) && (faixa)) {
		printf("Pilhas Iguais\n");
	} else {
		printf("Pilhas Diferentes\n");
	  
	}
}

void main() {
	pPilha P1 = NULL, P2 = NULL;

	/* cria pilha um */
	push(&P1, 8);
	push(&P1, 23);
	push(&P1, 3);
	
	mostra_pilha(&P1);
	

	push(&P2, 8);
	push(&P2, 23);
	push(&P2, 3);
	mostra_pilha(&P2);

	if (!pilha_vazia(&P1) && !pilha_vazia(&P2)) {
		pilhasIguais(P1, P2);
	}

	pPilha P3 = NULL, P4 = NULL;

	push(&P3, 8);
	push(&P3, 23);
	push(&P3, 4);
	mostra_pilha(&P3);

	pilhasIguais(P1, P3);

	push(&P4, 4);
	push(&P4, 23);
	push(&P4, 8);
	mostra_pilha(&P4);

	pilhasIguais(P1, P4);


	;
}


Código com compilador online:
https://repl.it/@bokomoko/Pilha-usando-apontadores-comparacao

Editado por Simon Viegas
Inserir código do link na própria postagem

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 horas atrás, Boko Moko disse:

Seu programa está com a lógica quase correta porém com a implementação errada.


O problema fundamental é que você está confundindo apontar com o que o apontador aponta

 

Por exemplo, a função push para por na pilha


void push (pPilha *p, int x){
// *p é o apontador para o topo da pilha
//  x é valor a ser adicionado a pilha

 pNodo no; // aqui declara-se uma variável que vai ter o apontador para o novo nó
 no = (pNodo) malloc(sizeof (nodo_b)); // aqui criou-se o nó 
 if (no != NULL){       // se der != NULL significa que conseguiu alocar a memória para o novo nó 
    no -> dado = x;     // no não é uma estrutura. Ele aponta para uma então o correto seria (*no)->dado = x;
    no -> prox = *p;    // aqui a mesma coisa (*no)->dado = *p; o próximo passa a apontar para o ex-topo da pilha
    *p = no;            // topo da pilha passa a apontar para o no 
  }
}


Existem vários erros de compilação e inclusão de bibliotecas que não são necessárias. além disso, esqueceu de traduzir "band" para faixa.

 

Dá uma olhada aqui e checa os comentários:
Código:


#include <stdio.h>
#include <stdlib.h>
/* #include <conio.h>
#include <locale.h>
*/

typedef struct nodo_a {
	int dado;
	struct nodo_a *prox;

} nodo_b;

typedef nodo_b *pNodo;
typedef nodo_b *pPilha;

void push(pPilha *p, int x) {
	pNodo no;
	no = (pNodo)malloc(sizeof(nodo_b));
	if (no != NULL) {
		no->dado = x;
		no->prox = *p;
		*p = no;
	}
}

int pop(pPilha *p) {
	pNodo no;
	int x = 0;
	no = *p;
	x = (*p)->dado;
	*p = (*p)->prox;
	free(no);
	return x;
}

int pilha_vazia(pPilha *p) {
	return (*p == NULL ? 1 : 0);
}

void mostra_pilha(pPilha *p) {
  pPilha ponteiro;
  ponteiro = *p;
  
  for( int i=0 ; (ponteiro != NULL) ;i++) {
    printf("Posicao %2i valor=%2i\n",i,(*ponteiro).dado);
    ponteiro = (*ponteiro).prox;
  }
  printf("Fim da pilha\n\n");
  
}

void pilhasIguais(pNodo N1, pNodo N2) {
	double faixa = 1;

	if ((N1 == NULL) || (N2 == NULL)) {
		printf(" Um das Pilhas Está vazia ");
	} else {
		while ((N1 != NULL) && (N2 != NULL) && (faixa)) {
			if (N1->dado != N2->dado) {
				faixa = 0;
			} else {
				N1 = N1->prox;
				N2 = N2->prox;
			}
		}
	}
	if ((N1 == NULL) && (N2 == NULL) && (faixa)) {
		printf("Pilhas Iguais\n");
	} else {
		printf("Pilhas Diferentes\n");
	  
	}
}

void main() {
	pPilha P1 = NULL, P2 = NULL;

	/* cria pilha um */
	push(&P1, 8);
	push(&P1, 23);
	push(&P1, 3);
	
	mostra_pilha(&P1);
	

	push(&P2, 8);
	push(&P2, 23);
	push(&P2, 3);
	mostra_pilha(&P2);

	if (!pilha_vazia(&P1) && !pilha_vazia(&P2)) {
		pilhasIguais(P1, P2);
	}

	pPilha P3 = NULL, P4 = NULL;

	push(&P3, 8);
	push(&P3, 23);
	push(&P3, 4);
	mostra_pilha(&P3);

	pilhasIguais(P1, P3);

	push(&P4, 4);
	push(&P4, 23);
	push(&P4, 8);
	mostra_pilha(&P4);

	pilhasIguais(P1, P4);


	;
}


Código com compilador online:
https://repl.it/@bokomoko/Pilha-usando-apontadores-comparacao

Obrigada  @Boko Moko vou rever com suas sugestões!

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






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×