C has four different namespaces, where the structure tag namespace is one of them. Hence:
struct foo { int bar; };
does not define a new type in the general sense. When you only have a structure tag, you need to prepend the keyword 'struct' in object declarations like this:
foo b; /* error */
struct foo b; /* correct */
In addition, you can instantiate a new object right away in the definition like this:
struct foo { int bar; } baz;
Where baz is an object of structure type foo. However, one often wants to define a structure as a new type, to save some writing. A complete type does not reference structure tags, so you can omit the 'struct' prefix during declarations.
typedef struct foo { int bar; } baz;
Still lets you declare objects with 'struct foo', since foo is the struct tag. But now it is promoted to a full type in the "normal" type namespace, where it is known as type baz. So with a typedef, the 'baz' field(s) has different semantics.
Unless you need to declare pointers to the structure type inside itself (linked lists, tree structures), omit it. Adding one which isn't required just pollutes the namespace.