用链表给学生成绩排序
Ⅰ 建立2个班学生成绩的无需链表,其中每个班包含10个节点数据,将每个班的成绩链表按成绩高低排序后输出。将
这个是我自己做的,你是想修改改你的还是。。?
#include<iostream>
#include<cstring>
using namespace std;
struct student
{
long num;
int score;
char name[10];
student *next;
};
student *CreatClass(int n) //创建班级
{
student *head,*p1,*p2;
head=p1=p2=NULL;
for(int i=0;i<n;i++)
{
p1=new student;
if(i==0)
{
head=p1;
cout<<"姓名:";cin>>p1->name;
cout<<"学号:";cin>>p1->num;
cout<<"分数:";cin>>p1->score;
}
else
{
p2->next=p1;
cout<<"姓名:";cin>>p1->name;
cout<<"学号:";cin>>p1->num;
while(p2->num==p1->num){cout<<"学号重复!请重新输入:"<<endl;
cout<<"学号:";cin>>p1->num;}
cout<<"分数:";cin>>p1->score;
}
p2=p1;
}
p1->next=NULL;
return head;
}
student *SortScore(student *head,int n) //班级成绩排序
{
student *p1=head,*p2;
for(int i=1;i<n;i++)
{
p1=head;
for(int j=0;j<n-i;j++)
{
p2=p1;
p1=p1->next;
if(p2->score<p1->score)
{
int temp1=p2->score;p2->score=p1->score;p1->score=temp1;
long temp2=p2->num;p2->num=p1->num;p1->num=temp2;
char temp3[10];strcpy(temp3,p2->name);strcpy(p2->name,p1->name);strcpy(p1->name,temp3);
}
}
}
return head;
}
student *CombineClass(student *head1,student *head2) //合并班级
{
student *p1=head1,*p2=head2;
cout<<"两班合并成绩排序输出:"<<endl;
while(p1->next!=NULL)
{
p1=p1->next;
}
p1->next=p2;
return head1;
}
void FindStudent(student *head,int n) //查找学生
{
student *p1=head;
int number;
cout<<endl<<"输入要查找的学生学号:";cin>>number;
for(int i=0;i<n;i++)
{
if(p1->num==number){cout<<"该学生信息为:"<<endl<<"姓名:"<<p1->name<<" 学号"<<p1->num<<" 分数:"<<p1->score<<endl;break;}
else {p1=p1->next;}
}
if(!p1){cout<<"无此学生!"<<endl;}
}
void PrintClass(student *head,int n) //输出班级
{
student *p1=head;
for(int i=0;i<n;i++)
{
cout<<"姓名:"<<p1->name<<" 学号:"<<p1->num<<" 分数:"<<p1->score<<endl;
p1=p1->next;
}
}
int main()
{
student *ptr1,*ptr2,*ptr3;
int m,n;
cout<<"输入1班人数:";cin>>m;
cout<<"输入1班"<<m<<"名学生信息:"<<endl;
ptr1=CreatClass(m);
cout<<endl<<"输入2班人数:";cin>>n;
cout<<"输入2班"<<n<<"名学生信息:"<<endl;
ptr2=CreatClass(n);
cout<<endl<<"1班成绩排序输出:"<<endl;
ptr1=SortScore(ptr1,m);
PrintClass(ptr1,m);
cout<<endl<<"2班成绩排序输出:"<<endl;
ptr2=SortScore(ptr2,n);
PrintClass(ptr2,n);
cout<<endl;
ptr3=CombineClass(ptr1,ptr2);
int s=m+n;
ptr3=SortScore(ptr3,s);
PrintClass(ptr3,s);
FindStudent(ptr1,s);
return 0;
}
Ⅱ c语言!!!程序设计:建立一个学生信息链表,包括学号,姓名,成绩.(实现添加,删除,查询,排序,平均)
#include<iostream>
using namespace std;
struct stu{
char name[20];
int num;
int age;
char sex;
int grade;
struct stu *next;
};
struct stu *mythis,*mynew;
void newrecord(struct stu *head)
{
mythis=head->next;
while(mythis!=NULL)
mythis=mythis->next;
mynew=(struct stu *)malloc(sizeof(struct stu));
cin>>mynew->name>>mynew->num>>mynew->age>>mynew->sex>>mynew->grade;
mynew->next=NULL;
if(mythis==NULL)
{
mythis=(struct stu *)malloc(sizeof(struct stu));
mythis=mynew;
}
}
void listall(stu *head)
{
mythis=head->next;
while(mythis!=NULL)
{
cout<<mythis->name<<mythis->num<<mythis->age<<mythis->sex<<mythis->grade;
mythis=mythis->next;
}
}
int main()
{
char decide;
struct stu *head;
head=(struct stu *)malloc(sizeof(struct stu));
head->next=NULL;
while(1)
{
cout<<"Please input decide:"<<endl;
cin>>decide;
if(decide=='n')
newrecord(head);
else
if(decide=='1')
listall(head);
else
return 0;
}
}
拓展资料
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
Ⅲ 设计一程序将文件中的学生信息读出,按先后顺序建立链表,并对链表中的学生记录按总分降序排序,要排名。
其他的都给你写出来了 排序很简单的 你自己就可以写 我没有时间给你写了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct student
{char num[6];
char name[8];
int tax; /*名次*/
int english;
int math;
int score;
struct student *next;
}STUDENT;
STUDENT *head = NULL,*tel=NULL;
void Score_Sort();//排序
void Student_Information_show();//显示所有学生信息
void Stident_Read_from_File();
void Student_Add(STUDENT stu);
void Score_Sort()
{
}
void Student_Information_show()
{
STUDENT *temp;
temp=head;
for(temp;temp!=NULL;temp=temp->next)
{
printf("%s %s %d %d %d \n",temp->num,temp->name,temp->english,temp->math,temp->score);
}
}
void Stident_Read_from_File()
{
FILE *file1;
char str[255];
char num[6],name[8];
int english, math;
STUDENT STU;
file1=fopen("Student.txt","r+");
if(file1!=NULL)
{
while((fgets(str,255,file1))!=NULL)
{
sscanf(str,"%s %s %d %d",num,name,&english,&math);
strcpy(STU.num,num);
strcpy(STU.name,name);
STU.english=english;
STU.math=math;
STU.score=english+math;
STU.tax=0;
Student_Add(STU);
}
}
}
void Student_Add(STUDENT stu)
{
STUDENT *temp;//创建一个新的节点并申请空间
temp=(STUDENT *)malloc(sizeof(STUDENT));
strcpy(temp->num,stu.num);
strcpy(temp->name,stu.name);
temp->english=stu.english;
temp->math=stu.math;
temp->tax=stu.tax;
temp->score=stu.score;
temp->next =NULL;
if(head==NULL)
{
head=temp;
}
else
{
tel->next = temp;
}
tel=temp;
}
int main()
{
Stident_Read_from_File();
Student_Information_show();
return 0;
}
Ⅳ C语言学生成绩管理系统中的链表排序怎么做
用冒泡排序!虽然效率低!比如:a[N]={3,2,5,4,2,6}for(int i = 0;i<(数组长度/2);i++) for(int j=i+1;j<数组长度;j++) if(a[i]>a[j]) { int temp = a[i]; a[i] = a[j]; a[j] = temp; }从第一个元素开始,依次往后面的元素比较,小的放前,大的放后,基本方法就这样了~!
Ⅳ 以下c语言菜单(关于使用链表排序成绩)如何改动
你的代码不全,看不到具体链表构建。
从现有代码看:
1、建议结构指针初始化版NULL(习惯)。struct person *head=NULL,*head1=NULL;
2、既然你定义权了头指针head,正常习惯头指针是不存放数据的,只是next指向链表第一个节点。那么循环链表那里应该写while(p->next)而不是while(p!=NULL)。(除非你的head就是第一个节点)。
3、如像我上条所述,head是头指针,循环改成while(p->next),那么链表冒泡排序那里,p1=p->next;可以写p1=p->next->next;(当然你写p1=p->next;也不错,就是循环次数多点)
Ⅵ C语言如何对链表的数进行排序
同学,给你一段代码,里面涵盖了链表的冒泡排序!
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;/*data代表成绩分数*/
struct node *next;
}LNode,*LinkList;
LinkList Creat(void)/*创建链表,结束标志为当输入的数据为0!*/
{
LinkList H,p1,p2;
int n;
n=0;
p1=p2=(LinkList)malloc(sizeof(LNode));
printf("输入数据:");
scanf("%d",&p1->data);
H=NULL;
while(p1->data!=0)
{
n=n+1;
if(n==1)
H=p1;
else
p2->next=p1;
p2=p1;
p1=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p1->data);
}
p2->next=NULL;
return(H);
}
LinkList Sort(LinkList SL)/*递增排序函数:入口参数:链表的头指针,此为链表中的排序函数*/
{
LinkList p,q;
int temp;
for(p=SL;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data>q->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
return SL;
}
int main()
{
LinkList L,S,K;
L=Creat();
printf("初始化的单链表数据序列为:\n");
for(S=L;S!=NULL;S=S->next)
printf("%d ",S->data);
Sort(L);
printf("\n按递增顺序排序后的序列为:\n");
for(K=L;K!=NULL;K=K->next)
printf("%d==>",K->data);
return 0;
}
Ⅶ q建立2个班学生成绩的无需链表,其中每个班包含10个节点数据,将每个班的成绩链表按成绩高低排序后输出。
#include <iostream.h>
class node
{
public:
int num,a;
char b[30];
node *next;
}*p1,*p2;node *head1=NULL;node *head2=NULL;
node*creat1()
{
node *p1,*p2;
p1=new node;
head1=p1;
p2=p1;
cout<<"请输入学号,以0结束:"<<endl;
cin>>p1->num;
if(p1->num!=0)
{
cout<<"请输入学生名字:"<<endl;
cin>>p1->b;
cout<<"请输入成绩:"<<endl;
cin>>p1->a;
}
else
{
delete p1;
p2=NULL;
p2->next=NULL;
head1=NULL;
return head1 ;
}
while(p1->num!=0)
{
p2=p1;
p1=new node;
cout<<"请输入学号,以0结束:"<<endl;
cin>>p1->num;
if(p1->num!=0)
{
cout<<"请输入学生名字:"<<endl;
cin>>p1->b;
cout<<"请输入成绩:"<<endl;
cin>>p1->a;
}
p2->next=p1;
}
delete p1;
p2->next=NULL;
return head1;
}
node*creat2()
{
node *p3,*p4;
p3=new node;
head2=p3;
p4=p3;
cout<<"请输入学号,以0结束:"<<endl;
cin>>p3->num;
if(p3->num!=0)
{
cout<<"请输入学生名字:"<<endl;
cin>>p3->b;
cout<<"请输入成绩:"<<endl;
cin>>p3->a;
}
else
{
delete p3;
p4=NULL;
p4->next=NULL;
head2=NULL;
return head2 ;
}
while(p3->num!=0)
{
p4=p3;
p3=new node;
cout<<"请输入学号,以0结束:"<<endl;
cin>>p3->num;
if(p3->num!=0)
{
cout<<"请输入学生名字:"<<endl;
cin>>p3->b;
cout<<"请输入成绩:"<<endl;
cin>>p3->a;
}
p4->next=p3;
}
delete p3;
p4->next=NULL;
return head2;
}
void shownode(node*head)
{
cout<<"学生信息如下:"<<endl;
while (head!=NULL)
{
cout<<"学号"<<" "<<"名字"<<" "<<"成绩"<<endl;
cout<<head->num<<" "<<head->b<<" "<<head->a<<endl;
head=head->next;
}
}
void findnode(node*head,int num)
{
cout<<"查找学号:";
cin>>num;
while(head!=NULL)
{
if(head->num==num)
{
cout<<"学号:"<<head->num<<" "<<"名字:"<<head->b<<" "<<"成绩:"<<head->a<<endl; //这点让我好找啊!!!!!
return;
}
if (head->next==NULL)
{
cout<<"无此学生"<<endl;
}
head=head->next;
}
}
void insert (node*head,int a)
{
node *p1,*p2;
int tnum;
int ta;
//char tb[30];
for (p1=head; p1; p1=p1->next)
{
for (p2=head; p2->next; p2=p2->next)
{
if (p2->a<p2->next->a)
{
ta=p2->a;
p2->a=p2->next->a;
p2->next->a=ta;
tnum=p2->num;
p2->num=p2->next->num;
p2->next->num=tnum;
/* tb=c->b;
c->b=c->next->b;
c->next->b=tb;*/
}
}
}
}
void hebing(node*head2)
{
node *p;
while(head1)
{
p=head1;
head1=head1->next;
}
p->next=head2; //这点让我好找啊(为什么p改为head1就不行呢?我觉得对他反而错,操)
head2=head2->next;
}
int main ()
{
int num,a,c;
node*head1=NULL;
node*head2=NULL;
cout<<"----------------------以下是1班成绩的统计------------------------"<<endl;
head1=creat1 ();
insert (head1, a);
shownode(head1);
cout<<"---------------------以下是2班成绩的统计------------------------"<<endl;
head2=creat2 ();
insert (head2, a);
shownode(head2);
cout<<"---------------------以下是两个班成绩的统计------------------------"<<endl;
hebing(head2);
insert (head1, a);
shownode(head1);
findnode(head1, num);
return 0;
}
Ⅷ 数据结构 程序设计 用双向循环链表建立一个学生管理系统,要求实现插入,删除,排序,修改等功能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student
{
int num;
char name[10];
float score[3];
float total;
struct student *next,*prior;
}DLNode,*DLinkList;
//建立链表
DLinkList Creat_DLinkList()
{
int x;
char y[10];
float s[3];
DLinkList DL=NULL;
DLNode *p=NULL,*q=NULL;
DL=malloc(sizeof(DLNode));
if(DL==NULL)
exit(0);
q=DL;
DL->next=NULL;
DL->prior=NULL;
printf("\nPlease enter students' information:\n");
scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
while(x!=0)
{
int i;
p=malloc(sizeof(DLNode));
p->num=x;
strcpy(p->name,y);
for(i=0;i<3;i++)
p->score[i]=s[i];
p->total=p->score[0]+p->score[1]+p->score[2];
q->next=p;
p->prior=q;
p->next=DL;
q=p;
scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
}
DL->prior=q;
return q;
}
//查找
int search(DLinkList r,int n)
{
DLNode *p,*h;
h=r->next;
p=h->next;
while(p!=h)
{
if(p->num==n)
return 1;
p=p->next;
}
return 0;
}
//添加
DLinkList add(DLinkList r)
{
int x;
char y[10];
float s[3];
DLNode *h=r->next,*p=NULL;
p=malloc(sizeof(DLNode));
printf("\nPlease enter students' information:\n");
scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
while(x!=0)
{
int i;
p=malloc(sizeof(DLNode));
p->num=x;
strcpy(p->name,y);
for(i=0;i<3;i++)
p->score[i]=s[i];
p->total=p->score[0]+p->score[1]+p->score[2];
p->prior=r;
r->next=p;
p->next=h;
h->prior=p;
r=p;
scanf("%d%s%f%f%f",&x,y,&s[0],&s[1],&s[2]);
}
return r;
}
//删除
void delete(DLinkList r)
{
char na[10];
DLNode *h=r->next;
DLNode *p=h->next;
DLNode *q=NULL;
while(p!=h)
{
q=p->next;
while(q!=h)
{
if(!strcmp(q->name,p->name))
{
q->prior->next=q->next;
q->next->prior=q->prior;
free(q);
}
q=q->next;
}
p=p->next;
}
}
//修改
int modify(DLinkList r,int n)
{
float s[3];
int i;
DLNode *h=r->next;
DLNode *p=h->next;
while(p!=h)
{
if(p->num==n)
{
printf("\nPlease enter new score:\n");
scanf("%f%f%f",&s[0],&s[1],&s[2]);
for(i=0;i<3;i++)
p->score[i]=s[i];
p->total=p->score[0]+p->score[1]+p->score[2];
break;
}
p=p->next;
}
if(p==h)
return 0;
else
return 1;
}
//排序
DLinkList sort(DLinkList r)
{
DLNode *t=NULL,*s=NULL;
DLNode *h=r->next;
DLNode *p=h->next;
DLNode *q=NULL;
while(p!=h)
{
q=h->next->next;
while(q!=h)
{
t=q->prior;
if(t->total<q->total)
{
s=t->prior;
t->next=q->next;
q->next->prior=t;
t->prior=q;
q->next=t;
q->prior=s;
s->next=q;
q=t;
}
q=q->next;
}
p=p->next;
}
return h->prior;
}
//输出
void print_DLinkList(DLinkList r)
{
int i;
DLNode *p,*h;
h=r->next;
p=h->next;
while(p!=h)
{
printf("number:%3d\tname:%s\tscore:%5.2f\t%5.2f\t%5.2f\ttotal:%5.2f\n",p->num,p->name,p->score[0],p->score[1],p->score[2],p->total);
p=p->next;
}
}
//释放内存
void destory(DLinkList r)
{
DLNode *h,*p,*t=NULL;
h=r->next;
p=h->next;
while(p!=h)
{
t=p->next;
free(p);
p=t;
}
free(h);
}
int main()
{
DLinkList r;
int x,n,k;
r=Creat_DLinkList();
print_DLinkList(r);
printf("\nChoose what you want:\n");
printf("1:Search information:\n");
printf("2:Add information:\n");
printf("3:Delete same name:\n");
printf("4:Modify score:\n");
printf("5:Sort degrdation:\n");
scanf("%d",&x);
switch(x)
{
case 1: printf("\nPlease enter a number:");
scanf("%d",&n);
k=search(r,n);
if(k)
print_DLinkList(r);
else
printf("\nerror!!!\n");
break;
case 2: r=add(r);
print_DLinkList(r);
break;
case 3: delete(r);
print_DLinkList(r);
break;
case 4: printf("\nPlease enter a number:");
scanf("%d",&n);
k=modify(r,n);
if(k)
print_DLinkList(r);
else
printf("\nNot found!!!\n");
break;
case 5: r=sort(r);
print_DLinkList(r);
break;
default:printf("\nEnter error!!!\n");
}
destory(r);
return 0;
}
最近在学这里,所以就帮楼主编了一下,顺便巩固巩固所学。lz有什么不懂的尽管问,我会尽量回答的。
Ⅸ C语言链表排序
#include"stdafx.h"
#include<stdlib.h>
//创建一个节点,data为value,指向NULL
Node*Create(intvalue){
Node*head=(Node*)malloc(sizeof(Node));
head->data=value;
head->next=NULL;
returnhead;
}
//销毁链表
boolDestroy_List(Node*head){
Node*temp;
while(head){
temp=head->next;
free(head);
head=temp;
}
head=NULL;
returntrue;
}
//表后添加一个节点,Create(value)
boolAppend(Node*head,intvalue){
Node*n=Create(value);
Node*temp=head;
while(temp->next){
temp=temp->next;
}
temp->next=n;
return0;
}
//打印链表
voidPrint_List(Node*head){
Node*temp=head->next;
while(temp){
printf("%d->",temp->data);
temp=temp->next;
}
printf("\n");
}
//在链表的第locate个节点后(头节点为0)插入创建的节点Create(value)
boolInsert_List(Node*head,intlocate,intvalue){
Node*temp=head;
Node*p;
Node*n=Create(value);
if(locate<0)
returnfalse;
while(locate--){
if(temp->next==NULL){
temp->next=Create(value);
returntrue;
}
temp=temp->next;
}
p=temp->next;
temp->next=n;
n->next=p;
returntrue;
}
//删除第locate个节点后(头节点为0)的节点
boolDelete_List(Node*head,intlocate){
Node*temp=head;
Node*p;
if(locate<0)
returnfalse;
while(locate--){
if(temp==NULL){
returnfalse;
}
temp=temp->next;
}
p=temp->next->next;
free(temp->next);
temp->next=NULL;
temp->next=p;
returntrue;
}
//获取链表长度(不包括头节点)
intSize_List(Node*head){
Node*temp=head;
intsize=0;
while(temp->next){
temp=temp->next;
size++;
}
returnsize;
}
//链表的三种排序(选择,插入,冒泡)
boolSort_List(Node*head){
intt=0;
intsize=Size_List(head);
//选择排序
/*for(Node*temp=head->next;temp!=NULL;temp=temp->next){
for(Node*p=temp;p!=NULL;p=p->next){
if(temp->data>p->data){
printf("换%d和%d\n",temp->data,p->data);
t=temp->data;
temp->data=p->data;
p->data=t;
}
}
}*/
//插入排序
/*for(Node*temp=head->next->next;temp!=NULL;temp=temp->next){
for(Node*p=head;p->next!=NULL;p=p->next){
if(p->next->data>temp->data)
{
printf("换%d和%d\n",temp->data,p->next->data);
t=temp->data;
temp->data=p->next->data;
p->next->data=t;
}
}
}*/
//冒泡排序
for(Node*temp=head->next;temp->next!=NULL;temp=temp->next){
for(Node*p=head->next;p->next!=NULL;p=p->next){
if(p->data>p->next->data){
t=p->data;
p->data=p->next->data;
p->next->data=t;
}
}
}
return0;
}
(9)用链表给学生成绩排序扩展阅读:
return表示把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数值的返回,返回时可附带一个返回值,由return后面的参数指定。
return通常是必要的,因为函数调用的时候计算结果通常是通过返回值带出的。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码),主调函数可以通过返回值判断被调函数的执行情况。
Ⅹ 链表成绩排序
呵呵,这是我第一次用链表写,以你要求的功能,程序如下,有点长~
-------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
struct Student
{
long number;
char name[10];
float score[3];
float sum;
struct Student *next;
};
char Menu(void);
struct Student *App(struct Student *head);
void Ave(struct Student *head);
void Ser(struct Student *head);
void Pri(struct Student *head);
void Fre(struct Student *head);
int main(void)
{
struct Student *head=NULL;
while(1)
{
switch(Menu())
{
case '1':
printf("请入学生信息,直接输入'-1'结束\n");
head=App(head);
break;
case '2':
Ave(head);
break;
case '3':
Ser(head);
break;
case '4':
printf("学生信息如下:\n");
Pri(head);
break;
case '0':
printf("好累啊,88!\n");
exit(0);
default:
printf("请重新输入!\n");
}
fflush(stdin);
printf("按任意键继续~");
getchar();
system("cls");
}
Fre(head);
return 0;
}
char Menu(void)
{
char ch;
printf("------------请选择-----------\n");
printf("1.添加学生信息\n2.求学生各科平均分\n3.查找学生信息\n4.输出学生信息\n0.退出\n-----------------------------\n");
scanf(" %c",&ch);
return ch;
}
struct Student *App(struct Student *head)
{
struct Student *p=NULL,*q,*temp;
static i=1;
while(i)
{
p=(struct Student *)malloc(sizeof(struct Student));
q=head;
if(p==NULL)
{
printf("内存不够!\n");
exit(0);
}
printf("请输入第%d名学生的学号、姓名、语文/英语/数学分数:\n",i++);
p->next =NULL;
scanf("%ld",&p->number);
if(p->number ==-1)
{
i--;
break;
free(p);
}
scanf("%s%f%f%f",p->name ,&p->score[0],&p->score[1],&p->score[2]);
p->sum=p->score[0]+p->score[1]+p->score[2];
if(head==NULL)
head=p;
else
{
while(q->sum>p->sum&&q->next!=NULL)
{
temp=q;
q=q->next;
}
if(q->sum<=p->sum)
{
if(q==head)
{
p->next =q;
head=p;
}
else
{
temp->next = p;
p->next = q;
}
}
else
{
q->next =p;
}
}
}
return head;
}
void Ave(struct Student *head)
{
struct Student *p=head;
float sum[3]={0},ave[3];
int s[3]={0};
int i,count=0;
if(p!=NULL)
{
while(p!=NULL)
{
for(i=0;i<3;i++)
sum[i]+=p->score[i];
p=p->next;
count++;
}
for(i=0;i<3;i++)
ave[i]=sum[i]/count;
printf("语文/英语/数学平均分分别为:%.2f %.2f %.2f\n",ave[0],ave[1],ave[2]);
p=head;
while(p!=NULL)
{
for(i=0;i<3;i++)
if(p->score[i]<ave[i])
s[i]++;
p=p->next;
}
printf("语文/英语/数学低于平均分的人数分别为:%d %d %d\n",s[0],s[1],s[2]);
}
else
printf("你还没有录入学生成绩!\n");
}
void Ser(struct Student *head)
{
struct Student *p=head;
long s,flag=0;
printf("请输入要查找的学生学号:");
scanf("%ld",&s);
while(p!=NULL)
{
if(p->number ==s)
{
printf("学生信息如下:\n学号:%ld\n姓名:%s\n语文:%.1f 英语:%.1f 数学:%.1f\n",p->number ,p->name ,p->score[0],p->score[1],p->score[2]);
flag=1;
}
p=p->next ;
}
if(flag==0)
printf("没有找到该学生信息!\n");
}
void Pri(struct Student *head)
{
struct Student *p=head;
int i=1;
while(p!=NULL)
{
printf("%d. %ld %s %.1f %.1f %.1f\n",i++,p->number ,p->name ,p->score[0],p->score[1],p->score[2]);
p=p->next ;
}
}
void Fre(struct Student *head)
{
struct Student *p;
while(head!=NULL)
{
p=head;
head=head->next ;
free(p);
}
}