【单链表实现】学生管理系统(缺少文件输入输出流)

本篇博文结合学过的数据结构单链表的知识,来实现一个学生管理系统的创建,仍有不完善的地方,望大家指出,对于文件输入输出流,会在后续添加。

详细代码如下:


Garde.h

<strong><span style="font-size:18px;">#pragma once
#pragma warning(disable:4996)

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
using namespace std;

class Student;
typedef enum{FALSE,TRUE} Status;

typedef struct Data
{
	char num[20];
	char name[20];
	int Cgrade;
	int Mgrade;
	int Egrade;
	int Total;
	char CRank;
	char ERank;
	char MRank;
}Data;

class Node
{
	friend class Student;
public:
	Node():next(NULL)
	{}
	Node(Data d) :data (d),next(NULL)
	{}
	~Node()
	{}
private:
	Data data;
	Node *next;
};

class Student
{
public:
	Student()
	{
		Node *s = new Node();
		strcpy(s->data.name, "\0");
		strcpy(s->data.num, "\0");
		s->data.Cgrade = 0;
		s->data.Mgrade = 0;
		s->data.Egrade = 0;
		s->data.CRank = '0';
		s->data.MRank = '0';
		s->data.ERank = '0';
		s->data.Total = 0;
		first = last = s;
		last->next = NULL;
		size = 0;
	}

	~Student()
	{
		Clear();
		delete first;
		delete last;
	}

	Status CreateStudent(Data d[], int n)
	{
		if (n < 0)
		{
			return FALSE;
		}
		for (int i = 0; i < n; ++i)
		{
			Node *s = new Node();
			strcpy(s->data.name, d[i].name);
			strcpy(s->data.num, d[i].num);
			s->data.Cgrade = d[i].Cgrade;
			s->data.Mgrade = d[i].Mgrade;
			s->data.Egrade = d[i].Egrade;
			s->data.Total  = d[i].Cgrade + d[i].Egrade + d[i].Mgrade;
			s->data.CRank  = d[i].CRank;
			s->data.MRank  = d[i].MRank;
			s->data.ERank  = d[i].ERank;
			last ->next = s;
			last = s;
			size++;
		}
		return TRUE;
	}

	void T_Sort()//截断法
	{
		if (size == 0 || size == 1)
		{
			return;
		}
		Node * p = first->next;
		Node * q = p->next;
		last = p;
		last->next = NULL;
		while (q != NULL)
		{
			p = q;
			q = q->next;

			Node * s = first;
			while (p->data.Total < s->next->data.Total
				&&s->next != NULL)
			{
				s = s->next;
			}
			if (s->next == NULL)
			{
				p->next = NULL;
				last->next = NULL;
				last = p;
			}
			else
			{
				p->next = s->next;
				s->next = p;
			}
		}
	}

	void C_Sort()
	{
		if (size == 0 || size == 1)
		{
			return;
		}
		Node * p = first->next;
		Node * q = p->next;
		last = p;
		last->next = NULL;
		while (q != NULL)
		{
			p = q;
			q = q->next;

			Node * s = first;
			while (p->data.Total < s->next->data.Total
				&&s->next != NULL)
			{
				s = s->next;
			}
			if (s->next == NULL)
			{
				p->next = NULL;
				last->next = NULL;
				last = p;
			}
			else
			{
				p->next = s->next;
				s->next = p;
			}
		}
	}

	void E_Sort()
	{
		if (size == 0 || size == 1)
		{
			return;
		}
		Node * p = first->next;
		Node * q = p->next;
		last = p;
		last->next = NULL;
		while (q != NULL)
		{
			p = q;
			q = q->next;

			Node * s = first;
			while (p->data.Total < s->next->data.Total
				&&s->next != NULL)
			{
				s = s->next;
			}
			if (s->next == NULL)
			{
				p->next = NULL;
				last->next = NULL;
				last = p;
			}
			else
			{
				p->next = s->next;
				s->next = p;
			}
		}
	}

	void M_Sort()
	{
		if (size == 0 || size == 1)
		{
			return;
		}
		Node * p = first->next;
		Node * q = p->next;
		last = p;
		last->next = NULL;
		while (q != NULL)
		{
			p = q;
			q = q->next;

			Node * s = first;
			while (p->data.Mgrade < s->next->data.Mgrade
				&&s->next != NULL)
			{
				s = s->next;
			}
			if (s->next == NULL)
			{
				p->next = NULL;
				last->next = NULL;
				last = p;
			}
			else
			{
				p->next = s->next;
				s->next = p;
			}
		}
	}

	Status T_InsertStudent(Data d)
	{
		Node * p = first;
		Node * q = p->next;
		if (q->data.Total > d.Total && q != NULL)
		{
			q = q->next;
			p = p->next;
		}
		Node *s = new Node();
		strcpy(s->data.num, d.num);
		strcpy(s->data.name, d.name);
		s->data.Cgrade = d.Cgrade;
		s->data.CRank = d.CRank;
		s->data.Mgrade = d.Mgrade;
		s->data.MRank = d.MRank;
		s->data.Egrade = d.Egrade;
		s->data.ERank = d.ERank;
		s->data.Total = d.Total;
		if (q == NULL)
		{
			last->next = s;
			last = s;
			last->next = NULL;
		}
		else
		{
			s->next = p->next;
			p->next = s;
		}
		size++;
		return TRUE;
	}

	Status E_InsertStudent(Data d)
	{
		Node * p = first;
		Node * q = p->next;
		if (q->data.Egrade > d.Egrade && q != NULL)
		{
			q = q->next;
			p = p->next;
		}
		Node *s = new Node();
		strcpy(s->data.num, d.num);
		strcpy(s->data.name, d.name);
		s->data.Cgrade = d.Cgrade;
		s->data.CRank = d.CRank;
		s->data.Mgrade = d.Mgrade;
		s->data.MRank = d.MRank;
		s->data.Egrade = d.Egrade;
		s->data.ERank = d.ERank;
		s->data.Total = d.Total;
		if (q == NULL)
		{
			last->next = s;
			last = s;
			last->next = NULL;
		}
		else
		{
			s->next = p->next;
			p->next = s;
		}
		size++;
		return TRUE;
	}

	Status M_InsertStudent(Data d)
	{
		Node * p = first;
		Node * q = p->next;
		if (q->data.Mgrade > d.Mgrade && q != NULL)
		{
			q = q->next;
			p = p->next;
		}
		Node *s = new Node();
		strcpy(s->data.num, d.num);
		strcpy(s->data.name, d.name);
		s->data.Cgrade = d.Cgrade;
		s->data.CRank = d.CRank;
		s->data.Mgrade = d.Mgrade;
		s->data.MRank = d.MRank;
		s->data.Egrade = d.Egrade;
		s->data.ERank = d.ERank;
		s->data.Total = d.Total;
		if (q == NULL)
		{
			last->next = s;
			last = s;
			last->next = NULL;
		}
		else
		{
			s->next = p->next;
			p->next = s;
		}
		size++;
		return TRUE;
	}

	Status C_InsertStudent(Data d)
	{
		Node * p = first;
		Node * q = p->next;
		if (q->data.Cgrade > d.Cgrade && q != NULL)
		{
			q = q->next;
			p = p->next;
		}
		Node *s = new Node();
		strcpy(s->data.num, d.num);
		strcpy(s->data.name, d.name);
		s->data.Cgrade = d.Cgrade;
		s->data.CRank = d.CRank;
		s->data.Mgrade = d.Mgrade;
		s->data.MRank = d.MRank;
		s->data.Egrade = d.Egrade;
		s->data.ERank = d.ERank;
		s->data.Total = d.Total;
		if (q == NULL)
		{
			last->next = s;
			last = s;
			last->next = NULL;
		}
		else
		{
			s->next = p->next;
			p->next = s;
		}
		size++;
		return TRUE;
	}

	Node * Find(char num[])
	{
		assert(num != NULL);
		Node * p = first;
		while ( p->next->data.num != num && p->next != NULL )
		{
			p = p->next;
		}
		if(strcmp(p->data.num ,num) == 0)
		{
			return p;
		}
		return NULL;
	}

	Node *Pre(char num[])
	{
		assert(num != NULL);
		Node * p = first;
		Node * s = Find(num);
		if (s == NULL)
		{
			return NULL;
		}
		while (p->next != s)
		{
			p = p->next;
		}
		return p;
	}

	Status Delete(char num[])
	{
		assert(num != NULL);
		Node * p = Find(num);
		Node * pre = Pre(num);
		if (pre == NULL || p == NULL)
		{
			return FALSE;
		}
		pre->next = p->next;
		if (p->next == NULL)
		{
			last = pre;
		}
		size--;
		return TRUE;
	}

	Status Modify(char num[])
	{
		int number;
		assert(num != NULL);
		Node * s = Find(num);
		if (s == NULL)
		{
			return FALSE;
		}
		cout << "请选取需修改的内容:" << endl;
		cout << "*********************************" << endl;
		cout << "**1.Chinese        2.Math      **" << endl;
		cout << "**3.English        4.Name      **" << endl;
		cout << "*********************************" << endl;
		cin >> number;
		switch (number)
		{
		case 1:
			int score;
		    cout << "请输入修改后的值:";
		    cin >> score;
		    s->data.Cgrade = score;
		    if (s->data.Cgrade < 60)
		    {
				s->data.CRank = 'E';
			}
		    if (s->data.Cgrade < 70 && s->data.Cgrade >= 60)
		    {
				s->data.CRank = 'D';
		    }
			if (s->data.Cgrade < 80 && s->data.Cgrade >= 70)
			{
				s->data.CRank = 'C';
		    }
		    if (s->data.Cgrade < 90 && s->data.Cgrade >= 80)
		    {
				s->data.CRank = 'B';
		    }
		    if (s->data.Cgrade >= 90)
		    {
				s->data.CRank = 'A';
		    }
			s->data.Total = s->data.Cgrade + s->data.Egrade + s->data.Mgrade;
		    break;
		case 2:
			cout << "请输入修改后的值:";
			cin >> score;
			s->data.Mgrade = score;
			if (s->data.Mgrade < 60)
			{
				s->data.MRank = 'E';
			}
			if (s->data.Mgrade < 70 && s->data.Mgrade >= 60)
			{
				s->data.MRank = 'D';
			}
			if (s->data.Mgrade < 80 && s->data.Mgrade >= 70)
			{
				s->data.MRank = 'C';
			}
			if (s->data.Mgrade < 90 && s->data.Mgrade >= 80)
			{
				s->data.MRank = 'B';
			}
			if (s->data.Mgrade >= 90)
			{
				s->data.MRank = 'A';
			}
			s->data.Total = s->data.Cgrade + s->data.Egrade + s->data.Mgrade;
			break;
		case 3:
			cout << "请输入修改后的值:";
			cin >> score;
			s->data.Egrade = score;
			if (s->data.Egrade < 60)
			{
				s->data.ERank = 'E';
			}
			if (s->data.Egrade < 70 && s->data.Egrade >= 60)
			{
				s->data.ERank = 'D';
			}
			if (s->data.Egrade < 80 && s->data.Egrade >= 70)
			{
				s->data.ERank = 'C';
			}
			if (s->data.Egrade < 90 && s->data.Egrade >= 80)
			{
				s->data.ERank = 'B';
			}
			if (s->data.Egrade >= 90)
			{
				s->data.ERank = 'A';
			}
			s->data.Total = s->data.Cgrade + s->data.Egrade + s->data.Mgrade;
			break;
		case 4:
			char str[20];
			cout << "请输入修改后的值:";
		    cin >> str;
		    strcpy(s->data.name, str);
			break;
		default:
			break;
		}
		return TRUE;
	}

	void Show()
	{
		Node * p = first->next;
		while (p != NULL)
		{
			cout << p->data.num    << " "
				 << p->data.name   << " "
				 << p->data.Cgrade << " "
				 << p->data.CRank  << " "
				 << p->data.Mgrade << " "
				 << p->data.MRank  << " "
				 << p->data.Egrade << " "
				 << p->data.ERank  << " "
				 << p->data.Total  << endl;
			p = p->next;
		}
	}

	int length()
	{
		return size;
	}

	void Clear()
	{
		Node *p = first->next;
		while (p != NULL)
		{
			first->next = p->next;
			delete p;
			p = p->next;
		}
		last = first;
		size = 0;
	}

	Status Delete()
	{
		return TRUE;
	}
private:
	Node * first;
	Node * last;
	size_t size;
};
</span></strong>


main.cpp

<strong><span style="font-size:18px;">#include "Grade.h"

int main()
{
	int select = 1;
	int num = -1;
	Student stu;
	Data data;
	while (select)
	{
		cout << "           *********************学生成绩管理系统********************\n";
		cout << "           ** 1.CreateStudent                   2.InsertStudent   **\n";
		cout << "           ** 3.SortStudent                     4.ShowStudent     **\n";
		cout << "           ** 5.ModifyStudent                   6.DeleteStudent   **\n";
		cout << "           ** 7.Clear                           8.Number          **\n";
		cout << "           ** 0.Quit                                              **\n";
		cout << "           *********************************************************\n";
		cout << "请输入所选操作:";
		cin >> select;
		switch (select)
		{
		case 1:
			cout << "请输入学生个数:";
			int N;
			cin >> N;
			Data d[100];
			cout << "请输入每个学生学号、姓名、语数英三科成绩:\n";
			for (int i = 0; i < N; ++i)
			{
				cin >> d[i].num >> d[i].name >> d[i].Cgrade
					>> d[i].Mgrade >> d[i].Egrade;
				d[i].Total = d[i].Cgrade + d[i].Egrade + d[i].Mgrade;
				if (d[i].Cgrade < 60)
				{
					d[i].CRank = 'E';
				}
				if (d[i].Cgrade < 70 && d[i].Cgrade >= 60)
				{
					d[i].CRank = 'D';
				}
				if (d[i].Cgrade < 80 && d[i].Cgrade >= 70)
				{
					d[i].CRank = 'C';
				}
				if (d[i].Cgrade < 90 && d[i].Cgrade >= 80)
				{
					d[i].CRank = 'B';
				}
				if (d[i].Cgrade >= 90)
				{
					d[i].CRank = 'A';
				}
				if (d[i].Egrade < 60)
				{
					d[i].ERank = 'E';
				}
				if (d[i].Egrade < 70 && d[i].Egrade >= 60)
				{
					d[i].ERank = 'D';
				}
				if (d[i].Egrade < 80 && d[i].Egrade >= 70)
				{
					d[i].ERank = 'C';
				}
				if (d[i].Egrade < 90 && d[i].Egrade >= 80)
				{
					d[i].ERank = 'B';
				}
				if (d[i].Egrade >= 90)
				{
					d[i].ERank = 'A';
				}
				if (d[i].Mgrade < 60)
				{
					d[i].MRank = 'E';
				}
				if (d[i].Mgrade < 70 && d[i].Mgrade >= 60)
				{
					d[i].MRank = 'D';
				}
				if (d[i].Mgrade < 80 && d[i].Mgrade >= 70)
				{
					d[i].MRank = 'C';
				}
				if (d[i].Mgrade < 90 && d[i].Mgrade >= 80)
				{
					d[i].MRank = 'B';
				}
				if (d[i].Mgrade >= 90)
				{
					d[i].MRank = 'A';
				}
			}
			stu.CreateStudent(d, N);
			break;
		case 2:
			cout << "请输入所插入学生信息:" << endl;
			cin >> data.num >> data.name >> data.Cgrade >> data.Mgrade
				>> data.Egrade;
			data.Total = data.Cgrade + data.Egrade + data.Mgrade;
			if (data.Cgrade < 60)
			{
				data.CRank = 'E';
			}
			if (data.Cgrade < 70 && data.Cgrade >= 60)
			{
				data.CRank = 'D';
			}
			if (data.Cgrade < 80 && data.Cgrade >= 70)
			{
				data.CRank = 'C';
			}
			if (data.Cgrade < 90 && data.Cgrade >= 80)
			{
				data.CRank = 'B';
			}
			if (data.Cgrade >= 90)
			{
				data.CRank = 'A';
			}
			if (data.Egrade < 60)
			{
				data.ERank = 'E';
			}
			if (data.Egrade < 70 && data.Egrade >= 60)
			{
				data.ERank = 'D';
			}
			if (data.Egrade < 80 && data.Egrade >= 70)
			{
				data.ERank = 'C';
			}
			if (data.Egrade < 90 && data.Egrade >= 80)
			{
				data.ERank = 'B';
			}
			if (data.Egrade >= 90)
			{
				data.ERank = 'A';
			}
			if (data.Mgrade < 60)
			{
				data.MRank = 'E';
			}
			if (data.Mgrade < 70 && data.Mgrade >= 60)
			{
				data.MRank = 'D';
			}
			if (data.Mgrade < 80 && data.Mgrade >= 70)
			{
				data.MRank = 'C';
			}
			if (data.Mgrade < 90 && data.Mgrade >= 80)
			{
				data.MRank = 'B';
			}
			if (data.Mgrade >= 90)
			{
				data.MRank = 'A';
			}
			cout << endl;
			cout << "*************************************" << endl;
			cout << "**1.Total_Insert   2.Chinese_Insert**" << endl;
			cout << "**3.Math_Insert    4.English_Insert**" << endl;
			cout << "*************************************" << endl;
			cout << "请选取插入方式:";
			cin >> num;
			switch (num)
			{
			case 1:
				stu.T_InsertStudent(data);
				break;
			case 2:
				stu.C_InsertStudent(data);
				break;
			case 3:
				stu.M_InsertStudent(data);
				break;
			case 4:
				stu.E_InsertStudent(data);
				break;
			default:
				break;
			}
			break;
		case 3:
			cout << endl;
			cout << "*********************************" << endl;
			cout << "**1.Total_Sort   2.Chinese_Sort**" << endl;
			cout << "**3.Math_Sort    4.English_Sort**" << endl;
			cout << "*********************************" << endl;
			cout << "请选取排序方式:";
			cin >> num;
			switch (num)
			{
			case 1:
				stu.T_Sort();
				break;
			case 2:
				stu.C_Sort();
				break;
			case 3:
				stu.M_Sort();
				break;
			case 4:
				stu.E_Sort();
				break;
			default:
				break;
			}
			break;
		case 4:
			stu.Show();
			break;
		case 5:
			cout << "请输入要修改的学生的学号:";
			cin >> data.num;
			stu.Modify(data.num);
			break;
		case 6:
			cout << "请输入删除学生学号:";
			cin >> data.num;
			stu.Delete(data.num);
			break;
		case 7:
			stu.Clear(); 
			break;
		case 8:
			cout << "记录学生数目:"<< stu.length() << endl;
			break;
		case 0:
			break;
		default:
			break;
		}
	}
	return 0;
}</span></strong>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值