以下のコードは、5つの数値を入力で受け取り、受け取った順にnumberlistとして出力しその後、逆順でnumberlistを出力するプログラムです。

NULLの扱いが悪いのか、双方向リスト自体が間違っているのかよく分かりません。

#include <stdio.h>
#include <stdlib.h>

struct number{
  int num;
  struct number *next, *prev;
};

int main(){
  struct number *p, *head, *start, *last;
  int i;
  start=(struct number *)malloc(sizeof(struct number));
  last=(struct number *)malloc(sizeof(struct number));
  head=(struct number *)malloc(sizeof(struct number));
  head->next=head;
  head->prev=head;
  head->num=NULL;
  printf("input 5 number:");
  for(i=0;i<5;i++){
    if(i==0){
      p=(struct number *)malloc(sizeof(struct number));
      p->prev=head;
      start=p;
    }
    p->next=(struct number *)malloc(sizeof(struct number));
    (p->next)->prev=p;
    scanf("%d", &p->num);
    p=p->next;
    last=p;
  }
  last->next=head;
  p=start;
  printf("number list:");
  while(p->num!=NULL){
    if(p==last){
      printf("%d", p->num);
    }else{
    printf("%d, ", p->num);
    }
    p=p->next;
  }
  printf("\n");
  p=last;
  printf("number list:");
  while(p->num!=NULL){
    if(p==start){
      printf("%d", p->num);
    }else{
    printf("%d, ", p->num);
    }
    p=p->prev;
  }
  printf("\n");
  return 0;
}