printf("%s\n",menu[i]);
printf("\n输入要进行的操作(1-7):
");
}
/*****************************************************************
*函数名:
MenuSelect
*
*描述:
选择菜单选项,返回选择的选项
*
*入口参数:
无
*
*出口参数:
整型数据
******************************************************************/
intMenuSelect()
{
intkey;
PrintMenu();
scanf("%d",&key);
returnkey;
}
/*****************************************************************
*函数名:
Init
*
*描述:
初始化单链表。
也就是释放链表中的所有数据
*
*入口参数:
无
*
*出口参数:
无
******************************************************************/
voidInit()
{
STUDENT*p,*ptr;//定义两个临时指针变量p,ptr
p=head;
ptr=head;//将两个临时变量指向头指针head;
while(ptr!
=NULL)
{
ptr=ptr->next;//ptr指向下一个结构数据
free(p);//释放p所指向的结构数据的内存
p=ptr;//将p指向ptr所指向的数据
}
head=NULL;//将head指向NULL
}
/*****************************************************************
*函数名:
create
*
*描述:
创建单链表
*
*入口参数:
无
*
*出口参数:
无
******************************************************************/
voidcreate()
{
STUDENT*pt,*pth=NULL;//定义两个指针变量:
pt指向即将申请新的数据内存,pth指向当前数据
while
(1)
{
pt=(STUDENT*)malloc(sizeof(STUDENT));//让pt指向新申请的内存空间
InputData(pt);//输入数据,存放到pt所指向的结构数据。
注意让pt的next指向NULL
if(strcmp(pt->no,"@")==0)
{
free(pt);//释放pt所指向的内存空间
break;//退出循环
}
elseif(head==NULL)
{
pth=pt;
head=pt;//将头指针head和pth指向pt
}
else
{
pth->next=pt;//将pth的next指向pt;
pth=pt;//将pth指向pt;
}
}
}
/*****************************************************************
*函数名:
print
*
*描述:
打印单链表中所有数据
*
*入口参数:
无
*
*出口参数:
无
******************************************************************/
voidprint()
{
inti=0;
STUDENT*p;//第一个指针p
p=head;//将p指向head
printf("\n");
printf("******************************STUDENT******************************\n");
printf("|rec|学号|姓名|成绩1|成绩2|成绩3|总成绩|平均成绩|\n");
printf("|---|----------|------------|------|------|------|------|---------|\n");
//打印表头
while(p!
=NULL)
{
printf("|%3d|%10s|%-12s|%6.1f|%6.1f|%6.1f|%6.2f|%9.1f|\n",
++i,p->no,p->name,p->score[0],p->score[1],p->score[2],
p->sum,p->average);//打印p所指向的结构中的所有数据。
注意打印数据间的分隔线
p=p->next;//将p指向p的下一个结构数据
}
printf("********************************END********************************\n");
//打印表尾
}
/*****************************************************************
*函数名:
Delete
*
*描述:
删除指定学号的记录
*
*入口参数:
无
*出口参数:
无
******************************************************************/
voidDelete()
{
STUDENT*p,*pth;//定义两个指针p,pth
charno[11];//定义一个整数no(用来存储输入的学号)
printf("输入要删除学生的学号:
");
scanf("%s",no);//用输入语句输入一个学号存储到no中
p=head;pth=head;//将p和pth都指向头指针
if(strcmp(p->no,no)==0)//也就是若头指针指向的数据需要删除
{
head=head->next;//将head指针指向head的下一个数据;
free(p);//释放p所指向的数据
}
else
{
p=p->next;//将p指向p的下一个数据
while(p!
=NULL)
{
if(strcmp(p->no,no)==0)//找到了要删除的数据
{
pth->next=p->next;//将pth的next指向p的next
free(p);//释放p
break;//退出循环
}
else
{
pth=pth->next;//将pth指向pth的next或将pth指向p
p=p->next;//将p指向p的next
}
}
}
}
/*****************************************************************
*函数名:
append
*
*描述:
增加学生记录
*
*入口参数:
无
*
*出口参数:
无
******************************************************************/
voidappend()
{
STUDENT*p,*pth;//定义两个指针变量p,pth
pth=head;//将pth指向head
while(pth->next!
=NULL)
{
pth=pth->next;//ptr指向ptr的next
}
p=(STUDENT*)malloc(sizeof(STUDENT));//将p指向新申请的内存空间
InputData(p);
p->next=NULL;//数据数据存储到p所指向的内存空间,注意将p的next置为NULL
pth->next=p;//将ptr的next指向p
}
/*****************************************************************
*函数名:
InputData
*
*描述:
输入学生信息
*
*入口参数:
指针
*
*出口参数:
无
******************************************************************/
voidInputData(STUDENT*ptr)
{
inti;
printf("输入学号:
");
scanf("%s",ptr->no);
if(strcmp(ptr->no,"@")==0)
return;
printf("输入姓名:
");
scanf("%s",ptr->name);
for(i=0;i<3;i++)
{
printf("输入成绩:
");
scanf("%f",&ptr->score[i]);
}
ptr->sum=0;
ptr->average=0;
ptr->next=NULL;//不要忘记这一步
}
/*****************************************************************
*函数名:
computer
*
*描述:
计算学生总成绩和平均成绩
*
*入口参数:
无
*
*出口参数:
无
******************************************************************/
voidcomputer()
{
STUDENT*p;
p=head;
for(;p;p=p->next)
{
p->sum=p->score[0]+p->score[1]+p->score[2];
p->average=(p->score[0]+p->score[1]+p->score[2])/3;
}
}