/* 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