栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

基于链表实现的学生管理系统

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于链表实现的学生管理系统

定义一个包含学生信息(学号,姓名,性别,专业,语数外成绩,平均分,成绩排名)的链表,使其具有如下功能:

  1. 根据指定学生个数,逐个输入学生信息,并检查学号是否重复,成绩范围是否合理;
  2. 根据学号删除指定学生信息;
  3. 根据学号更改指定学生信息;
  4. 根据姓名或者学号进行查找,返回此学生的信息;
  5. 逐个输出所有学生的信息;
  6. 查询每门科目最高成绩;
  7. 对学生的成绩进行排序;
  8. 查询某个专业所有人的信息;
  9. 文件的保存和输出
  10. 建立索引文件,存入学号和姓名

话不多说,直接上代码!

#include
#include 
#include
#include 
#include 
#include 
#include 
using namespace std;
#define Maxsize 100
//学生成绩表结构体
typedef struct stu
{
	int num;                //学号
	char name[10];          //姓名
	char sex[4];            //性别
	char subject[20];       //专业学科
	int Math;               //数学
	int Chinese;            //语文
	int English;            //英语
	double avg;             //成绩平均分
	int rank;               //总分排名
	struct stu* next;       //指向后续节点
}STU;                       //单链表节点类型
typedef struct Index
{
	int no;
	int offset;
	char name[20];
};
STU* Head=NULL;  //定义一个指针
STU* End = NULL;   //尾结点
void CreatList()  //创建头结点和尾结点
{
	Head = (struct stu*)malloc(sizeof(struct stu));
	Head->next = NULL;  
	STU* End = Head; 
}
void menu(){                //菜单项
	cout<<"tt***************************************"<: ";
}
//添加学生成绩信息
void AddStudent()
{
	int n, i;
	cout<<"请输入您要添加的学生人数:";
	cin>>n;

	for (i = 0; inext = NULL;
		cout<<"n            要添加的第"<>pNew->num;

		//检查是否已经添加过该学生,即检查学号是否重复
		STU* temp = Head->next;
		while (temp != NULL)
		{
			if (temp->num == pNew->num)
			{
				cout<<"n           学号重复,请重新输入!"<>pNew->num;
				temp = Head->next;        //重新遍历检查学号
				continue;
			}
			else
				temp = temp->next;
		}
		cout<<"请输入第"<>pNew->name;
		cout<<"请输入第"<>pNew->sex;
		cout<<"请输入第"<>pNew->subject;
		cout<<"请输入第"<>pNew->Math;
		while (1)
		{
			if ((pNew->Math)< 0 || (pNew->Math > 100))   //检查成绩范围是否合理
			{
				cout<<"n            输入成绩有误,请检查!n";
				cout<<"请重新输入第"<>pNew->Math;
			}
			else break;
		}
		cout<<"请输入第"<>pNew->Chinese;
		while (1)
		{
			if ((pNew->Chinese)< 0 || (pNew->Chinese > 100))
			{
				cout<<"n            输入成绩有误,请检查!n";
				cout<<"请重新输入第"<>pNew->Chinese;
			}
			else break;
		}
		cout<<"请输入第"<>pNew->English;
		while (1)
		{
			if ((pNew->English)< 0 || (pNew->English) > 100)
			{
				cout<<"n            输入成绩有误,请检查!n";
				cout<<"请重新输入第"<>pNew->English;
			}
			else break;
		}
		//按学号排序,边添加边排序;
		if (Head->next == NULL)
		{
			Head->next = pNew;        //作为首元素
			End = Head->next;
			
		}
		else
		{
			if (pNew->num > End->num)
			{
				End->next = pNew;
				End = End->next;

			}
			else
			{
				STU* p1 = Head->next;
				if (pNew->num > p1->num)        //链表中已经至少存在2个成员(至少存在首和尾);
				{
					STU* p2 = p1->next;
					while (1)
					{
						if ((pNew->num > p1->num) && (pNew->num < p2->num))
						{
							pNew->next = p2;
							p1->next = pNew;
							break;
						}
						else   //pNew->num > p2->num的情况
						{
							p1 = p1->next;
							p2 = p2->next;
						}
					}

				}
				else  //pNew->num < p1->num
				{
					pNew->next = p1;
					Head->next = pNew;
				}

			}
		}
	}
	cout<<"n            学生信息全部添加完成!n";

}



//通过前驱结点删除学生成绩信息
void DeleteStudent()
{
	int num1;
	cout<<"n请输入您要删除的学生的学号:";
	cin>>num1;
	STU* pre =Head;        //表中没有数据时,pre为空;

	while (1)
	{
		if (pre->next && (pre->next->num == num1))
		{
			STU* q = pre->next;             //保存该节点信息
			pre->next = pre->next->next;   //断开pre->next节点
			cout<<"n             删除操作成功!n";
			cout<<"n            已删除的学生成绩信息如下!nn";
			cout<<"t学号t姓名t性别t专业tt数学t语文t英语tnn";
			cout<<"t"<num<<"t"<name<<"t"<sex<<"t"<subject<<"tt"<Math
				<<"t"<Chinese<<"t"<English;
			free(q);
			return;
		}
		else
		{
			if (pre->next != NULL)
				pre = pre->next;
			else
			{
				cout<<"n                信息删除失败!n";
				return;
			}
		}
	}
}

//更改学生成绩信息
void AlterStudent()
{
	int num1;
	printf("n请输入您要更改学生的学号:");
	cin>>num1;
	STU* change = Head->next;
	while (change && (change->num != num1))
		change = change->next;
	if (change)
	{
		cout<<"更改后的学号:";
		cin>>change->num;
		cout<<"更改后的姓名: ";
		cin>> change->name;
		cout<<"更改后的性别: ";
		cin>>change->sex;
		cout<<"更改后的专业: ";
		cin>> change->subject;
		cout<<"更改后的数学成绩: ";
		cin>>change->Math;
		cout<<"更改后的语文成绩: ";
		cin>>change->Chinese;
		cout<<"更改后的英语成绩: ";
		cin>>change->English;
		cout<<"n            学生信息已经更改完毕!!!n";
	}
	else
		cout<<"n            学生信息不存在,无法更改!!!n";
}
//查询学生成绩信息
void SeekStudent()
{
	while (1)
	{
		cout<<"n请选择查询方式 按学号:1 按姓名:2:  ";
		int k;
		cin>>k;
		switch (k)
		{
		case 1:
			{
				int num2;
				cout<<"n请输入您要查找学生的学号:";
				cin>>num2;
				STU* find = Head->next;
				while (find && (find->num != num2))
					find = find->next;
				if (find)
				{
					cout<<"n查询学生信息如下:nn";
					cout<<"t学号t姓名t性别t专业tt数学t语文t英语nn";
					cout<<"t"<num<<"t"<name<<"t"<sex<<"t"<subject<<"tt"<Math
						<<"t"<Chinese<<"t"<English;
				}
				else
					cout<<"nn            没有查询到该学生信息!!!n";
				return;

			}
		case 2:
			{
				cout<<"n请输入您要查找学生的姓名:";
				char name1[20];
				cin>>name1;
				STU* find = Head->next;
				while (find && (strcmp(find->name, name1) != 0))
					find = find->next;
				if (find)
				{
					cout<<"n查询学生信息如下:nn";
					cout<<"t学号t姓名t性别t专业tt数学t语文t英语nn";
					cout<<"t"<num<<"t"<name<<"t"<sex<<"t"<subject<<"tt"<Math
						<<"t"<Chinese<<"t"<English;
				}
				else
					cout<<"n           没有查询到该学生信息!!!n";
				return;
			}
		default:
			{
				cout<<"n查询方式错误! 请重新选择查询方式n";
				break;
			}
		}
	}
}

//输出全部学生信息
void DisplayAll()
{
	STU* p = Head->next;
	int len = 0;
	int SX = 0;
	int YW = 0;
	int YY = 0;
	double sum=0;
	double avg=0;
	cout<<"n			    全部学生成绩信息如下!nn";
	cout<<"t学号t姓名t性别t专业tt数学t语文t英语t平均分nn";
	while (p!= NULL)
	{
		 sum = p->Math + p->Chinese + p->English;
		 avg=sum/3;
		p->avg=avg;
		cout<<"t"<num<<"t"<name<<"t"<sex<<"t"<subject<<"tt"<Math
			<<"t"<Chinese<<"t"<English<<"t"<avg<Math;
		YW = YW + p->Chinese;
		YY = YY + p->English;
		p = p->next; //指针后移
		len++;
		if (p == NULL)
		{
			cout<<"nn			   成绩系统含学生总人数为:"<next;
	int maxyw=0;   int maxsx=0; int maxyy=0; 
	STU* qyw = NULL; STU* qyy = NULL;    	STU* qsx = NULL;   
	while (p != NULL)
	{ 
		 
		if(p->Chinese>maxyw)
		{
			maxyw=p->Chinese;
				 qyw = p;             //保存该节点信息
		}
		if(p->English>maxyy)
		{
			maxyy=p->English;
				 qyy = p;             //保存该节点信息
		}
		if(p->Math>maxsx)
		{
			maxsx=p->Math;
				 qsx = p;             //保存该节点信息
		}
		p = p->next;
	}
	if (p == NULL)
		{
		    cout<<"n            语文最高分学生成绩信息如下!n";
			cout<<"t学号t姓名t语文n";
			cout<<"t"<num<<"t"<name<<"t"<Chinese<num<<"t"<name<<"t"<Math<num<<"t"<name<<"t"<English<next;
	if(p!=NULL)
	{
		STU* q=p->next;
		p->next=NULL; //断开头结点,依次将q插入有序表中
		STU* r;  //r指向下一个元素
		STU* s;  //s指向该有序链表的表头
		while(q)
		{
			r=q->next;
			s=Head;  //s从头开始移动,查找q应该插入的位置 
			while(s->next && (s->next->avg >q->avg))
			{  s=s->next; }
			q->next=s->next;
			s->next=q;
			q=r;    
		}
	}
	STU* p1 = Head->next;
	cout<<"t学号t姓名t性别t专业tt总分tt排名nn";
	int rank=1;  
	while (p1 != NULL)
	{
		double sum = p1->Math + p1->Chinese + p1->English;
		p1->rank=rank;
		rank++;
		cout<<"t"<num<<"t"<name<<"t"<sex<<"t"<subject<<"tt"<rank<next;
	}
}
//查询该专业所有人
void selectsubject()
{
	cout<<"请输入你要查询的专业:";
	string subject1;  cin>>subject1;
	STU* p = Head->next;
	int sum=0;
	cout<<"t学号t姓名t性别t专业tt数学t语文t英语nn";
	while(p!=NULL)
	{
		if(strcmp(p->subject,subject1.c_str())==0)    //dept.c_str(),把string转化成char[],strcmp字符串比较
		{
			sum++;
			cout<<"t"<num<<"t"<name<<"t"<sex<<"t"<subject<<"tt"<Math
				<<"t"<Chinese<<"t"<English<next;
		}
		else p=p->next;
	}
	cout<<"本专业一共有"<next;
	while (p!=NULL)
	{	num++;       //统计节点数量
		p=p->next;
	}
	if(num==0)
	IO_File.open("stud.dat",ios::in|ios::app|ios::out|ios::binary|ios::trunc);
		//ios::app以追加的形式写入信息,不会覆盖上次文件信息
	if(!IO_File)
	{
		cout<<"没有找到文件"<next;
		for(size_t i=0;iavg=(p->Chinese+p->English+p->Math)/3;
			IO_File.write((char*)&(*p),sizeof(stu));  //把该学生对象写入文件
			p=p->next;
		}
		IO_File.close();
		cout<<"文件已保存!"<next=NULL;
				if(Head->next==NULL)
				{
					Head->next=s;
					End=End->next;
					End->next=NULL;
				}
				else
				{
					End->next=s;
					End=End->next;
					End->next=NULL;
				}
				End->avg=(End->Chinese+End->English+End->Math)/3;
				cout<<"t学号t姓名t性别t专业tt数学t语文t英语t平均分n";
				cout<<"t"<num<<"t"<name<<"t"<sex<<"t"<subject<<"tt"<Math
			<<"t"<Chinese<<"t"<English<<"t"<avg;
			cout<=high+1;j--)
				R[j+1]=R[j];
			R[high+1]=temp;
		}
	}
}
 //创建索引文件
void CreatIdxFile()   
{
	stu st;
	Index idex[Maxsize];
	Index vessel;//一个缓存的容器
	int num(0);
	fstream IO_File("stud.dat",ios::in|ios::out|ios::binary);
	if(!IO_File)
	{
		cout<<"The stud.dat file is error!"<no)
			high=mid-1;
		else if (idx[mid].no>no;
	i=SearchNum(idx,n,no)-1;      //在idx中查找
	if (i==-1)
	{
		printf("  提示:学号%d不存在n",no);
		cout<>name;
	i=SearchNum_2(idx,n,name)-1;      //在idx中查找
	if (i==-1)
	{
		cout<<"  提示:姓名:"<>select;
		switch(select)
		{
		case 1:
			WriteFile();
			break;
		case 2:   
			OutputFile() ;
			 break;
		case 3:
			CreatIdxFile();
			 break;
		case 4:
			OutputIdxFile();
			 break;
		case 5:
			Find_Student();
			 break;
		case 6:
			FindStudentname();
			break;
		case 0:
			break;

		}
	}

}
//需要执行的功能选择
void Choice(int k)
{
	while (1)
	{
		switch (k)
		{
		case 1:
			{
				while (1)
				{
					AddStudent();
					cout<<"n是否继续添加学生成绩信息 继续:1 / 退出:0:  ";
					int select1 ;  cin>>select1;
					switch (select1)
					{
					case 1: break;
					case 0: return;
					default: return;
					}
				}
			}

		case 2:
			{
				while (1)
				{
					DeleteStudent();
					cout<<"n是否继续删除学生成绩信息 继续:1 / 退出:0:  ";
					int select2 ;  cin>>select2;
					switch (select2)
					{
					case 1: break;
					case 0: return;
					default: return;
					}
				}
			}
		case 3:
			{
				while (1)
				{                   
					AlterStudent();
					cout<<"n是否继续更改学生成绩信息  继续:1 / 退出:0:  ";
					int select3 ;  cin>>select3;
					switch (select3)
					{
					case 1: break;
					case 0: return;
					default: return;
					}
				}
			}

		case 4:
			{
				while (1)
				{          
					SeekStudent();
					cout<<"n是否继续查询学生成绩信息 继续:1 / 退出:0:  ";
					int select4; cin>>select4; 
					switch (select4)
					{
					case 1: break;
					case 0: return;
					default: return;
					}
				}
			}
		case 5:
			{
				while (1)
				{
					DisplayAll();
					cout<<"n是否退出显示 退出:1 / 刷新:0:  ";
					int select5 ; cin>>select5;
					switch (select5)
					{
					case 1: return;
					case 0: break;
					default: return;
					}
				}
			}
		case 6:
			{
				while (1)
				{
					sort();
					cout<<"n是否退出排序 退出:1 / 刷新:0:  ";
					int select6 ; cin>>select6;
					switch (select6)
					{
					case 1: return;
					case 0: break;
					default: return;
					}
				}
			}
		case 7:
			{
				while (1)
				{
					selectsubject();
					cout<<"n是否退出查询专业 退出:1 / 刷新:0:  ";
					int select7 ; cin>>select7;
					switch (select7)
					{
					case 1: return;
					case 0: break;
					default: return;
					}
				}

			}
			case 8:
			{
				while (1)
				{
					selectmax();
					cout<<"n是否退出查询最高分 退出:1 / 刷新:0:  ";
					int select8 ; cin>>select8;
					switch (select8)
					{
					case 1: return;
					case 0: break;
					default: return;
					}
				}

			}
		case 9:
			{
				while (1)
				{
					file();
				    return;
				}
			}
		default:
			{
				cout<<"nn            输入错误! 按任意键回到主界面nn";
				system("pause");
				return;
			}

		}
	}
}

int main()
{
	CreatList();
	int key;
	while (1)
	{
		menu();
		cin>>key;        
		Choice(key);
	}
	return 0;
}

界面功能图展示:

添加功能:

查询功能:

输出功能:

按专业查询:

 

剩余功能图请自行查看,第一次写博客,有任何问题欢迎指正 

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951439.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号