在下的一个小程序运行时总出错,求指教!该如何处理

在下的一个小程序运行时总出错,求指教!!!
题目:
建立一个学生链表,每个结点包括学号、姓名、性别、年龄。输入一个年龄值,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去,否则,显示没有该年龄的学生。
要求:
1) 用结构体定义学生结点,包括学号、姓名、性别和年龄。
2) 建立学生信息的动态链表。
3) 显示链表中各结点的信息。
4) 删除符合条件的学生信息。
5) 删除后再显示剩下的链表各结点信息。

老师没有教链表的知识,我看了一整天书,然后,用visual studio 2010敲敲敲了一个下午,才弄出一个让自己觉得大功告成的没有语法错误的程序代码,但是,残酷的是:
运行时,根本不符合要求!!!
我想了很久,也迷糊了很久,甚至因此产生困意,所以,不得不请求你们的帮助!!!
来帮我吧!

--------------------------------------下面是代码-------------------
#include <iostream>
using namespace std;

struct sData //学生信息结构体
{
char name[10]; 
char sex[3];
int age, id;
sData *next;
};
sData *list() //学生链表

{
sData *head, *p, *plast;
int snum = 1;
cout<<"\t输入学生信息"<<endl;
cout<<"\t输入学号,姓名,年龄,性别,当输入学号为0时,结束学生信息输入"<<endl;
p= new sData;
cin>>p->name>>p->sex>>p->age>>p->id;
plast = p;
head = p;
while(p->id!=0) 
{
p = new sData;
cin>>p->id;
cin>>p->name;
cin>>p->age;
cin>>p->sex;
snum++;
plast->next = p;
plast = p;
}



plast->next = NULL;
cout<<"学生人数共:"<<snum<<endl;
return head;
}
  void outPut(sData *head) // 输出链表
{
cout<<"\t学号\t"<<"姓名\t"<<"年龄\t"<<"性别\t"<<endl;
while (head!=NULL)
{
cout<<"\t"<<head->id<<"\t"<<head->name<<"\t"<<head->age<<"\t"<<head->sex<<endl;
head = head->next;
}

cout<<endl;
}
sData *deletes(sData *head, int age) // 删除节点(符合年龄的学生)
{
sData *pn,*pl;
pn = head;
if (head == NULL)
{
cout<<"没有任何学生记录"<<endl;
goto finish;
}
while (pn->age==age && pn->next!=NULL)
{
pl = pn;
pn = pn->next;
}
if (pn->age == age)
{
if (pn==head)
head = pn->next;
else 
pl->next = pn->next;
}
else 
cout<<"没有符合条件的学生"<<endl;
finish: return head;
}
sData *showf( sData *head) //输出剩余学生信息
{
cout<<"\t学号\t"<<"姓名\t"<<"年龄\t"<<"性别\t"<<endl;
while (head!=NULL)
{
cout<<"\t"<<head->id<<"\t"<<head->name<<"\t"<<head->age<<"\t"<<head->sex<<endl;
head = head->next;
return head;
}
}
 

 


int main()
{
sData *stu;
stu = list();
outPut(stu);
return 0;
}









------解决方案--------------------
C/C++ code
cin>>p->name>>p->sex>>p->age>>p->id;//这里就错了,改成下面的
cin>>p->id>>p->name>>p->age>>p->sex;

------解决方案--------------------
探讨
谢谢lanmeng521131485大人!
在下愚昧!
修改的地方在哪儿?