すごい久しぶりにCのプログラム書くんでちょっとかなりうろ覚えなところがあるんで教えて欲しいのですが

struct LIST{
int val;
struct list *next;
} ;

main()
{
struct LIST root, *p;
p = &root;
p->val = ...;
for(;;){
if((p->next = (struct LIST *)malloc(sizeof(struct LIST))) ==NULL){
printf("malloc error\n");
exit(1);
}
p = p->next;
p->val = ...;
p->next = NULL;
}
}

この自分と同じ型へのポインタを持つやつの扱い方がなんかあやふやなんですが
なんか書いててすごく違和感があるんですがこの書き方は変で普通こう書くって部分はありますか?
(実際に書いてるのはこのデータ構造ではないのでこの場合特有というのではなく、一般的な話で)