,关于链表

求助,关于链表
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Student  /* 定义链表结构*/
{
int num;
char name[8];
struct Student * next;
} Stud;
void main()
{
Stud * head,* q,* s;    /*定义链表指针*/
Stud newstd;
head=NULL;    /* 初始化头指针 */
printf("   学生信息记录  \n");
/*下面部分代码将创建空链表*/
head=malloc(sizeof(Stud));    /* 为头结点分配存储空间 */  //...
if(head==NULL)           /*  确保链表成功建立,并返回相应信息*/
{
printf("  没有足够内存空间!\07\n");
return;             /*退出程序 */
}
head->next=NULL;    /* 头结点指针域初始化*/
head->num=0;    /*学号初始化*/
/*下面部分代码在链表中插入数据*/
q=head;
do{
printf("学号(输入0结束):");  /*输入新学生数据*/
scanf("%d",&newstd.num);
if(newstd.num==0)    /*当输入0时终止循环*/
break;
printf("姓名");
scanf("%s",&newstd.name);   
s=malloc(sizeof(Stud));     /* 为新结点分配存储空间 */   //...
if(s==NULL)
{
printf("没有足够的内存空间!\07\n");  /*插入失败*/
break;
}
/*将新结点s加入到链表尾,并修改表尾的指针*/
strcpy(s->name,newstd.name);  //将姓名存入新结点
s->num=newstd.num;   //将学号存入新结点
s->next=NULL;      //设新结点的指针域为空
q->next=s;   //将新结点连接到链表层
q=s;    //链表尾结点后移
}while(1);
printf("结点已插入,链表创建成功。\n");  
/*下面部分代码用于浏览链表*/
q=head->next;   //初始化指针
while(q!=NULL)   //未到链表尾时循环
{
printf("学号:%d   姓名:%s\n",q->num,q->name);
q=q->next;   //移动指针
}
}

提示的错误信息是:cannot convert from 'void *' to 'struct Student *'
        Conversion from 'void*' to pointer to non-'void' requires an explicit cast
请问错在哪里啊? 谢谢

------解决方案--------------------

head=(Stud*)malloc(sizeof(Stud));    /* 为头结点分配存储空间 */  //...
s=(Stud*)malloc(sizeof(Stud));     /* 为新结点分配存储空间 */   //...

------解决方案--------------------

int* p = (int *) malloc (sizeof(int)*N);//分配N个(可根据实际需要替换N)整型存储单元
//照着自己写一个。