小白关于仿照内核的C语言双向循环链表问题

首先代码如下:
    #include 
    #include 
    #define LONG 10

    struct list{
    struct list * next;
    struct list * prev;
    };

     struct student{
    char name[10];
         int  id;
         struct list * plist;
    };
    /*添加节点到链表*/
    void __add_list(struct list * new_list,struct list * prev,struct list * next){
    printf("next->prev = new_list\n");
    next->prev = new_list;
    printf("new_list->next = next\n");
    new_list->next = next;

    printf("new_list->prev = prev\n");
    new_list->prev = prev;
    printf("prev->next = new_list\n");
    prev->next = new_list;
    }
    /*初始化头部*/ 
    void init_list(struct list * headlist){
    headlist->next = headlist;
    headlist->prev = headlist;
    }

    int main(){
    int i=0;
    struct student * students=NULL;
    struct list * headlist = NULL;
    headlist = (struct list *)malloc(sizeof(struct list));
    if(!headlist){
    printf("malloc failed ...\n");
    return 0;
    }
    /*初始化头部*/
    init_list(headlist);
    /*循环10次插入10个节点进链表*/ 
    for(i=0;i     students = (struct student *)malloc(sizeof(struct student));
    if(!students){
    printf("students malloc failed ...\n");
    return 0;
    }
    scanf("%s",students->name); 
    students->id = 10+i;
    __add_list(students->plist,headlist,headlist->next);
    }
    return 0;
    }
程序运行结果如下:
    xiaoming
    next->prev = new_list
    new_list->next = next
然后程序就崩溃了
但是如果我修改了struct student结构体
原来是:
    struct student{
    char name[10];
    int  id;
    struct list * plist;
    };
修改后:
    struct student{
    struct list * plist;
    char name[10];
    int  id;
    };
程序运行结果为:
    xiaoming
    next->prev = new_list
    new_list->next = next
    new_list->prev = prev
    prev->next = new_list
    students malloc failed ...

谁能帮我解释一下到底是为什么。。。。。。。。。。。。。。。。。。。。。。。。

http://blog.csdn.net/fisherwan/article/details/19801993