任务:数据来自score.txt,在程序中建立一个动态链表:每读入一个同学的数据,计算总分,分配结点的存储空间并赋值,并建立起前后相链的关系。在建立链表的同时,要进行统计,以便于求出所有同学总分的平均成绩。动态链表建立后,从头结点开始,依次输出所有总分高于平均总分且没有挂科的同学的学号、姓名、总分。
实验目的:学会动态链表的建立和输出
实验内容:动态链表的定义、建立、输出
/* 程序头部注释开始
* 程序的版权和版本声明部分
* Copyright(c) 2011, 烟台大学计算机学院学生
* All rightsreserved.
* 文件名称: link.cpp
* 作 者: 贺利坚
* 完成日期: 2011 年 12 月 19 日
* 版 本 号: v1.0
* 对任务及求解方法的描述部分
* 输入描述:score.txt
* 问题描述:在程序中建立一个动态链表:每读入一个同学的数据,计算总分,分配结点的存储空间并赋值,并建立起前后相链的关系。在建立链表的同时,要进行统计,以便于求出所有同学总分的平均成绩。动态链表建立后,从头结点开始,依次输出所有总分高于平均总分且没有挂科的同学的学号、姓名、总分。
* 程序输出:所有总分高于平均总分且没有挂科的同学的学号、姓名、总分。
*/
#include <iostream>
#include <fstream>
usingnamespace std;
struct Student
{
char num[13]; //尽管都是由数字构成,但看作为字符更合适。
char name[10]; //每个汉字占两个字节,中国人的名字,5个汉字够用
int cpp;
int math;
int english;
int grade;
struct Student *next; //指向下一节点的指针
};
const intN=180;
int main( )
{
Student *head=NULL,*p,*q;
int i;
int sum=0,ave; //用于求平均
ifstreaminfile("score.txt",ios::in); //以输入的方式打开文件
if(!infile) //测试是否成功打开
{
cerr<<"open error!"<<endl;
exit(1);
}
//下面从文件中读取数据,同时建立动态链表,并为求总分之和
for(i=0;i<N;i++)
{
p = new Student;
infile>>p->num>>p->name>>p->cpp>>p->math>>p->english;
p->grade = p->cpp + p->math +p->english;
sum+=p->grade;
p->next=NULL;
if (i==0)
head=p; //是第一个节点
else
q->next=p; //用q记录刚刚产生的结点,如果有下一个,需要q将之连起来
q=p;
}
infile.close();
//求平均成绩
ave=sum/N;
cout<<"总分平均为:"<<ave<<endl;
//依次输出所有总分高于平均总分且没有挂科的同学的学号、姓名、总分。
p=head;
i=1;
while(p!=NULL)
{
if(p->grade>=ave&&p->cpp>=60&&p->math>=60&&p->english>=60)
{
cout<<i<<""<<p->num<<" "<<p->name<<""<<p->grade<<endl;
i++;
}
p=p->next;
}
return 0;
}
总结:
1. 本题体验了动态链表,在数据结构课程里,还有大量的算法需要用链表完成。本题做的是单向链表,还有双向链表、循环链表等,操作涉及插入、删除、查询等。再进一步,树、图的存储大量用到类似的操作,期待以后的内容……
2. 链表也是一个需要在思维方式上有大转变的一个内容,不免开始时不习惯。逐渐熟悉了,也不是那么难,要有信心,继续多看书,多练习,多实践。
感言:上课前,认真地看了讲义,唯独忘记检查模板,恰巧上周忙,没有提前做模板,当时想周三上机前做好就行。发现模板不对后,心一横,本周无模板,同学们应该学着自己写完整的报告了。担心有人就光秃秃地交个源代码了事。看到不少同学提交的报告,担心多余了。当然也有一些同学,真的“裸交”了。带学生一段,就让他们自己走好了。不带,起步不了;总带着不放,走远不了,时机要把握好,为自己没有有计划放手惭愧。