I remember tripping over this aspect of self-referential structs.
typedef struct {
char name[20];
struct planet* next; /* <-- the trouble is here */
} planet;
In the middle of the struct definition, which is in the middle of a typedef definition, the compiler doesn't know what a struct planet looks like, but is happy to let you define a pointer to it. The compiler doesn't really need to know what it looks like until you dereference *next. By the time you get to the body of main() you still haven't told the compiler what a struct planet is, only a type called planet which happens to be an unnamed struct.
Consider the following approach.
struct foo {
int bar;
};
typedef struct foo foo_type;
struct foo bar;
foo_type baz;
This shows that the name of the struct is foo and the name of the defined type is foo_type. I could combine them like this:
typedef struct foo {
int bar;
} foo_type;
You can resolve the compiler warning by adding a dummy name to your inline struct definition.
typedef struct planet_struct {
char name[20];
struct planet_struct* next;
} planet;
You will also need to address the memory allocation issue that others have pointed out, but this answers the question you didn't actually ask.
start->next = first;,*firstis the struct, you need the pointer.