数据结构之用栈实现课堂经验值管理小程序

【程序题】

设计一个最少包含学生学号、姓名、经验值等信息表,设计一个如下所示功能的程序:

课堂经验值管理小程序

******************************************       

* 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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NO BUG NO LIFES

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值