您的位置:首页 > 其它

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

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

详细代码如下:

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: