> malloc した後、freeで開放しないでいいの?
最近の PC の OS なら間違いなく main 終了時に自動的にメモリが開放される。
まあ、本当はちゃんと開放した方がいいとは思う。
ここでは、プログラムが長くなるから省略したと好意的に解釈しておく。
開放方法も説明しなくちゃいけないし。

> それと2度目の while の直前で a = b してるけどこれってなんの為にしてるんですか?
色々プログラムを書き換えた時に、消し忘れたんじゃないかな?
他にも色々と洗練されてない。
書き換えるならこんなところか。

int main() {
 struct list *a, *b;
 char str[16];

 for(b = NULL; ; b = a) {
  printf("整数を入力(Eで終了)-->");
  scanf("%s", str);
  if(strcmp(str, "E") == 0) break;

  a = malloc(sizeof(struct list));
  a->num_data = atoi(str);
  a->nextlist = b;
 }

 printf("入力された整数は");
 for( ; a != NULL; a = a->nextlist) {
  printf("%d, ", a->num_data);
 }

 return 0;
}