Ajuda em estrutura de dados: PILHA [RESOLVIDO]

1. Ajuda em estrutura de dados: PILHA [RESOLVIDO]

Davi Vieira
dvieira0801

(usa Fedora)

Enviado em 10/09/2010 - 00:25h

Galera, queria muito a ajuda de vocês nesse projeto. Preciso entregar um projeto de um programa que faça:

a) Criar uma pilha;
b) Testar se a pilha está vazia;
c) Ler o topo;
d) Inserir um elemento na pilha;
e) Retirar um elemento da pilha;
f) Listar a pilha indicano quem é o topo;
g) Gravar a pilha em um arquivo;
h) ler a pilha gravada em arquivo e restaurá-la na memória;

olhem o que eu fiz no main:

int main()
{
char opt;
PRODUTO *topo;

do{ char opt;
printf("\nOpcoes: \nA -> Adicionar um novo processo \nR -> Retirar o ultimo processo \nL -> Listar processos \nV -> Ver processos listados \nS -> Sair \n");

gets(opt); switch(opt){
case 'i': case 'I': push(&topo); break;
case 'r': case 'R': pop(topo); break;
case 'l': case 'L': listar(topo); break;
case 'v': case 'V': ver(topo);break;
case 's': case 'S': break;
default: printf("Opcao invalida! Leia as opcoes novamente e digite uma opcao valida."); break;

}
fflush(stdin);
}while((opt!='s') && (opt!='S'));

return 0;
}

Gostaria que alguem me ajudasse com as funções push e pop para esse meu programa.

Estou tentando desenvolver a push, mas estou fraco das idéias:

typedef struct processos
{
int dini, dfinal;
char competencia[50], nome[50], observacao[500] ;
struct processos *proximo;
}PROCESSO;

PROCESSO *push(PROCESSO **topo, int i=0)
{
struct PROCESSO *base;
int dataini, datafim;
char compet[50], n[50], obs[500];

if(*topo<max)
{
printf("Digite o nome do recurso (50 caracteres): ");
gets(n);
printf("Digite a data inicial do recurso (formato: ddmmaa - d = dia, m = mes e a = ano): ");
scanf("%d", &dataini);
printf("Digite a data de termino do recurso: ");
scanf("%d", &datafim);
printf("Competencia: ");
gets(compet);
printf("Observacoes adicionais (Se nao houver observacoes digite 'nao'): ");
gets(obs);

*topo=(PROCESSO *)malloc(sizeof(PROCESSO));
(*topo)->nome=n;
(*topo)->dini=dataini;
(*topo)->dfinal=datafim;
(*topo)->competencia=compet;
(*topo)->observacao=obs;

. ?
. ?
. ?


}
}


Por favor me ajudem a finalizar esse projeto com sugestões de funções.

Abraços


  


2. Re: Ajuda em estrutura de dados: PILHA [RESOLVIDO]

Davi Vieira
dvieira0801

(usa Fedora)

Enviado em 10/09/2010 - 13:22h

Cara, resolvi fazer algo mais simples. Melhor começar mais de baixo para depois ir complicando. Não se preocupe, sua dica tá salva aqui, depois vou trabalhar nela. O fato é que preciso do programa urgentemente, então vou fazer algo bem simples mesmo. Mas ainda quero ajuda.

Olha o programa que fiz:

#include <stdio.h>
#include <stdlib.h>
#define max 10

void push(int stack[], int *top, int value)
{
if(*top<max)
{
*top=*top+1;
stack[*top]=value;
}
else
{
printf("Pilha Cheia!\n");

}
}

void pop(int stack[], int *top, int * value)
{
if(*top>=0)
{
*value=stack[*top];
*top=*top-1;
}
else
{
printf("A pilha já está vazia.\n");

}
}

void checagem(int *top)
{
if(*top>=0)
{
printf("A pilha não está vazia.\n");
}
else
{
printf("A pilha está vazia.\n");

}
}

void lertopo(int stack[], int *top)
{
printf("O topo da pilha e': %d\n", stack[*top]);

}

void listar(int stack[], int *top)
{
printf("O topo e' %d\n \n", stack[*top]);
int i;
for(i=0;i<*top;i++)
printf("%d\n", stack[i]);

}

void arquivar(int stack[],int *top)
{
FILE *p;
int i;
if((p=fopen("taveira.bin", "wb")) == NULL)
{
printf("Erro na abertura do arquivo");
exit(1);
}
for(i=0; i<*top; i++)
putc(stack[i], p);

printf("Gravado!\n");
fclose(p);
}

void abrir(int stack[], int *top, int *value)
{
FILE *p;
int i;
if((p=fopen("taveira.bin", "rb")) == NULL)
{
printf("Erro na abertura do arquivo");
exit(1);
}

if(fread(&stack, sizeof(int),1,p)!=1)
printf("Erro na leitura do arquivo");
for(i=0; i<*top; i++)
printf("%d\n", stack[i]);

fclose(p);
}

int main()
{
FILE *p;
int stack[max];
int *top=-1;
int n,value;
int opt;
do{
printf("Digite sua opção: \n1 -> Adicionar um numero na pilha \n2 -> Retirar um numero da pilha \n3 -> Testar se a pilha está vazia \n4 -> Ler o topo da pilha \n5 -> Listar a pilha \n6 -> Gravar a pilha em um arquivo \n7 -> Ler a pilha contida no arquivo \n0 -> Sair \n");
scanf("%d", &opt);
switch(opt){
case 1: printf("Digite um elemento para ser adicionado: ");
scanf("%d", &value);
push(stack,&top,value); break;
case 2: pop(stack,&top,&value);
printf("O valor retirado foi %d\n", value);break;
case 3: checagem(&top); break;
case 4: lertopo(stack,&top); break;
case 5: listar(stack,&top); break;
case 6: arquivar(stack,&top); break;
case 7: abrir(stack,&top,&value); break;
case 0: break;
default: printf("Opcao Invalida!\n"); break;

}
}while(opt!=0);
return 0;
}

Cara, tudo está dando certo, menos essa parte de gravar no arquivo e ler o arquivo. Estou tendo muitas dificuldades nisso. Como posso salvar e ler o arquivo nesse caso? Veja que eu criei uma função pra criar o arquivo e outra para lê-lo. Tá certo isso? Você pode me ajudar? No caso estou trabalhando somente com números inteiros. Tenta rodar ele aí.

Abraço




3. 100%!

Davi Vieira
dvieira0801

(usa Fedora)

Enviado em 10/09/2010 - 17:49h

Meu irmão, aprendi bastante ctg, cara! Valeu aí pela ajuda. Ajeitei os erros que você apontou e deu certo aqui de primeira.

Ahh, e na parte em que eu coloco:
int *top=-1;

Eu quero dizer que o primeiro elemento q entrar vai ser na posição 0 mesmo. Tanto que quando eu peço para ler o topo antes de colocar qualquer elemento ele acusa erro, pois a condição dada é *top>=0 , sacou?

Abraço e mto obrigado pela ajuda!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts