Enviado em 30/03/2013 - 11:59h
Galera eu to estudando estrutura de dados na faculdade, porem meu professor nao é muito pratico. Consegui este codigo e dei uma implementada, mas fiz os comentarios onde no codigo eu nao consegui entender. O codigo ta rodando tranquilo, estou usando NetBeans no slackware. So que minhas duvidas sao apenas para fins didaticos mesmo.
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct pilha {
int numero;
pilha * proximo;
};
void inserir(pilha **top) {
pilha * novo;
//ponteiro que aponta para novo elemento inserido.
//Mas, por que eu tenho que utilizar ponteiro para apontar para o valor inserido?
//Como o dado sera inserido pelo usuario, precisa alocar memoria para o ponteiro.
novo = (pilha *) malloc(sizeof(pilha));
// Traduzindo o comando, Eu entendi desta forma: novo recebera(=) um ponteiro do tipo pilha(pilha *), alocando memoria atraves do comando malloc, no tamanho de(sizeof()).
// Nao entendi o porque é colocado o (pilha) novamente, se o tipo ja foi estipulado antes.
if (novo == NULL) {
printf("\nERRO!! Sem memoria\n");
exit(1);
} else {
printf("Informe o numero: \n");
scanf("%d", &novo->numero); //Coloca dentro da variavel numero estipulada na estrutura.
//Aqui abaixo eu nao consegui entender direito a mecanica.
//Ele diz que *top refere-se ao TOPO da pilha, mas nao entendi aonde no codigo que é estipulado isto.
if (*top == NULL) { //Se o topo estiver vazio, ou seja, nao tem elementos na pilha.
novo->proximo = NULL; // O ponteiro proximo aponta pra nada.
} else {
novo->proximo = *top; //Se o topo nao estiver vazio, o ponteiro proximo aponta para topo.
}
*top = novo; //e o topo recebe o novo elemento.
}
}
void listar(pilha *top) {
pilha * aux;
if (top == NULL) { //Aqui a mesma coisa, nao entendi onde ele diz que top refere-se ao topo.
printf("\nPilha vazia!!\n");
} else {
aux = top;
while (aux != NULL) {
printf("%d \n", aux->numero);
aux = aux->proximo;
}
}
}
int main(int argc, char** argv) {
pilha * topo = NULL;
int op = 0;
do {
printf("Digite a OP (1-inserir, 2-listar, 3-PARAR) \n");
scanf("%d", &op);
switch (op) {
case 1:
inserir(&topo);
break;
case 2:
printf("\nLISTA COMPLETA: \n");
listar(topo);
break;
default:
break;
}
} while (op != 3);
return 0;
}