El problema me surge cunado implemento listas u otros TDA's que los tengo definidos :
typedef struct nodo {
int elemento;
struct nodo* next
} *nodo;
entonces al hacer malloc , solo tengo el puntero, por ejemplo si hago : nodo n = (nodo )malloc (size of(nodo)), estaría mal porque nodo es un puntero; lo que venía haciendo es nodo n = (nodo )malloc (size of( struct nodo)), pero no se si es correcto
Es correcto, otra opcion seria: n = (nodo )malloc (size of(*n))
Pero no deberías ponerle el mismo nombre (nodo) a dos cosas diferentes: una estructura y un puntero a una estructura, así lo único que se consigue es un código difícil de entender (ademas de que si compilas el código en un compilador de c++ va a dar error). Tampoco deberías usar typedefs para "ocultar" los punteros por la misma razón. Cuando alguien se encuentra definido algo como:
nodo n;
No se sabe lo que significa. Lo logico seria que nodo representase la estructura no el puntero y definir una variable puntero asi:
nodo *n;
Asi queda clarísimo que n es un puntero a un nodo.
La única razón para usar un typedef a un puntero es si necesitamos que esa variable sea totalmente opaca, y el código que la use no va usarla nunca como si fuese un puntero porque ni siquiera va a saber que es un puntero.
Aun así si prefieres usar ese tipo de typedefs, en ese caso para que sea mas entendible, lo mejor es definir el tipo de modo que quede claro que es un puntero, poniéndole algún prefijo delante por ejemplo:
pnodo q;
Asi se intuye que "q" probablemente será un puntero (por tener una "p" delante) a un nodo.
La definición quedaría mas o menos como asi, observa como se hace un typedef de "struct nodo" a "nodo", para que "struct nodo" y "nodo" signifiquen lo mismo (esto es opcional pero es cómodo para ahorrarnos tener que escribir "struct" en las definiciones de las variables), ademas se define tambien el tipo "pnodo" como un puntero:
typedef struct nodo {
int elemento;
struct nodo* next
} nodo, *pnodo;
De modo que:
struct nodo n; // Esto es una variable que guarda una estructura de tipo nodo
nodo n; // Esto tambien es una variable que guarda una estructura de tipo nodo (igual que la definicion anterior)
struct nodo *p; // Puntero a una estructura nodo
nodo *p; // Puntero a una estructura nodo
pnodo q; // Puntero a una estrctutura nodo
Asi el tamaño de la estructura nodo se podría calcular de las siguientes formas:
sizeof(struct nodo)
sizeof(nodo);
sizeof(n);
sizeof(*p);
Y el tamaño del puntero a la estructura nodo se podría calcular de las siguientes formas:
sizeof(struct nodo *)
sizeof(nodo *)
sizeof(pnodo)
sizeof(p)