⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.cpp

📁 用C++和链表写的学生成绩管理系统
💻 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 + -