//----------->插入学生的成绩的函数
student *Information::insert( student *head) 
//插入新结点定义一个指向struct student的结构体指针函数*insert()用来添加考生信息.
{
    cout<<"\t----------------<<请输入新增学生成绩信息>>----------------\n"<<endl;
    p1=(student *)malloc(LEN);
  //使p1指向插入的新结点
    cout<<" 准考证号(8位):";
    cin>>p1->id;
    while(cin.fail())
    {
        cout<<" 对不起您的输入错误,请输入一个正整数: ";
        cin.clear();
        cin.sync();
        cin>>p1->id; //将输入的准考证号存放到p1所指结构体的数组id中
    } 
    
    cout<<" 姓名:";
    cin>>p1->name; //将输入的姓名存放到结构体名为p1的数组name中
    cout<<" 性别:";
    cin>>p1->sex;
   
    cout<<" 数学成绩:";
    cin>>p1->score[0];
    while(cin.fail())
    {
        cout<<" 对不起您的输入错误,请输入一个正整数: ";
        cin.clear();
        cin.sync();
       cin>>p1->score[0];//将输入的数学成绩存放到p1所指结构体的数组score中
    }
    
    cout<<" 物理成绩:";
    cin>>p1->score[1];
     while(cin.fail())
    {
        cout<<" 对不起您的输入错误,请输入一个正整数: ";
        cin.clear();
        cin.sync();
           cin>>p1->score[1];//将输入的物理成绩存放到p1所指结构体的数组score中
    }
    
    cout<<" 英语成绩:";
    cin>>p1->score[2];
    while(cin.fail())
    {
        cout<<" 对不起您的输入错误,请输入一个正整数: ";
        cin.clear();
        cin.sync();
           cin>>p1->score[2];//将输入的英语成绩存放到p1所指结构体的数组score中
    }
    
    cout<<" C语言成绩:";
    cin>>p1->score[3];
    while(cin.fail())
    {
        cout<<" 对不起您的输入错误,请输入一个正整数: ";
        cin.clear();
        cin.sync();
           cin>>p1->score[3];//将输入的C语言成绩存放到p1所指结构体的数组score中
    }
    
    p1->total=p1->score[0]+p1->score[1]+p1->score[2]+p1->score[3];//计算总分 
    p2=head;//将头指针赋给p2
    if(head==NULL) //若没调用次函数以前的头指针head为空
{
  head=p1;p1->next=NULL;
}//则将p1赋给头指针head并将p1所指结构体成员指针next赋空值
    else 
{
  while((p1->id>p2->id)&&(p2->next!=NULL))
  {
   p3=p2;//p3指向原p2指向的结点
            p2=p2->next;
  }//p2后移一个结点
  if(p1->id<=p2->id)
  {
   if(head==p2)
   {
    p1->next=head;
    head=p1;
   }
   //插入到第一个结点之前
   else 
   {
    p3->next=p1;
    p1->next=p2;
   }
        //插入到p3所指结点之后
  }
  else
  {
   p2->next=p1;
   p1->next=NULL;
  }
            //插入到尾结点之后
}
n++;//将学生人数加1
    cout<<"\t----------------<<你输入的学生信息已经成功插入>>----------------"<<endl;
return (head);
}
//------------>删除函数
student *Information::cancel(student *head,long int num)//定义一个指向struct student的结构体指针函数*delete()用来删除考生信息.
{
  
  
    if(head==NULL)//若调用次函数以前的头指针head为空
{
  
     return(head);
  }
else
{
  p1=head;//否则将头指针赋给p1
        while(num!=p1->id&&p1->next!=NULL)//寻找要删除的结点当p1所指的学生准考证号不是输入的学生准考证号并且p1所指的next指针不为空
  {
   p2=p1;
   p1=p1->next;
  }//p2指向原p1指向的结点p1后移一个结点
  if(num==p1->id)//如果输入的学生准考证号是p1所指的学生准考证号//结点找到后删除
  {
   if(p1==head) head=p1->next;//如果head指针和p1指针相等则将下一个结点赋给指针head 
   else 
    p2->next=p1->next;//否则将p1所指结点赋给p2所指结点将要删除的学生信息跳过去
   cout<<" 删除准考证号为"<<num<<"的学生\n";
   n--;//将学生人数减1
     
  }
  return(head);//将头指针返回
}
}
//------------>查找函数
student *Information::find(student *head,long int num) 
//定义一个指向struct student的结构体指针函数*find()用来查找考生信息.
{
if(head==NULL)//若调用次函数以前的头指针head为空
{
   cout<<" 这是一个空表,请先输入考生成绩.\n";
  return(head); 
}
else
{
  p1=head;//否则将头指针赋给p1
  while(num!=p1->id&&p1->next!=NULL)
//寻找结点当p1所指的学生准考证号不是输入的学生准考证号并且p1所指的next指针不为空
  {
   p1=p1->next;
  }//p2指向原p1指向的结点p1后移一个结点
  if(num==p1->id)//如果要查找的学生准考证号是p1所指的学生准考证号
  {
   cout<<"------------------------------------------------------------------------------\n";
            cout<<"准考证号
   姓
  名
   性别
   数学
   物理
   英语
   C++
    平均分
   总分
     \n";
            cout<<"------------------------------------------------------------------------------\n";
            cout<<setw(8)<<p1->id
    <<setw(9)<<p1->name
    <<setw(6)<<p1->sex
    <<setw(7)<<p1->score[0]
    <<setw(7)<<p1->score[1]
          <<setw(7)<<p1->score[2]
    <<setw(7)<<p1->score[3]
    <<setw(10)<<p1->total/4.0
    <<setw(7)<<p1->total<<endl;
   cout<<"------------------------------------------------------------------------------\n";
  }
  else 
   cout<<" 没找到准考证号为"<<num<<"的学生.\n"; //结点没找到
  return(head);
}
}
//------------定义paixu()函数将考生的总分从大到小排列并输出
void
  Information::paixu(student *head) 
{
int i,k,m=0,j;
    student *p[Q];//定义一个指向struct student的结构体指针数组p
   
    if(head!=NULL)//如果头指针是空则继续
{
   m=count(head);
  cout<<"------------------------------------------------------------------------------\n";
        cout<<"
                             *学生考试成绩统计表*\n";
        cout<<"------------------------------------------------------------------------------\n";
        cout<<"准考证号
   姓
  名
   性别
   数学
   物理
   英语
   C++
  平均分
   总分
     名次\n";
        cout<<"------------------------------------------------------------------------------\n";
        p1=head;
        for(k=0;k<m;k++)
  {
   p[k]=p1;
   p1=p1->next;
  }
  for(k=0;k<m-1;k++)
        //选择排序法
   for(j=k+1;j<m;j++)
    if(p[k]->total<p[j]->total)
    {
     p2=p[k];
     p[k]=p[j];
     p[j]=p2;
    }
    //从大到小排列的指针 
    for(i=0;i<m;i++)
    {
  cout<<setw(8)<<p[i]->id
   <<setw(9)<<p[i]->name
   <<setw(6)<<p[i]->sex
   <<setw(7)<<p[i]->score[0]
   <<setw(7)<<p[i]->score[1]
   <<setw(7)<<p[i]->score[2]
   <<setw(7)<<p[i]->score[3]
   <<setw(8)<<p[i]->total/4.0
   <<setw(7)<<p[i]->total
   <<setw(9)<<i+1<<endl;
        cout<<"------------------------------------------------------------------------------\n";
   
    }
}
}
//------------>求各科平均分成绩的函数
void
  Information::average(student *head)
{
    int k,m;
    float arg1=0,arg2=0,arg3=0,arg4=0;
    if(head==NULL)//如果头指针是空则继续
{
  cout<<" 这是一个空表,请先输入考生成绩.\n";
}
else
{
      m=count(head);
      p1=head;
      for(k=0;k<m;k++)
   {
  arg1+=p1->score[0];
        arg2+=p1->score[1];
        arg3+=p1->score[2];
        arg4+=p1->score[3];
        p1=p1->next;
   }
   arg1/=m;arg2/=m;arg3/=m;arg4/=m;
      cout<<"
                             *全班单科成绩平均分*\n";
      cout<<"------------------------------------------------------------------------------\n";
      cout<<" 数学平均分:"<<setw(7)<<arg1
    <<" 物理平均分:"<<setw(7)<<arg2
    <<" 英语平均分:"<<setw(7)<<arg3
    <<" C语言平均分:"<<setw(7)<<arg4<<endl;
      cout<<"------------------------------------------------------------------------------\n";
}
}
//------------------->保存函数.