Ir ao conteúdo
  • Cadastre-se

Preciso de uma ajuda para conseguir montar uma pilha, de livro


48rneves15
Ir à solução Resolvido por CiroboyBR,

Posts recomendados

 PRECISO DE UMA AJUDA COM UM TRABALHO DE FACULDADE, QUE DEVE ESTÁ PRONTO ATÉ AMANHA AS 15:00, 

ALGUMAS DAS FUNÇÕES NÃO ESTÃO FUNCIONANDO CORRETAMENTE, NÃO SEI DIZER SE É A FUNÇAO EXIBE OU A FUNÇÃO PUSH, A OUTRA É A FUNÇÃO PESQUISA  QUE EXECUTA MAIS quando PEDE PARA PESQUISAR DA ERRO E FECHA O PROGRAMA.

QUEM PUDER ME AJUDAR EU AGRADEÇO.

 

 

 

 

#include <stdio.h>

#include <stdlib.h>

 

struct LIVRO{

char nome[30]; 

char autor[30]; 

char edit[30];

  int ano, pag, codigo;

  struct LIVRO *prox;

};

typedef struct LIVRO livro;

 

int tam;

 

int menu(void);

//int submenu(livro *PILHA);

void inicia(livro *PILHA);

void opcao(livro *PILHA, int op);

void exibe(livro *PILHA);

void libera(livro *PILHA);

void push(livro *PILHA);

int vazia(livro *PILHA);

int pesquisa(livro *PILHA);

livro *pop(livro *PILHA);

 

 

int submenu(void)

{

 livro *PILHA = (livro *) malloc(sizeof(livro));

 if(!PILHA){

  printf("SEM ESPACO NA MEMORIA!\n");

  exit(1);

 }else{

 inicia(PILHA);

 int opt;

 

 do{

  opt=menu();

  opcao(PILHA,opt);

  }while(opt);

 

  free(PILHA);

  return 0;

 }

}

 

void inicia(livro *PILHA)

{

  PILHA->prox = NULL;

  tam=0;

}

 

int menu(void)

{

 int opt;

    linha();

    printf("-=- -=-\n");

    printf("-=- BIBLIOTECA CADASTRO DE LIVROS -=-\n");

    printf("-=- -=-\n");

    linha();

    printf("\n\n");

    printf("\t\t-=>>>DIGITE UMA OPCAO<<<=-\n\n");

    printf("\t\t1 -> INSERIR UM UM LIVRO NA PILHA\n");

    printf("\t\t2 -> REMOVER UM LIVRO DA PILHA\n");

    printf("\t\t3 -> EXIBIR TODOS OS LIVROS\n");

    printf("\t\t4 -> PESQUISAR LIVRO\n");

    printf("\t\t5 -> APAGAR TODOS\n");

    printf("\t\t6 -> SAIR\n");

 

printf("DIGITE A OPCAO: "); scanf("%d", &opt);

 

  return opt;

}

 

void opcao(livro *PILHA, int op)

{

  livro *tmp;

  switch(op){

 

    case 1:

    system("cls");

      inicia(PILHA);

      push(PILHA);

      system("pause");

      system("cls");

        break;

    case 2:

  system("cls");

  tmp=pop(PILHA);

  if(tmp!=NULL)

  printf("LIVRO RETIRADO DA PILHA! \n\n");

    system("pause");

  system("cls");

    break;

    case 3:

        system("cls");

        exibe(PILHA);

        system("pause");

        system("cls");

break;

case 4:

  system("cls");

  pesquisa(PILHA);

    system("pause");

    system("cls");

    break;

    case 5:

  system("cls");

  libera(PILHA);

    inicia(PILHA);

    printf("PILHA ZERADA\n\n");

    system("pause");

    system("cls");

    break;

    case 6:

  system("cls");

  libera(PILHA);

        system("pause");

        system("cls");

        return main();

        break;

    default:

        printf("\n\t\t\tOPCAO INVALIDA!!!\n\t\t\tTENTE NOVAMENTE!!!");

 }

}

 

int vazia(livro *PILHA)

{

 if(PILHA->prox == NULL)

  return 1;

 else

  return 0;

}

 

livro *aloca()

{

livro *novo=(livro *) malloc(sizeof(livro));

if(!novo){

  printf("NOT MEMORY!\n");

  exit(1);

  }else{

  printf("DIGITE O TITULO DO LIVRO:\n ");

    scanf("%s", &novo->nome);

    fflush(stdin);

    printf("NOME O AUTOR DO LIVRO:\n ");

    scanf ("%s",&novo->autor);

    fflush(stdin);

    printf("EDITORA DO LIVRO:\n ");

    scanf ("%s",&novo->edit);

    fflush(stdin);

    printf("ANO DO LIVRO:\n ");

    scanf ("%d",&novo->ano);

    fflush(stdin);

    printf("NUMERO DE PAGINAS:\n ");

    scanf ("%d",&novo->pag);

    fflush(stdin);

    printf("DIGITE O CODIGO:\n ");

    scanf ("%d",&novo->codigo);

    fflush(stdin);

    printf("-=>EMPILHADO COM SUCESSO!!!<=-\n");

    return novo;

system("pause");

    system("cls");

 

  }

}

 

 

void exibe(livro *PILHA)

{

  if(vazia(PILHA)){

  printf("PILHA VAZIA!\n\n");

  system("pause");

  system("cls");

  return ;

  }

 

  livro *tmp;

  tmp = PILHA->prox;

  printf("\t=------> PILHA <--------=\n");

  while( tmp != NULL){

  // printf("%5d", tmp->num);

  printf("\tTITULO: %s\n", tmp->nome);

    printf("\tAUTOR: %s\n", tmp->autor);

    printf("\tEDITORA: %s\n",tmp->edit);

    printf("\tEDICAO: %d\n",tmp->ano);

printf("\tPAGINAS: %d\n",tmp->pag);

printf("\tCODIGO: %d\n", tmp->codigo);

    printf("\n\n");

  tmp = tmp->prox;

  }

  /*printf("\n        ");

  int count;

  for(count=0 ; count < tam ; count++)

  printf("  ^  ");

  printf("\nOrdem:");

  for(count=0 ; count < tam ; count++)

  printf("%5d", count+1);

 

*/

printf("\n\n");

}

 

void libera(livro *PILHA)

{

  if(!vazia(PILHA)){

  livro *proxLivro,

      *atual;

 

  atual = PILHA->prox;

  while(atual != NULL){

  proxLivro = atual->prox;

    free(atual);

    atual = proxLivro;

  }

  }

}

 

void push(livro *PILHA)

{

  livro *novo=aloca();

  novo->prox = NULL;

 

  if(vazia(PILHA))

  PILHA->prox=novo;

  else{

  livro *tmp = PILHA->prox;

  while(tmp->prox != NULL)

    tmp = tmp->prox;

 

tmp->prox = novo;

  }

  tam++;

}

 

 

livro *pop(livro *PILHA)

{

  if(PILHA->prox == NULL){

  printf("PILHA VAZIA!!!\n\n");

  return NULL;

  }else{

  livro *ultimo = PILHA->prox,

        *penultimo = PILHA;

 

  while(ultimo->prox != NULL){

    penultimo = ultimo;

    ultimo = ultimo->prox;

  }

  penultimo->prox = NULL;

  penultimo->prox=NULL;

  printf("Retirado titulo: %s\n", ultimo->nome);

    printf("Retirado autor: %s\n",ultimo->autor);

    printf("Retirado editora: %s\n",ultimo->edit);

    printf("Retirado edicao: %d\n",ultimo->ano);

    printf("Retirado paginas: %d\n",ultimo->ano);

    printf("Retirado codigo: %d\n",ultimo->codigo);

  tam--;

  return ultimo;

}

}

 

//ESTA FUNÇÃO aqui NAO ESTÁ FUNCIONANDO

int pesquisa(livro *PILHA){

    //int codigo;

  int cod = 0;

  int contador = 0;

 

  printf("DIGITE O CODIGO DO LIVRO:");

  scanf("%d", cod);

 

  if(vazia(PILHA)){

  printf("NAO EXISTE NENHUM LIVRO!\n");

  }else

  printf("MOSTRANDO LIVRO CADASTRADO!\n");

    livro *tmp = PILHA;

    while(!(tmp == NULL) && !(tmp -> codigo == cod))

  {

        tmp = tmp -> prox;

        contador++;

  }

 

    printf("O LIVRO E: %d\n", tmp -> nome);

    if(tmp == NULL){

      return -1;

    }else{

    return contador;

}

 

}

 

 

 

 

codigo_linha(){

    int i;

    for(i=0;i<26;i++){

        printf("<=>");

    }

    printf("\n");

 }

 

vertical(){

    printf("<|>                                                                        <|>\n");

 

}

 

linha(){

    int i;

    for(i=0;i<20;i++){

        printf("-=-");

    }

    printf("\n");

 }

 

 

int main (void){

    system("color 30");

    int opc;

    printf("\n\n");

    codigo_linha();

    codigo_linha();

    codigo_linha();

    vertical();

    printf("<|>                 ->>>PROJETO II PILHA<<<-                   <|>\n");

    vertical();

    vertical();

printf("<|>                 PRESSIONE ->> '1' PARA INICIAR O PROJETO                <|>\n");

    vertical();

    vertical();

    vertical();

    codigo_linha();

    codigo_linha();

 

    scanf("%d",&opc);

    if(opc==1){

 

 

        system("cls");

        menu();

        submenu();

        getchar();

 

    }else{

        printf("\n\n\t\t\t OPCAO INVALIDA!!!\n\t\t\tPOR FAVOR DIGITE '1'\n");

        getchar();

        return main();

    }

 

}

Link para o comentário
Compartilhar em outros sites

  • Solução

Acho que você deveria rever essa sua lista, reimplementar ela e só depois usar no seu programa.

Não soluciona tudo, mas acho que essa função deveria ser assim

int pesquisa(livro *PILHA) {  //int codigo;  int cod = 0;  int contador = 0;  printf("DIGITE O CODIGO DO LIVRO:");  scanf("%d", &cod);  if(vazia(PILHA) == 1) {    printf("NAO EXISTE NENHUM LIVRO!\n");  } else {    printf("MOSTRANDO LIVRO CADASTRADO!\n");    livro *tmp = PILHA;    while(!(tmp == NULL) && !(tmp -> codigo == cod)) {      tmp = tmp -> prox;      contador++;    }    printf("O LIVRO E: %d\n", tmp -> nome);    if(tmp == NULL) {      return -1;    } else {      return contador;    }  }}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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!