/*
Name: 链表实现考试报名系统
Description: 完成对考生信息的建立,查找,插入,修改,删除等功能
*/
//==================================学生成绩管理系统================================
#include<iostream>
using namespace std;
//======================Node类作为链表的结点,用以存储单个考生信息===================
class Node
{
friend class Examinee;
public:
long examnum;//准考证号
string name;//姓名
string sex;//性别
int age;//年龄
string type;//报考类别
Node *next;//指向下一个结点的指针
Node();
};
//=======================Examinee类作为单链表类,用以实现相关操作=====================
class Examinee
{
public:
void Creat(Examinee &L);
void Insert(Examinee &L);
void Delete(Examinee &L);
void Update(Examinee &L);
void Lookup(Examinee &L);
int Length(Examinee &L);
void Print(Examinee &L);
Examinee();
private:
Node *head;
};
//===========================Node类的构造函数,初始化结点数据==========================
Node::Node()
{
examnum = 0;
name = '?';
sex = '?';
age = 0;
type = '?';
next = NULL;
}
//===========================Examinee类的构造函数,初始化首结点========================
Examinee::Examinee()
{
head = NULL;
}
//=============================创建考生信息的线性表(单链表)===========================
void Examinee::Creat(Examinee &L)
{
cout << "请输入考生人数:" ;
int n;
cin >> n;
cout << "请依次输入考生的考号,姓名,性别,年龄以及报考类别!" << '\n';
Node *p,*s;
for(int j = 0;j < n;j++)
{
p = new Node;
long examnum;
cin >> examnum;
p->examnum = examnum;
string name;
cin >> name;
p->name = name;
string sex;
cin >> sex;
p->sex = sex;
int age;
cin >> age;
p->age = age;
string type;
cin >> type;
p->type = type;
p->next = NULL;
if(j==0)
{
L.head = p;
s = L.head;
}
else
{
s->next = p;
s = p;
}
}
}
//================================输出线性表中所有考生信息=============================
void Examinee::Print(Examinee &L)
{
Node *p = L.head;
cout << '\n';
cout << "考号" << '\t' << "姓名" << '\t' << "性别" << '\t';
cout << "年龄" << '\t' << "报考类别" << '\n';
while(p->next)
{
cout << p->examnum << '\t' << p->name << '\t' << p->sex << '\t';
cout << p->age << '\t' << p->type << '\n';
p = p->next;
}
//输出链表的最后一个结点
cout << p->examnum << '\t' << p->name << '\t' << p->sex << '\t';
cout << p->age << '\t' << p->type << '\n';
}
//===============================查询线性表的长度======================================
int Examinee::Length(Examinee &L)
{
Node *p = L.head;
int i = 1;
while(p->next)
{
i++;
p = p->next;
}
return i;
}
//==========================在线性表的某个位置上插入考生信息===========================
void Examinee::Insert(Examinee &L)
{
cout << "请输入你要插入的考生的位置:";
int m;
cin >> m;
if(m > Examinee::Length(L) + 1)
{
cout << "你要插入的位置不存在,请重新输入!"<<'\n';
Examinee::Insert(L);
}
else
{
Node *p,*s;
p = new Node;
s = L.head;
cout << "请依次输入要插入的考生的考号,姓名,性别,年龄及报考类别!" << '\n';
long examnum;
cin >> examnum;
p->examnum = examnum;
string name;
cin >> name;
p->name = name;
string sex;
cin >> sex;
p->sex = sex;
int age;
cin >> age;
p->age = age;
string type;
cin >> type;
p->type = type;
if(m == 1)
{
p->next = L.head;
L.head = p;
}
else
{
int i = 1;
while(i != m - 1)
{
s = s->next;
i++;
}
p->next = s->next;
s->next = p;
}
}
}
//==========================根据考号删除线性表中对应的学生信息===========================
void Examinee::Delete(Examinee &L)
{
cout << "请输入要删除的考生的考号";
long examnum;
cin >> examnum;
Node *p = L.head;
Node *s;
int i = 1;
while(p->next)
{
if(L.head->examnum == examnum)
{
s = L.head;
L.head = s->next;
cout << "你要删除的考生信心是:"<< s->examnum << '\t' << s->name <<'\t';
cout << s->sex << '\t' << s->age << '\t' << s->type <<'\n';
break;
}
else if(p->next->examnum = examnum)
{
s = p->next;
p->next = s->next;
cout << "你删除的考生信息是:" << s->examnum << '\t' << s->name <<'\t';
cout << s->sex << '\t' << s->age <<'\t' << s->type << '\n';
break;
}
else
{
p = p->next;
i++;
}
}
if(i > Examinee::Length(L))
{
cout << "你要删除的考生不存在,请重新输入考号!" << '\n';
Examinee::Delete(L);
}
}
//================================根据考号查询线性表中的考生信息=============================
void Examinee::Lookup(Examinee &L)
{
cout << "请输入要查找的学生的考号:";
long examnum;
cin >> examnum;
Node *p = L.head;
int i = 1;
while(p)
{
if(p->examnum == examnum)
{
cout << "考号" << '\t' << "姓名" << '\t' << "性别" << '\t';
cout << "年龄" << '\t' << "报考类别" << '\n';
cout << p->examnum << '\t' << p->name << '\t' << p->sex << '\t';
cout << p->age << '\t' << p->type << '\n';
break;
}
else
{
p = p->next;
i++;
}
}
cout << '\n';
if(i > Examinee::Length(L)){
cout << "你要查询的考生不存在,请重新输入考号!" << endl;
Examinee::Lookup(L);
}
}
//===============================根据考号修改线性表中的考生信息==============================
void Examinee::Update(Examinee &L)
{
cout << "请输入要修改信息的考生的考号:";
long examnum;
cin >> examnum;
Node *p = L.head;
int i = 1;
if(i > Examinee::Length(L)){
cout << "你要修改信息的考生不存在,请重新输入考号!" << endl;
Examinee::Update(L);
}
while(p)
{
if(p->examnum == examnum)
{
cout << "请依次输入修改后的考生的考号,姓名,性别,年龄以及报考类别!" << '\n';
long updatenum;
cin >> updatenum;
p->examnum = updatenum;
string name;
cin >> name;
p->name = name;
string sex;
cin >> sex;
p->sex = sex;
int age;
cin >> age;
p->age = age;
string type;
cin >> type;
p->type = type;
break;
}
else
{
p = p->next;
i++;
}
}
}
//====================================================界面======================================================
int Menu()
{
cout << "=============================请选择相应的功能============================" <<endl;
cout << '\n';
cout << "-----------------------------1.插入--------------------------------------" <<endl;
cout << "-----------------------------2.删除--------------------------------------" <<endl;
cout << "-----------------------------3.查找--------------------------------------" <<endl;
cout << "-----------------------------4.修改--------------------------------------" <<endl;
cout << "-----------------------------5.统计--------------------------------------" <<endl;
cout << "-----------------------------0.取消操作----------------------------------" <<endl;
cout << '\n';
cout << "=========================================================================" <<endl;
}
//=========================================主函数,调用类Examinee的成员函数以实现相应的功能==========
int main()
{
cout << "首先建立考生信息系统!" << '\n';
Examinee L;
L.Creat(L);
L.Print(L);
int j = -1;
Menu();
while(j)
{
cout << "\n" << "请选择您要进行的操作:";
cin >> j;
switch(j)
{
case 1:
{
L.Insert(L);
L.Print(L);
}
case 2:
{
L.Delete(L);
L.Print(L);
break;
}
case 3:
{
L.Lookup(L);
L.Print(L);
break;
}
case 4:
{
L.Update(L);
L.Print(L);
break;
}
case 5:
{
cout << "该考生系统人数为:" << L.Length(L) << '\n';
break;
}
default:
{
cout << "该操作不存在,请输入正确操作!" << '\n';
break;
}
}
}
return 0;
}