📄 student.cpp
字号:
#include"Student.h"
///////////////////////////////////////////////////////////////////
Student::Student() {
head = NULL;
}
///////////////////////////////////////////////////////////////////
bool Student::empty()const {
return size()==0;
}
///////////////////////////////////////////////////////////////////
int Student::size()const { //统计链表的记录总数
if(head==NULL) return 0;
Node *p=head;
int count=0; //变量count存储当前链表中的记录总数
while(p!=NULL) {
count++;
p=p->next; //p指向下一个结点
}
return count;
}
////////////////////////////////////////////////////////////////////////////
void Student::clear() { //清空链表
Node *p, *q;
for (p=head;p!=NULL;p=q) {
q=p->next;
delete p;
}
head = NULL;
}
////////////////////////////////////////////////////////////////////////////
Student::~Student() {
clear();
}
//////////////////////////////////////////////////////////////////
void Student::addItem(int num, string name,Subject subject,int term) { //添加一条记录到表尾
if(head==NULL){
head=new Node; //新建结点
head->num=num; //学号
head->name=name; //姓名
head->subject=subject; //科目
head->term=term; //学期
head->next=NULL;
return;
}
Node *temp=head;
while(temp!=NULL && temp->num!=num) //学号是唯一的
temp=temp->next; //指向下一个结点
if(temp!=NULL){
cout<<"学号为"<<num<<"的学生记录已经存在!添加失败!\n"; //提示操作结果
return;
}
Node *p=head; //p指针从头结点开始遍历
while(p->next!=NULL) p=p->next;
temp=new Node; //新建结点
temp->num=num; //插入学号
temp->name=name; //插入姓名
temp->subject=subject; //插入科目
temp->term=term; //插入学期
temp->next=NULL;
p->next=temp;
return;
}
/////////////////////////////////////////////////////////////////////////////////
void Student::deleteItem(int num) { //删除一条指定的记录
Node *temp=findItem(num); //根据学号查找
if(temp==NULL) return; //找不到此学号所对应的记录
Node *p=head;
if(head==temp) { //如果用户输入的编号存在,执行if后的代码块
head=head->next; //要删除的是头结点
delete p; //执行删除
cout <<"成功删除学号为 "<<num<<" 的记录!\n\n"; //输出提示
return;
}
while(p->next!=temp) p=p->next; //指针p移动,直到找到相当记录
Node *t=p->next;
p->next=t->next;
delete t; //执行删除
cout <<"成功删除学号为 "<<num<<" 的记录!\n\n"; //输出提示
return;
}
/////////////////////////////////////////////////////////////////////////////////
void Student::printItem(Node *p) {
cout<<p->num<<"\t";
cout<<p->name<<"\t";
cout<<p->subject.chinese<<"\t";
cout<<p->subject.math<<"\t";
cout<<p->subject.english<<"\t";
cout<<p->subject.politic<<"\t";
cout<<p->subject.history<<"\t";
cout<<p->term<<endl;
return;
}
/////////////////////////////////////////////////////////////////////////////////
void Student::showList() { //列出当前链表中的所有记录
if (empty()) {
cout <<"当前的列表为空!\n"; //提示查询结果
return;
}
Node *p=head; //将头结点存储在Node结构类型指针*p中
cout<<"共有记录:"<<size()<<endl; //输入记录总数
cout<<"学号\t姓名\t语文\t数学\t英语\t政治\t历史\t学期\n"; //输出标题
while(p!=NULL) {
printItem(p); //输出p的值
p=p->next;
}
return;
}
////////////////////////////////////////////////////////////////////////////////
void Student::searchItem(int num) { //在当前链表查找指定记录并输出
Node *p=findItem(num); //查找该学号对应的记录,将查找结果存储在指针p中
if(p!=NULL) {
cout<<"学号\t姓名\t语文\t数学\t英语\t政治\t历史\t学期\n"; //输出标题
printItem(p); //打印p中的内容
}
}
////////////////////////////////////////////////////////////////////////////////
void Student::searchItem(string name) {
Node *p=findItem(name); //查找该编号对应的记录,将查找结果存储在指针p中
if(p!=NULL) {
cout<<"学号\t姓名\t语文\t数学\t英语\t政治\t历史\t学期\n";
printItem(p);
}
}
////////////////////////////////////////////////////////////////////////////////
Node *Student::findItem(int num) { //调用查找函数
if (empty()) {
cout <<"当前的列表为空!\n";
return NULL;
}
Node *p=head;
while(p!=NULL) {
if(p->num==num) break; //找到学号所对应的记录
p=p->next; //尚没有找到,则指针P往下移动
}
if(p==NULL) {
cout <<"找不到该记录!\n";
return NULL;
}
return p;
}
////////////////////////////////////////////////////////////////////////////////
Node *Student::findItem(string name) {
if (empty()) {
cout <<"当前的列表为空!\n";
return NULL;
}
Node *p=head;
while(p!=NULL) {
if(p->name==name) break; //找到学生姓名所对应的记录
p=p->next; //尚没有找到,则指针P往下移动
}
if(p==NULL) {
cout <<"找不到该记录!\n";
return NULL;
}
return p;
}
////////////////////////////////////////////////////////////////////////////////
void Student::readFile() {
ifstream infile;
infile.open("student.txt",ios::in);
if(!infile) {
cout<<"没有student.txt这个文件!!!"<<endl;
}
int num=0;
string name;
Subject subject;
int term=0;
int count=0; //定义一个变量count,用来存放从student.txt中读取第一行的数,表文件中的总记录数
infile>>count; //读取到count中
while(count>0) {
infile>>num>>name>>subject.chinese>>subject.math>>subject.english>>subject.politic>>subject.history>>term;
addItem(num,name,subject,term); //调用
count--;
}
infile.close();
}
////////////////////////////////////////////////////////////////////////////////
void Student::writeFile() {
ofstream outfile;
outfile.open("student.txt",ios::out|ios::app); //追加信息到student.txt中
if (empty()) {
cout <<"当前的列表为空,无法写入文件!\n";
outfile.close();
return;
}
Node *p=head; //将头结点存储在Node结构类型指针*p中
outfile<<size()<<endl; //将链表的记录总数写入student.txt的第一行
while(p!=NULL) {
outfile<<p->num<<"\t"<<p->name<<"\t"<<p->subject.chinese<<"\t"<<p->subject.math<<"\t"<<p->subject.english
<<"\t"<<p->subject.politic<<"\t"<<p->subject.history<<"\t"<<p->term<<endl;
p=p->next;
}
cout<<"文件保存成功!"<<endl;
outfile.close();
}
////////////////////////////////////////////////////////////////////////////////
void Student::average(string name) {
Node *p=findItem(name); //查找该编号对应的记录,将查找结果存储在指针p中
int sum=0;
int count=sizeof(Subject)/sizeof(int);
double average=0.0;
if(p!=NULL) {
sum=p->subject.chinese+p->subject.english+p->subject.history+p->subject.math+p->subject.politic;
average=sum/count;
cout<<"学号\t姓名\t总分\t平均分\n";
cout<<p->num<<"\t"<<p->name<<"\t"<<sum<<"\t"<<average<<endl;
}
}
////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -