📄 list.cpp
字号:
#include "List.h"
#include <iostream>
using namespace std;
//构造方法,初始化
List::List()
{
count=0;
head=NULL;
}
/*******************************************************************************/
//获取链表的大小
int List::size() const
{
return count;
}
/*******************************************************************************/
//将记录保存到指定文件中
void List::save()
{
FILE *fp;
Node *p;
if((fp=fopen("student.txt","wb"))==NULL)
{
cout<<"不能打开文件!"<<endl;
return;
}
for( p=head;p;p=p->next )
if(fwrite(p,sizeof(struct Node),1,fp)!=1)
cout<<"文件保存失败!";
cout<<"文件保存成功!";
fclose(fp);
}
/*******************************************************************************/
//从指定文件中读取记录
Node *List::read()
{
Node *p,*q,*front=NULL; //定义记录指针变量
FILE *fp; //定义指向文件的指针
if((fp=fopen("student.txt","rb"))==NULL) //打开一个二进制文件,为只读方式
{
cout<<"不能打开文件!"<<endl;
return front;
}
p=(Node *)malloc(sizeof(struct Node)); //开辟一个新单元
if(!p)
{
cout<<"内存溢出!";
return front;
}
front=p; //申请到空间,将其作为头指针
while(!feof(fp)) //循环读数据直到文件尾结束
{
if(fread(p,sizeof(struct Node),1,fp)!=1) break; //如果没读到数据,跳出循环
p->next=(Node *)malloc(sizeof(struct Node)); //为下一个结点开辟空间
if(!p->next)
{
cout<<"内存溢出!";
return front;
}
q=p; //使q指向刚才p指向的结点
p=p->next; //指针后移,新读入数据链到当前表尾
count++;
}
q->next=NULL; //最后一个结点的后继指针为空
fclose(fp);
cout<<"文件读取成功!";
return front;
}
/*******************************************************************************/
//遍历链表
void List::traverse(void (*visit)(char [],char [],char [],float &,int &))
{
Node *p;
for(p=head;p;p=p->next)
(*visit)(p->m_number,p->m_name,p->m_course,p->m_score,p->m_term);
}
/*******************************************************************************/
//输入记录
Error_code List::insert(int position,char number[],char name[],char course[],float &score,int &term)
{
if(position<0 || position>count)
return rang_error;
Node *previous,*following,*new_node;
if(position>0)
{
previous=set_position(position-1);
following=previous->next;
}
else following=head;
new_node=new Node(number,name,course,score,term,following);
if(new_node==NULL)
return overflow;
if(position==0)
head=new_node;
else
previous->next=new_node;
count++;
return success;
}
/*******************************************************************************/
//删除指定记录
Error_code List::remove(int position)
{
Node *prior, *current;
if (count == 0)
return fail;
if (position < 0 || position >= count)
return rang_error;
if (position > 0)
{
prior = set_position(position-1);
current = prior->next;
prior->next = current->next;
}
else
{
current = head;
head = head->next;
}
delete current;
count--;
return success;
}
/*******************************************************************************/
//按学号查询
void List::search_for_number()
{
Node *p;
char number[20];
cout<<"请输入您要查找的学号:";
cin>>number;
cout<<"查询结果如下:"<<endl;
cout<<"学号 姓名 科目 成绩 学期"<<endl;
for(p=head;p;p=p->next)
{
if(strcmp(number , p->m_number)==0)
cout<<p->m_number<<" "<<p->m_name<<" "<<p->m_course
<<" "<<p->m_score<<" "<<p->m_term<<endl;
}
}
/*******************************************************************************/
//按姓名查询
void List::search_for_name()
{
Node *p;
char name[20];
cout<<"请输入您要查找的姓名:";
cin>>name;
cout<<"查询结果如下:"<<endl;
cout<<"学号 姓名 科目 成绩 学期"<<endl;
for(p=head;p;p=p->next)
{
if(strcmp(name , p->m_name)==0)
cout<<p->m_number<<" "<<p->m_name<<" "<<p->m_course
<<" "<<p->m_score<<" "<<p->m_term<<endl;
}
}
/*******************************************************************************/
//按科目查询
void List::search_for_course()
{
Node *p;
char course[20];
cout<<"请输入您要查找的科目:";
cin>>course;
cout<<"查询结果如下:"<<endl;
cout<<"学号 姓名 科目 成绩 学期"<<endl;
for(p=head;p;p=p->next)
{
if(strcmp(course , p->m_course)==0)
cout<<p->m_number<<" "<<p->m_name<<" "<<p->m_course
<<" "<<p->m_score<<" "<<p->m_term<<endl;
}
}
/*******************************************************************************/
//按成绩查询
void List::search_for_score()
{
Node *p;
float score;
cout<<"请输入您要查找的成绩:";
cin>>score;
cout<<"查询结果如下:"<<endl;
cout<<"学号 姓名 科目 成绩 学期"<<endl;
for(p=head;p;p=p->next)
{
if(score == p->m_score)
cout<<p->m_number<<" "<<p->m_name<<" "<<p->m_course
<<" "<<p->m_score<<" "<<p->m_term<<endl;
}
}
/*******************************************************************************/
//按学期查询
void List::search_for_term()
{
Node *p;
int term;
cout<<"请输入您要查找的学期:";
cin>>term;
cout<<"查询结果如下:"<<endl;
cout<<"学号 姓名 科目 成绩 学期"<<endl;
for(p=head;p;p=p->next)
{
if(term == p->m_term)
cout<<p->m_number<<" "<<p->m_name<<" "<<p->m_course
<<" "<<p->m_score<<" "<<p->m_term<<endl;
}
}
/*******************************************************************************/
//平均分
float List::average()
{
float sum=0.0;
Node *p;
for( p=head; p; p=p->next )
sum+=p->m_score;
return sum/size();
}
//通过人数
int List::pass_people()
{
int pp=0;
Node *p;
for( p=head; p; p=p->next )
if( p->m_score >= 60)
pp++;
return pp;
}
//优秀人数
int List::good_people()
{
int gp=0;
Node *p;
for( p=head; p; p=p->next )
if( p->m_score >=80 )
gp++;
return gp;
}
/*******************************************************************************/
//归并排序函数
void List::merge_sort()
{
recursive_merge_sort(head, size());
}
/*******************************************************************************/
//归并排序函数的辅助递归函数
Node *List::recursive_merge_sort(Node *&sub_list, int length)
{
if (length > 1)
{
int length2 = length / 2, length1 = length - length2;
Node *second_half = divide_from(sub_list, length1, length2);
sub_list=recursive_merge_sort(sub_list, length1);
second_half=recursive_merge_sort(second_half, length2);
sub_list = merge(sub_list, second_half);
}
return sub_list;
}
/*******************************************************************************/
//将一个链表分成两半
Node *List::divide_from(Node *sub_list,int length1, int length2)
{
if (length2 == 0) return NULL; //第二半部分为空
Node *position = sub_list, *second_half;
int i = 0;
while (i < length1 - 1) {
position = position->next;
i++;
}
second_half = position->next;
position->next = NULL;
return second_half;
}
/*******************************************************************************/
//归并两个已排序的链表
Node *List::merge(Node *first,Node *second)
{
Node *last_sorted; //指向有序表最后一个结点的指针
Node combined; //指向归并表第一个结点的指针
last_sorted = &combined;
while (first != NULL && second != NULL) {
if (first->m_score >= second->m_score) {
last_sorted->next = first;
last_sorted = first;
first = first->next;
}
else {
last_sorted->next = second;
last_sorted = second;
second = second->next;
}
}
if (first == NULL)
last_sorted->next = second;
else
last_sorted->next = first;
return combined.next;
}
/*******************************************************************************/
//定位函数,起辅助作用
Node *List::set_position(int position) const
{
Node *q=head;
for(int i=0;i<position;i++)
q=q->next;
return q;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -