【程序题】
设计一个最少包含学生学号、姓名、经验值等信息表,设计一个如下所示功能的程序:
课堂经验值管理小程序 ****************************************** * 1-------为某学号学生加指定经验值 * * 2-------为某学号学生减指定经验值 * * 3-------撤销加减经验值的错误操作 * ******************************************** |
并初始化内置以下学生名单数据:
学号 姓名 当前经验值
100 张三 1000
101 李四 1100
102 王五 1200
103 赵六 1300
104 钱七 1400
#include<iostream>
#include<string.h>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
//typedef int ElemType;
typedef struct {
int no;
char name[10];
int jyz;
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next;
}LNode, * LinkList;
typedef struct {
char opr;
int no;
int jyz;
}SElemType;
typedef struct StackNode {
SElemType data;
struct StackNode* next;
}StackNode, * LinkStack;
Status InitList_L(LinkList& L) {
L = new LNode;
L->next = NULL;
return OK;
}
Status ListInser_L(LinkList& L, int i, ElemType& e) {
//在带头结点的单链表L中第i个位置之前插入元素e
int j;
LNode* p, * s;
p = L; j = 0;
while (p && j < i - 1) { p = p->next; ++j; }
if (!p || j > i - 1)return ERROR;
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return OK;
}
Status ListDelete_L(LinkList& L, int i, ElemType& e) {
//在带头结点的单链表L中,删除第i个位置,并由e返回值
LNode* p, * q;
int j;
p = L; j = 0;
while (p->next && j < i - 1) { p = p->next; ++j; }
if (!(p->next) || j > i - 1)return ERROR;
q = p->next;
p->next = q->next;
e = q->data;
delete q;
return OK;
}
LNode* LocateElem_L(LinkList L, ElemType e) {
LNode* p;
p = L->next;
while (p && strcmp(p->data.name, e.name))
p = p->next;
return p;
}
void CreateList_L(LinkList& L, int n) {
//正位序输入n个元素的值,建立到头结点单链表L
LNode* r, * p;
L = new LNode;
L->next = NULL;
r = L;
cout << "请输入" << n << "个数:\n";
for (int i = 0; i < n; i++) {
p = new LNode;
cin >> p->data.no;
p->next = NULL; r->next = p;
r = p;
}
}
int jia(LinkList& L, ElemType e, int jyz) {
LNode* p;
p = L->next;
while (p && p->data.no != e.no)
{
p = p->next;//寻找满足条件的结点
}
if (!p)return 0;
else
{
p->data.jyz = p->data.jyz + jyz;
return 1;
}
}
int jian(LinkList& L, ElemType e, int jyz) {
LNode* p;
p = L->next;
while (p && p->data.no != e.no)
{
p = p->next;
}
if (!p)return 0;
else
{
p->data.jyz = p->data.jyz - jyz;
return 1;
}
}
/*
void GetHighest(LinkList L)
{
LNode* Biger = new LNode;//最大的那个数
LNode* B = new LNode;
LNode* p = new LNode;
p = L->next;
//Biger->data.jyz = p->data.jyz;
Biger = L->next;
Biger->next = NULL;
while (p)//寻找最高的经验值
{
p = p->next;
if (p->data.jyz > Biger->data.jyz)
{
//Biger->data.jyz = p->data.jyz;
Biger = p;
Biger->next = NULL;
}
break;
}
cout << Biger->data.no << " " << Biger->data.name << " " << Biger->data.jyz;
}
*/
//算法3.5 链栈的初始化
Status InitStack(LinkStack& S) {
S = NULL;
return OK;
}
//算法3.6 链表的入栈
Status Push(LinkStack& S, SElemType e) {
LinkStack p;
p = new StackNode;
p->data = e;
p->next = S;
S = p;
return OK;
}
//算法3.7 链表的出栈
Status Pop(LinkStack& S, SElemType& e) {
LinkStack p;
if (S == NULL)
return ERROR;
e = S->data;
p = S;
S = S->next;
delete p;
return OK;
}
//算法3.8 取链栈的栈顶元素
SElemType GetTop(LinkStack S) {
if (S != NULL)
return S->data;
}
int main()
{
LinkStack s;
SElemType t;
InitStack(s);
//LinkList L;
ElemType res, b;
LNode* p, * L;
int i, temp, a, c, choose, n, jyz;
/*
cout << "课堂经验值管理系统\n";
cout << "1. 插入学生\n";
cout << "2. 删除学生\n";
cout << "3. 为某学号同学加指定经验值\n";
cout << "4. 为某学号同学减指定经验值\n";
cout << "5. 按姓名查找学生经验值\n";
cout << "6. 求经验值最高的学生信息\n";
//cout << "2. 输入学生数据\n";
//cout << "1. 建立学生信息表\n";
//cout << "3. 按学号查找学生经验值\n";
//cout << "4. 插入新同学信息\n";
//cout << "5. 删除离班同学信息\n";
//cout << "6. 输出全部学生信息\n";
//cout << "7. 为某学号同学加指定经验值\n";
//cout << "8. 为某学号同学减指定经验值\n";
//cout << "0. 退出\n\n";
*/
InitList_L(L);
choose = -1;
b.no = 100;
strcpy(b.name, "张三");
b.jyz = 1000;
ListInser_L(L, 1, b);
b.no = 101;
strcpy(b.name, "李四");
b.jyz = 1100;
ListInser_L(L, 2, b);
b.no = 102;
strcpy(b.name, "王五");
b.jyz = 1200;
ListInser_L(L, 3, b);
b.no = 103;
strcpy(b.name, "赵六");
b.jyz = 1300;
ListInser_L(L, 4, b);
b.no = 104;
strcpy(b.name, "钱七");
b.jyz = 1400;
ListInser_L(L, 5, b);
//cout << "请选择:";
choose = -1;
while (cin >> choose)
{
switch (choose)
{
case 1:
cin >> b.no; //输入e,代表所要查找的数值
cin >> jyz;
temp = jia(L, b, jyz);
if (temp) {
t.opr = '+'; t.no = b.no; t.jyz = jyz;
Push(s,t);
}
/*
if (temp != 0)
{
p = L->next;
while (p)
{
cout << p->data.no << " " << p->data.name << " " << p->data.jyz << "\n";
p = p->next;
}
//cout << endl;
}
*/
else
cout << "加经验值失败\n";
break;
// break;
case 2:
cin >> b.no; //输入e,代表所要查找的数值
cin >> jyz;
temp = jian(L, b, jyz);
if (temp) {
t.opr = '-'; t.no = b.no; t.jyz = jyz;
Push(s,t);
}
/*
if (temp != 0)
{
p = L->next;
while (p)
{
cout << p->data.no << " " << p->data.name << " " << p->data.jyz << "\n";
p = p->next;
}
//cout << endl;
}
*/
else
cout << "减经验值失败\n";
break;
//break;
case 3:
if (Pop(s, t))
{
if (t.opr == '+')
{
b.no = t.no;
jian(L, b, t.jyz);
}
if (t.opr == '-')
{
b.no = t.no;
jia(L, b, t.jyz);
}
// if (temp != 0)
//{
p = L->next;
while (p)
{
cout << p->data.no << " " << p->data.name << " " << p->data.jyz << "\n";
p = p->next;
}
//cout << endl;
// }
//cout << "撤销成功!" << endl;
}
else cout << "撤销失败" << endl;
break;
}
}
return 0;
}