#include <iostream>
#include <string>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef struct LNode
{ //单链表的存储结构
string no;
string name;
int jyz; //结点的数据域
struct LNode *next; //结点的指针域
} LNode, *Linklist; //Linklist为指向结构体LNode的指针类型
int Initlist_L(Linklist &L)
{ //构造一个空的单链表L
L = new LNode;
L->next = NULL;
return OK;
}
//导入文件建学生经验值表
//后插法创建单链表
void Createlist_L(Linklist &L, int n)
{
LNode *p, *r;
L = new LNode;
L->next = NULL;
r = L; //尾指针指向头结点
cout << "请输入学生的学号、姓名、经验值:\n";
for (int i = 0; i < n; i++)
{
p = new LNode;
cin >> p->no;
cin >> p->name;
cin >> p->jyz;
cout << endl;
p->next = NULL; //插入到表尾
r->next = p;
r = p; //r指向新的尾结点
}
}
//插入学生
void Linkinsert_L(Linklist &L, string no1, string name1, int c)
{
LNode *p, *s;
p = L;
while (p)
{
if (!(p->next))
break;
else
p = p->next;
}
s = new LNode;
s->no = no1;
s->name = name1;
s->jyz = c;
s->next = NULL;
p->next = s;
cout << "插入成功!\n";
}
//删除学生
void Listdelete_L(Linklist &L, int d, string key)
{
int flag = 0;
LNode *p, *q = new LNode; //在这里不能只写LNode *p;
//因为后面delete p;(当p不存在时会出错)
//因为p还没有分配空间
p = L;
switch (d)
{
case 1:
{
//按学号查找
while (p)
{
if (p->next)
{
if (p->next->no == key)
{
q = p->next;
p->next = q->next;
flag = 1;
break;
}
}
p = p->next;
}
string s;
s = flag == 1 ? "成功删除" + q->name + "的所有信息!" : "没有找到学号为" + key + "的学生的信息!";
cout << s << endl;
delete q;
break;
}
case 2: { //按姓名查找
while (p)
{
if (p->next)
{
if (p->next->name == key)
{
q = p->next;
p->next = q->next;
flag = 1;
break;
}
}
p = p->next;
}
string s;
s = flag == 1 ? "成功删除" + q->name + "的所有信息!" : "没有找到" + key + "的信息!";
cout << s << endl;
delete q;
break;
}
default:
break;
}
}
//显示全部学生的信息
void presentstudent(Linklist L)
{
LNode *p;
p = L->next;
int num = 0;
cout << "学号" << "姓名" << "经验值" << endl;
while (p)
{
cout << p->no << " " << p->name << " " << p->jyz << endl;
p = p->next;
num++;
}
cout << "已显示出所有学生的信息,总共有" << num << "个学生!" << endl;
}
//为某学号学生加指定经验值
void Jiajyz(Linklist &L, string no1, int jyz2)
{
LNode *p;
p = L->next;
while (p && p->no != no1)
{
p = p->next;
}
if (!p) {
cout << "该学号不存在!\n";
} else {
p->jyz = p->jyz + jyz2;
cout << "成功为" << p->no << "同学增加经验值" << jyz2 << endl;
cout << "现该学生的信息如下:\n";
cout << p->no << " " << p->name << " " << p->jyz << endl;
}
}
//为某学号学生减指定经验值
void Jianjyz(Linklist &L, string no2, int jyz2)
{
LNode *p;
p = L->next;
while (p && p->no != no2)
{
p = p->next;
}
if (!p)
{
cout << "该学号不存在!\n";
}
else
{
p->jyz = p->jyz - jyz2;
cout << "成功为" << p->no << "同学减去经验值" << jyz2 << endl;
cout << "该学生的信息如下:\n";
cout << p->no << " " << p->name << " " << p->jyz << endl;
}
}
// 按姓名查找学生经验值
LNode *Locatename_L(Linklist L, string name1)
{
LNode *p;
p = L->next;
while (p && p->name != name1)
p = p->next;
if (!p)
{
cout << "该学生不存在!" << endl;
}
else
{
cout << "该学生的经验值如下:\n";
cout << p->no << " " << p->name << " " << p->jyz << endl;
}
return p;
}
//求经验值最高的学生信息
void GetHighest(Linklist L)
{
LNode *Biger = new LNode; //最大的那个数
LNode *B = new LNode;
LNode *p = new LNode;
p = L->next;
Biger->jyz = p->jyz;
Biger->name = p->name;
Biger->no = p->no;
Biger->next = NULL;
while (p)
{ //寻找最高的经验值
if (p->next)
{
p = p->next;
if (p->jyz > Biger->jyz)
{
Biger->jyz = p->jyz;
Biger->name = p->name;
Biger->no = p->no;
Biger->next = NULL;
}
} else
break;
}
p = L->next;
B = Biger;
while (p)
{ //最高经验值不止一个学生的时候
if (p->jyz == Biger->jyz)
{
LNode *t = new LNode;
t->jyz = p->jyz;
t->name = p->name;
t->no = p->no;
t->next = NULL;
B->next = t;
B = B->next;
}
p = p->next;
}
Biger = Biger->next;
while (Biger)
{
cout << "学号 " << "姓名 " << "经验值" << endl;
cout << Biger->no << " " << Biger->name << " " << Biger->jyz << " " << endl;
Biger = Biger->next;
}
}
int main()
{
int choose, n1, jyz2, mode;
string no2, name2, key1;
LNode *p, *la;
cout << " ***************************************" << endl;
cout << "* 1-------建立学生经验值表 *" << endl;
cout << "* 2-------输入所有学生的信息 *" << endl;
cout << "* 3-------插入学生 *" << endl;
cout << "* 4-------删除学生 *" << endl;
cout << "* 5-------显示全部学生信息 *" << endl;
cout << "* 6-------为某学号学生加指定经验值 * " << endl;
cout << "* 7-------为某学号学生减指定经验值 *" << endl;
cout << "* 8-------按姓名查找学生经验值 *" << endl;
cout << "* 9-------求经验值最高的学生信息 *" << endl;
cout << "* 0-------存盘并退出 *" << endl;
cout << "***************************************" << endl;
choose = -1;
while (choose != 0)
{
cout << "请选择:";
cin >> choose;
switch (choose)
{
case 1:
if (Initlist_L(la))
cout << "成功建立学生经验值表!\n\n";
break;
case 2:
cout << "请输入要学生的个数:";
cin >> n1;
Createlist_L(la, n1);
cout << "成功学生经验值表!" << endl << endl;
break;
case 3:
cout << "请分别输入要插入的学生的学号、姓名、经验值\n";
cin >> no2 >> name2 >> jyz2;
Linkinsert_L(la, no2, name2, jyz2);
break;
case 4:
{
string Key1;
cout << "请选择删除方式:" << endl;
cout << "1:按学号删除" << endl;
cout << "2:按姓名删除" << endl;
cout << "请选择1或2" << endl;
cin >> mode;
if (mode == 1 || mode == 2)
{
string s = mode == 1 ? "请输入要删除学生的学号!" : "请输入要删除学生的姓名!";
cout << s << endl;
cin >> key1;
Listdelete_L(la, mode, key1);
}
else
{
cout << "请输入合法数字!" << endl;
}
break;
}
case 5:
{
presentstudent(la);
break;
}
case 6:
{
cout << "请输入学生的学号:";
cin >> no2;
cout << "请输入要增加的经验值:";
cin >> jyz2;
Jiajyz(la, no2, jyz2);
break;
}
case 7:
{
cout << "请输入学生的学号:";
cin >> no2;
cout << "请输入要减少的经验值:";
cin >> jyz2;
Jianjyz(la, no2, jyz2);
break;
}
case 8:
{
cout << "请输入要查找的学生:";
cin >> name2;
Locatename_L(la, name2);
break;
}
case 9:
{
GetHighest(la);
break;
}
default:
break;
}
}
return 0;
}
数据结构-链表-课堂管理系统
最新推荐文章于 2022-10-20 23:09:57 发布