/*
Uisleandro CS
Descobra também uma nova utilidade para o #define !
Observe que é necessário fazer algumas modificações para
usá-lo em listas, pilhas e filas, etc.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// #define POINTER_ALLOC(tp) (tp *)malloc(sizeof(tp))
/*
Inicializa o 'nodo' com o tipo desejado (aloca o tamanho desejado).
Aloca memória para o nodo..
Aloca memória para nodo->value com o tamanho do tipo passado como parâmetro.
Cita o próximo de nodo como NULL
*/
#define NODO_INICIA(no,tp)\
no = (nodo *)malloc(sizeof(nodo));\
if(!no) exit(1);\
no->value = malloc(sizeof(tp));\
if(!no->value) exit(1);\
no->next = (struct nodo *)NULL
/*
Retorna o valor apontado pelo ponteiro, faz o cast para o tipo desejado
*/
#define NODO_GET_VALUE(no,tp) (*((tp *)no->value))
/*
Usa um ponteiro para mudar o valor apontado pelo 'nodo';
Faz a conversão de tipos (cast);
Passa uma cópia do valor passado como parametro para o espaço alocado anteriremente.
*/
#define NODO_SET_VALUE(no,tp,val) *((tp *)no->value) = val
/*
Libera espaço na memória ocupado pelo nodo
*/
#define NODO_EXCLUI(no) free(no->value); free(no)
typedef struct nodo
{
void * value;
struct nodo * next;
} nodo;
typedef struct
{
char nome[30];
int idade;
} pessoa;
int main()
{
nodo * n;
pessoa ps;
strcpy(ps.nome,"nome1");
ps.idade = 10;
printf("pessoa = {\"%s\" %d}; \n\n", ps.nome, ps.idade);
NODO_INICIA(n, pessoa);
NODO_SET_VALUE(n, pessoa, ps);
printf("n->value = {\"%s\", %d};\n\n", NODO_GET_VALUE(n, pessoa).nome, NODO_GET_VALUE(n, pessoa).idade);
//pessoa q = NODO_GET_VALUE(n, pessoa);
//printf("q = {\"%s\", %d};\n\n", q.nome, q.idade);
NODO_EXCLUI(n);
NODO_INICIA(n, int);
NODO_SET_VALUE(n, int, 100);
printf("n->value = %d;\n\n", NODO_GET_VALUE(n, int));
NODO_EXCLUI(n);
NODO_INICIA(n, double);
NODO_SET_VALUE(n, double, 100);
printf("n->value = R$%.2f;\n\n", NODO_GET_VALUE(n, double));
NODO_EXCLUI(n);
system("pause");
return 0;
}
quinta-feira, 3 de dezembro de 2009
nodo_generico.c
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário