线性表
1、定义一个结构体类型,包含学号、姓名、成绩等成员。
2、输入每个同学的三门课成绩。
3、定义一个结构体类型,结构体中含链表指针。
4、将数组改为链表。
typedef struct Student
{
int sno; //学号
char sname[10]; //姓名
float scor[3]; //三门成绩
float avg; //平均成绩
};
顺序实现
#include <stdio.h>
typedef struct Student
{
int sno;
char sname[10];
float score[3];
float avg;
};
void main(){
int n,i,j,id;
float max;
Student STU[30]={0};
printf("您要录入几位学生的信息:");
scanf("%d",&n);
for(i=0;i<n;i++) //录入
{
printf("\n两位数学号:"); //二位数 学号合法性检查
scanf("%d",&STU[i].sno);
while(STU[i].sno > 100 ||STU[i].sno < 1)
{
printf("输入学号有误,请重新输入!\n");
scanf("%d",&STU[i].sno);
}
printf("\n姓名:");
scanf("%s",&STU[i].sname);
printf("\n三门课的成绩(百分制,空格间隔输入):");
do
{
for(j=0;j<3;j++)
{
scanf("%f",&STU[i].score[j]);
}
for(j=0;j<3;j++)
{
if(STU[i].score[j] >= 0 && STU[i].score[j] <= 100) continue; // 成绩合法性检查
printf("数据有误,请重新输入!\n");
break;
}
if(j==3) break; //不使用goto跳出二重循环
}while(1);
STU[i].avg=(STU[i].score[0]+STU[i].score[1]+STU[i].score[2])/3;
}
printf("录入完毕\n");
i--;
max=STU[i].avg;
id=0; //找出成绩最高的同学下标
while(i>=0)
{
if(max<STU[i].avg)
{
max=STU[i].avg;
id=i;
}
i--;
}
printf("平均成绩最高的学生信息记录是:\n"); //输出
printf("-----------------------------\n");
printf("学号:%d,姓名:%s",STU[id].sno,STU[id].sname);
printf(",各科成绩:%.2f,%.2f,%.2f\n",STU[id].score[0],STU[id].score[1],STU[id].score[2]);
printf("-----------------------------");
printf("\n");
}
链式实现
#include <stdio.h>
#include<malloc.h>
typedef struct Student
{
int sno;
char sname[10];
float score[3];
float avg;
Student *next;
};
void DestroyList(Student *L)
{
Student *pre=L,*p=L->next;
while(pre!=NULL)
{
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
Student *Find(Student *head)
{
float max;
Student *id,*p;
id=NULL; //找出成绩最高的同学下标
p=head;
max=p->avg;
while(p!=NULL)
{
if(max<p->avg)
{
max=p->avg;
id=p;
}
p=p->next;
}
return id;
}
void ListInsert(Student *head,int n)
{
Student *p=head,*q=NULL;
int i=0,j;
while(i<n)
{
printf("\n两位数 学号:");
q=(Student *)malloc(sizeof(Student)); //开辟空间
p->next=q; //尾插法
p=q;
scanf("%d",&q->sno);
while(q->sno > 100 ||q->sno < 1)
{
printf("输入学号有误,请重新输入!\n");
scanf("%d",&q->sno);
}
printf("\n姓名:");
scanf("%s",&q->sname);
printf("\n三门课的成绩(百分制,空格间隔输入):");
do
{
for(j=0;j<3;j++)
{
scanf("%f",&q->score[j]);
}
for(j=0;j<3;j++)
{
if(q->score[j] >= 0 && q->score[j] <= 100) continue; //成绩合法性检查
printf("数据有误,请重新输入!\n");
break;
}
if(j==3) break; //不使用goto跳出二重循环
}while(1);
q->avg=(q->score[0]+q->score[1]+q->score[2])/3;
i++;
}
p->next=NULL; //尾插法尾结点指针域置空
}
void DispList(Student *id)
{
printf("平均成绩最高的学生信息记录是:\n"); //输出
printf("-----------------------------\n");
printf("学号:%d,姓名:%s",id->sno,id->sname);
printf(",各科成绩:%.2f,%.2f,%.2f\n",id->score[0],id->score[1],id->score[2]);
printf("-----------------------------");
printf("\n");
}
void main(){
int n;
Student *head,*id;
head=(Student *)malloc(sizeof(Student)); //头节点
head->next=NULL;
printf("您要录入几位学生的信息:");
scanf("%d",&n);
ListInsert(head,n); //插入学生信息
printf("录入完毕\n");
id=Find(head);
DispList(id); //输出学生信息
DestroyList(head);
}