PILHA.H PILHA.C

Propaganda
PILHA.H
/* no turboC para DOS use:
#include "client~1.h"*/
#include "clientePilha.h"
/*
operacao de manipulacao:
pre-condicao: existencia do TDA cujo endereco eh passado, juntamente com uma
referencia para uma variavel do tipo info.
pos-condição: se possível remove o item do topo da pilha, o copia para o local
de memória apontado por pReg e retorna SUCESSO, caso contrário retorna FRACASSO
*/
int desempilha(pPilha p, info *pReg);
/*#define M 10*/
#define LIVRE 0
#define OCUPADA 1
#define FRACASSO 0
#define SUCESSO 1
#define TRUE 1
#define FALSE 0
#define VERDADEIRO 1
#define VAZIA -1
/*
tipo de operação: função destrutora.
pre condicao: a existência do tda e um apontador declarado externamente à função,
devidamente inicializado com o endereço do tda e cujo endereço (deste apontador) é
passado para funcao.
pos condicao: destrói o TDA desalocando qualquer região de memória previamente
alocada
para o mesmo e fazendo o ponteiro que o referenciava receber NULL.
*/
void destroi(ppPilha pp);
/* Header (descritor) – modelo de dados do TDA*/
typedef struct {
info *vet; /* ponteiro para o vetor */
int topo; /* topo da pilha */
int tamanho; /*tamanho físico do vetor/tamanho máximo da pilha */
}Pilha, *pPilha, **ppPilha;
/*operação de criacao:
pre-condica: existencia de um apontador do tipo do tda passado por referencia
para a funcao juntamente com o tamanho (>0) do tda a ser criado
pos-condicao: criacao e inicializacao do TDA, atribuicao do seu endereco ao
ponteiro passado por referencia. Em caso de problemas na criacao será sinalizado
(retornado)o seu FRACASSO, caso contrário será sinalizado o seu SUCESSO.
*/
int cria(ppPilha pp, int tamanho);
/*
operacao de acesso:
pre-condicao: existencia do TDA cujo endereco eh passado, juntamente com uma
referencia para uma variavel do tipo info.
pos-condição: em caso de sucesso copia o item no topo para o local de memória
apontado por pReg e retorna SUCESSO, caso contrário retorna FRACASSO
*/
int buscaNoTopo(pPilha p, info *pReg);
/*
operacao de manipulacao:
pre-condicao: existencia do TDA cujo endereco eh passado, juntamente com uma
referencia para o novo registro de informaçao a ser empilhado.
pos-condição: em caso de sucesso retorna SUCESSO, caso contrário retorna FRACASSO
*/
int empilha(pPilha p, info *novo);
/*
tipo de operação: função de manipulação.
pre condicao: a existência do tda cujo endereço é passado para a função
pos condicao: "esvazia" o tda de dados. O TDA volta às mesmas condições que existiam
imediatamente após a sua criação
*/
void purga(pPilha p);
/*
tipo de operação: função de acesso.
pre condicao: a existência do tda cujo endereço é passado para a função
pos condicao: se o TODA estiver vazio, retorna TRUE, caso contrário retorna FALSE.
imediatamente após a sua criação
*/
int testaVazia(pPilha p);
/*
tipo de operação: função de acesso.
pre condicao: a existência do tda cujo endereço é passado para a função
pos condicao: se o TODA estiver cheio, retorna TRUE, caso contrário retorna FALSE.
imediatamente após a sua criação
*/
int testaCheia(pPilha p);
PILHA.C
/*#include "tda_ve~1.h"*/
#include "tda_pilha.h"
int cria(ppPilha pp, int tamanho)
{ int ret = FRACASSO;
if ( ( *pp = (pPilha) malloc(sizeof(Pilha)) )!=NULL ) /* cria header */
{ (*pp)->vet = (info *) malloc(tamanho*sizeof(info)); /* cria vetor */
if ( (*pp)->vet !=NULL )
{ (*pp)->tamanho = tamanho; /*inicia tamanho do vetor*/
(*pp)->topo = VAZIA; /*inicia pilha vazia */
ret = SUCESSO;
}
else
{ free(*pp);
*pp = NULL;
}
}
return ret;
}
int buscaNoTopo(pPilha p, info *pReg)
{ int ret;
if (p->topo == VAZIA) /* acesso direto ao topo */
ret = FRACASSO;
else
{ *pReg = p->vet[p->topo]; /* OU *pReg = *(p->vet + p->topo); */
ret = SUCESSO;
}
return ret;
}
int empilha(pPilha p, info *novo)
{ if (p->topo >= p->tamanho-1)
return FRACASSO;
else
{ p->topo++;
*(p->vet + p->topo) = *novo; /* OU p->vet[p->topo] = *novo;
return SUCESSO;
}
}
*/
int desempilha(pPilha p, info *pReg)
{ if (p->topo == VAZIA)
return FRACASSO;
else
{ *pReg = *(p->vet + p->topo); /* OU *pReg = (p->vet[p->topo]); */
p->topo--;
return SUCESSO;
}
}
void destroi(ppPilha pp)
{ free((*pp)->vet);
free(*pp);
*pp = NULL;
}
void purga(pPilha p)
{ p->topo = VAZIA;
}
int testaVazia(pPilha p)
{ int ret;
if (p->topo == VAZIA) /* acesso direto ao topo */
ret = TRUE;
else
ret = FALSE;
return ret;
}
int testaCheia(pPilha p)
{ int ret;
if (p->topo >= p->tamanho-1) /* acesso direto ao topo */
ret = TRUE;
else
ret = FALSE;
return ret;
}
CLIENTE.H
/*modelo de dados da aplicação - cliente do TDA*/
typedef struct { char matricula[N];
}info;
CLIENTE.C
/*#include "tda_ve~1.h"*/
#include "tda_pilha.h"
main()
{ pPilha p = NULL;/*MANTENHA ’P’ COMO REFERNCIA PARA O TDA */
int tam;
char opc;
puts ("entre com tamanho do tda");
scanf("%i",&tam);
if (cria(&p, tam)==SUCESSO);
{info auxInfo;
do{ clrscr();
puts(" entre com uma opcao");
puts(" 1-busca no topo, 2-empilha, 3-desempilha");
puts(" 4-estah vazia ?, 5-estah cheia ?");
puts(" 0-para encerrar");
printf("\n");
fflush(stdin);
opc = getche();
switch (opc)
{ case ’1’:
if( buscaNoTopo(p,&auxInfo)==FRACASSO)
puts("pilha vazia!");
else
printf("\n informacao no topo: %s \n",auxInfo.matricula);
break;
case ’2’:
if(testaCheia(p))
puts("erro na insercao: estrutura de dados cheia !");
else
{ printf("\nentre com a matricula:\n");
gets(auxInfo.matricula);
empilha(p,&auxInfo);
puts("SUCESSO na insercao");
}
break;
case ’3’:
if(desempilha(p,&auxInfo)== FRACASSO)
puts("Erro no desempilha pois o tda esta vazio!");
else
printf("\n retirou o : %s \n", auxInfo.matricula);
break;
case ’4’:
.....................
case ’0’:
destroi(p);
break;
}
getche();
}while(opc != ’0’);
}
return;
}
Download