| 实验过程(实验中涉及的记录、数据、分析):
//实验1.1 线性表的链接存储结构
#include
#include
#include
#define PWRS 5 //定义评委人数
//定义评委信息
struct pw
{
char name[8]; //姓名
short age; //年龄
float score; //评分
};
typedef struct pw PW;
//定义链表结点
struct node
{
PW data;
struct node * next;
};
typedef struct node NODE;
NODE *create(int n); //建立单链表
void input(NODE *s,int i); //输入第i个评委信息
void output(NODE *s); //输出评委信息
void traverse(NODE *head); //遍历链表
void calc(NODE *head); //计算及数据处理
void main()
{
NODE *head=NULL;
head=create(PWRS); //建立评委信息单链表
printf(“\n所有评委的评分信息如下:\n”);
traverse(head); //输出所有评委的评分信息
calc(head); //计算成绩
printf(“该参赛者去掉一个最高分和一个最低分后的有效评委的评分信息如下:\n”);
traverse(head); //输出有效评委的评分信息
}
//尾插法建立带头结点的单链表
NODE *create(int n)
{
NODE *head,*p,*q;
int i;
p=(NODE*)malloc(sizeof(NODE));
head=p; q=p; p->next=NULL;
for(i=1; i<=n; i++)
{
p=(NODE*)malloc(sizeof(NODE));
input(p,i);
p->next=NULL;
q->next=p;
q=p;
}
return (head);
}
//输入评委信息,包括姓名、年龄和评分
void input(NODE *s,int i)
{
printf(“请输入第 %d 个评委的姓名、年龄和评分:”,i);
scanf(“%s%d%f”,&s->data.name,&s->data.age,&s->data.score);
}
//输出评委信息
void output(NODE *s)
{
printf(“评委姓名:%6s 年龄:%d 评分:%6.2f\n”,s->data.name,s->data.age,s->data.score);
}
//遍历链表,输出所有评委的评分信息
void traverse(NODE *head)
{
NODE *p=head->next; //指向第一个结点
while(p!=NULL)
{
output(p);
p=p->next;
}
printf(“\n”);
}
//输出最高分及最低分评委信息,删除最高分及最低分结点并计算参赛者的最后平均分
void calc(NODE *head)
{
NODE *q,*p,*pmin,*pmax;
float sum=0; //总分
float ave=0; //平均分
//查找最高分和最低分并计算总分
p=head->next;
pmin=pmax=p;
while(p!=NULL)
{
sum+=p->data.score;
if(p->data.score>pmax->data.score) pmax=p; //pmax指向最高分结点
if(p->data.scoredata.score) pmin=p; //pmin指向最低分结点
p=p->next;
}
//输出最高分及最低分评委信息
printf(“给出最高分的评委姓名:%6s 年龄:%d 评分:%6.2f\n”,pmax->data.name,pmax->data.age,pmax->data.score);
printf(“给出最低分的评委姓名:%6s 年龄:%d 评分:%6.2f\n”,pmin->data.name,pmin->data.age,pmin->data.score);
printf(“\n”);
//去掉一个最高分和一个最低分,计算并输出参赛者的最后平均分
sum-=pmax->data.score;
sum-=pmin->data.score;
ave=sum/(PWRS-2);
printf(“该参赛者去掉一个最高分和一个最低分后的平均得分为:%6.2f\n”,ave);
printf(“\n”);
//在链表中删除最高分和最低分结点
for(q=head,p=head->next;p!=NULL;q=p,p=p->next)
{
if(p==pmin) { q->next=p->next; p=q; } //删除最低分结点
if(p==pmax) { q->next=p->next; p=q; } //删除最高分结点
}
}
|