C语言 结构体指针申请内存空间解决方案

C语言 结构体指针申请内存空间
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TSIZE 45
struct film {
  char title[TSIZE];     
  int rating;
  struct film *next;     /*指向列表的下一个结构*/      
}stu;
int main(int argc, char *argv[])
{
  struct film *head=NULL;
  struct film *prev,*current;
  char input[TSIZE];
  
  /*收集电影信息*/
  puts("请输入电影标题");
  while(gets(input)!=NULL && input[0]!='\0')
  {
        // current=&stu;
         current=(struct filem *)malloc(sizeof(struct film));   /*申请内存空间*/         
         if(head==NULL)
           head=current;
         else 
           prev->next=current;                                 
         current->next=NULL;
         strcpy(current->title,input);
         puts("请输入电影等级");
         scanf("%d",&current->rating);
         while(getchar()!='\n')
           continue;      
         puts("请输入下一个电影标题");
         prev=current;      
         
  }
  /*给出电影列表*/
  if(head==NULL) 
                 printf("没有数据");
  else
                 printf("下面的电影数据");               
  current=head;
  while(current!=NULL)
  {
         printf("标题[%s],等级[%d]\n",current->title,current->rating);
         current=current->next;
  }
  
  /*任务完成 清空内存*/  
  current=head;
  while(current!=NULL)
  {
         free(current);
         current=current->next;
         
  }
  printf("再见");
  
  
  system("PAUSE");
  return 0;
}

 prev->next=current;                                 
 current->next=NULL;
这两句是啥意思啊??current不应该是结构体内存空间的首地址吗??为什么prev->next还指向首地址啊??prev=current;    这句话啥意思啊??prev指向结构体的内存空间的首地址吗??

------解决方案--------------------
这是C Primer Plus当中的的例题吧?
current只是个临时指针,其值是随着接收malloc所产生的指针而不断变化的。它的作用是让通过malloc分配内存而新产生的链表成员,以prev-next = current的方式一个一个接续下去。
当链表为空,即head == NULL时,首先将第一个产生的链表成员的指针赋给head,这样整个链表就有了head(第一个元素了)。
否则,即链表不为空,则将新产生的链表成员通过prev-next = current的方式挂到前面已经产生的链表成员的next指针上(成为新的链表末端成员),以此类推,直到不再产生新的链表成员为止。

 
while(gets(input)!=NULL && input[0]!='\0')
{
         current=(struct filem *)malloc(sizeof(struct film));   /*产生新的链表成员*/         
         if(head==NULL)
           head=current;    //如果链表为空,则将第一个产生的链表成员的指针赋给head
         else 
           prev->next=current;  //将后来产生的链表成员挂在链表成员的next指针上,使其成为新的链表末端成员
         current->next=NULL;   //开放新的链表尾巴的next指针,以便接收可能会挂上来的下一个新的末端成员
         strcpy(current->title,input);
         puts("请输入电影等级");
         scanf("%d",&current->rating);
         while(getchar()!='\n')
           continue;      
         puts("请输入下一个电影标题");
         prev=current;                  //记录当前新产生的链表末端成员的指针,这个指针即为