当前位置: 首页 > news >正文

04学生管理系统(栈)

文章目录

    • 预处理
    • 菜单
    • 结构体
    • 主函数
    • 函数声明
    • 栈操作
    • 功能实现

预处理

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>#define OVERFLOW -2
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0
typedef int Status;
//栈的顺序存储表示#define STACK_INIT_SIZE 100 //存储空间的初始分配量
#define STACKINCREAMENT 10  //存储空间分配增量

菜单

menu()
{printf("\n\n\t\t*******************************************\n");printf("\t\t*              学生信息管理系统           *\n");printf("\t\t*             1.查询学生信息              *\n");printf("\t\t*             2.增加学生信息              *\n");printf("\t\t*             3.删除学生信息              *\n");printf("\t\t*             4.显示全部信息              *\n");printf("\t\t*             5.排序                      *\n");printf("\t\t*             0.退出系统                  *\n");printf("\t\t*******************************************\n");
}

结构体

//栈的元素类型
typedef struct
{char name[10];float score;
}SElemType;typedef struct
{SElemType* base;  //构造之前和销毁之后base的值为NULLSElemType* top;   //栈顶指针int stacksize;    //当前已分配的存储空间
}SqStack;//全局变量
SElemType data;
SqStack stack;

主函数

void main()
{char x;InitStack(&stack);while (1){system("cls");menu();x = getchar();switch (x){case '0':exit(0);case '1':look(); break;case '2':add(); break;case '3':dele(); break;case '4':show(); break;case '5':SelectionSortStack(&stack);printf("排序完成!按任意键继续...");_getch();break;default:break;}}exit(0);
}

函数声明

//基本操作的函数原型声明
Status visit();//输出//构造一个空栈
Status InitStack(SqStack* S);//销毁栈S
Status DestroyStack(SqStack* S);//把S置为空栈
Status ClearStack(SqStack* S);//若栈为空栈返回TRUE
Status StackEmpty(SqStack S);//返回栈的长度
int StackLength(SqStack S);//返回栈顶元素
Status GetTop(SqStack S, SElemType* e);//入栈
Status Push(SqStack* S, SElemType e);//出栈
Status Pop(SqStack* S, SElemType* e);//遍历栈
Status StackTraverse(SqStack S, Status(*visit)());

栈操作

Status InitStack(SqStack* S)
{S->base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));if (!S->base) exit(OVERFLOW);//存储分配失败S->top = S->base;S->stacksize = STACK_INIT_SIZE;return OK;
}Status GetTop(SqStack S, SElemType* e)
{if (S.top == S.base) return ERROR;*e = *(S.top - 1);return OK;
}Status Push(SqStack* S, SElemType e)
{if (S->top - S->base >= S->stacksize)//栈满,追加存储空间{S->base = (SElemType*)realloc(S->base, (S->stacksize + STACKINCREAMENT) * sizeof(SElemType));if (!S->base) exit(OVERFLOW);S->top = S->base + S->stacksize;S->stacksize += STACKINCREAMENT;}//入栈操作,完成操作后,top指针加1*S->top++ = e;return OK;
}Status Pop(SqStack* S, SElemType* e)
{if (S->base == S->top) return ERROR;*e = *--S->top;return OK;
}Status StackEmpty(SqStack S)
{if (S.base == S.top){return TRUE;}else{return FALSE;}
}Status ClearStack(SqStack* S)
{S->top = S->base;return OK;
}Status DestroyStack(SqStack* S)
{S->base = NULL;return OK;
}

功能实现

void look()
{char name[10];SElemType* p;printf("请输入学生姓名:");scanf("%s", name);p = stack.top;for (--p; p >= stack.base; p--){if (strcmp(p->name, name) == 0){printf("%s的成绩为%4.2f\n", p->name, p->score);printf("请按任意键返回!");_getch();return;}}printf("没有查询到该学生! 请按任意键返回!");_getch();
}void add()
{printf("请输入学生姓名:");scanf("%s", data.name);printf("请输入学生成绩:");scanf("%f", &data.score);Push(&stack, data);printf("添加学生成功!请按任意键返回");_getch();
}void dele()
{Pop(&stack, &data);printf("成功删除刚刚添加的学生!:%s\n按任意键返回!", data.name);_getch();
}void show()
{SElemType* p;p = stack.top;if (!p)printf("栈为空");for (--p; p >= stack.base; p--){printf("%s的成绩为%4.2f\n", p->name, p->score);}printf("请按任意键返回!");_getch();return;
}int StackLength(SqStack S) {return S.top - S.base;
}Status visit(SElemType e) {printf("%s, 分数: %.2f ", e.name, e.score);return OK;
}Status StackTraverse(SqStack S, Status(*visit)(SElemType)) {SElemType* p = S.base; // 从栈底开始遍历for (p = S.base; p != S.top; p++) {visit(*p);}printf("\n");return OK;
}void PrintStack(SqStack* S) {if (StackEmpty(*S)) { // 检查栈是否为空printf("Stack is empty.\n");return;}SElemType e;// 首先获取栈的长度int stackLength = StackLength(*S);// 然后从栈顶索引开始,向前遍历for (int i = stackLength - 1; i >= 0; i--) {e = (*S).base[i]; // 访问栈中的元素printf("姓名:%s  分数: %4.2f\n", e.name, e.score);}printf("\n");
}// 选择排序栈的函数
void SelectionSortStack(SqStack* S) {int i, j, maxIndex;SElemType temp, currentTop;// 打印初始栈状态printf("原始栈: \n");PrintStack(S);printf("按任意键继续:\n");_getch();for (i = 0; i <= StackLength(*S) - 1; i++) { // 注意这里的循环条件maxIndex = i;for (j = i + 1; j <= StackLength(*S) - 1; j++) { // 同上if ((S)->base[j].score > (S)->base[maxIndex].score) {maxIndex = j;}}if (i != maxIndex) {temp = (S)->base[i];(S)->base[i] = (S)->base[maxIndex];(S)->base[maxIndex] = temp;// 打印交换过程Status status = GetTop(*S, &currentTop);printf("交换了索引为 %d 与索引为 %d 的元素,当前栈顶分数为:%.2f\n", i, maxIndex, currentTop.score);}else {printf("获取栈顶元素失败。\n");}}// 打印排序后的栈状态printf("排序后的栈: \n");PrintStack(S);printf("按任意键继续:\n");_getch();
}
http://www.lryc.cn/news/422927.html

相关文章:

  • 我们如何在centos上部署批量管理工具ansible
  • 如何评估前端代码审查培训计划的有效性?
  • 使用nvm切换Node.js版本
  • x264 编码器 PSNR算法源码分析
  • 开源web版3D展示工具Online3DViewer
  • 白骑士的Matlab教学实战项目篇 4.2 信号与图像处理项目
  • 复现、并改进open-mmlab的mmpose详细细节
  • 编写兼容Python2.x与3.x代码
  • 比特币8.12学习问题
  • 解析 Vue 中的app.version、 app.provide 与 app.runWithContext :原理、应用与实例剖析
  • Ubuntu server 命令行跑selenium
  • 刚刚,模糊测试平台SFuzz受到行业认可
  • 数据结构与算法——DFS(深度优先搜索)
  • 基于lambda简化设计模式
  • 揭秘! 经纬恒润“车路云一体化”方案研发服务背后的科技驱动力
  • Redis操作--RedisTemplate(二)StringRedisTemplate
  • 【自动驾驶】ROS中自定义格式的服务通信,含命令行动态传参(c++)
  • 优思学院|PDCA和DMAIC之间如何选择?
  • 5 款最佳 Micro SD 卡恢复软件,助您恢复文件
  • 【使用教程】CiA402中的“原点回归模式”和“轮廓位置模式”搭配使用操作实例
  • 服务器网络不通排查方案
  • Spring Boot + Vue 跨域配置(CORS)问题解决历程
  • Think | 大模型迈向AGI的探索和对齐
  • 为什么选择在Facebook投放广告?
  • 10 ARM 体系
  • ubuntu中设置开机自动运行的(sudo)指令
  • 删掉Elasticsearch6.x 的 .security-6索引会怎么样?
  • Navicat Premium15 下载与安装(免费版)以及链接SqlServer数据库
  • Vue3配置vite.config.js代理解决跨域问题
  • Solidity面试题,由浅入深