目录
顺序表的实现——商品管理系统
本次使用C++利用顺序表实现一个简单的商品管理系统,可用于数据结构课程设计,里面包含了一个完整的简易菜单,可以进行商品进货、出售、以及管理……都是通过顺序表实现的。
关于所有代码
所有代码已经上传到CSDN,通过资源绑定功能,已经绑定本篇博客,有需要请自取,完整的VS2022项目,运行“数据结构.sln”即可在vs2022中打开(一般来说,版本无限制)
在我上传时,设置了0积分,可以免费获取,但不保证后续积分要求会不会变化(但放心,不会变成付费或会员专享资源),不过,还请尽快保存!
项目整体说明
这个项目由pubuse.h负责宏定义和类型声明,seqlistAlgo.h定义顺序列表操作,seqlistDef.h包含自定义商品与顺序列表结构,而seqlistUse.cpp实现了基于顺序表的商品管理系统,提供了用户界面和管理功能。
文件名称 | 功能描述 |
---|---|
pubuse.h | 提供常用数据类型声明、预处理器定义以及std 库的命名空间导入 |
seqlistAlgo.h | 定义顺序列表商品管理算法,包含操作函数如初始化、查找、插入和删除等 |
seqlistDef.h | 定义自定义数据结构:Shop (商品信息)和SqList (排序列表管理)结构,及列表的大小限制 |
seqlistUse.cpp | 应用算法实现商品管理系统,包含用户界面交互,商品操作和管理功能 |
数据结构--顺序表商品管理系统:是由pubuse.h库文件支持的数据类型定义,seqlistAlgo.h负责算法设计实现,seqlistDef.h定义商品及其序列列表结构,而seqlistUse.cpp是实际运行的程序,包含命令行操作接口,实现商品的添加、查询、删除、销售等功能。
具体代码解释
pubuse.h文件
pubuse.h
文件包含了一个顺序表商品管理系统的预处理器指令(宏定义)和类型声明。主要特点如下:
-
定义了一些常量:
TRUE
和FALSE
,用于布尔值表示。OK
、ERROR
、和INFEASIBLE
,表示操作状态。- 注释的
OVERFLOW
定义没有被采纳,原因是另一个头文件已经提供了math.h
中的OVERFLOW
,为了避免冲突。
-
抽象数据类型定义:
Status
作为整型变量,表示函数返回不同操作的状态。Boolean
作为整型别名,通常用于布尔运算,可能简化代码表达。
-
using namespace std;
:这是一个C++语句,引入了std
命名空间,使得可以直接使用标准库里的如cout
,cin
等。
这个头文件主要是为了提供一些通用的编程工具和数据类型的定义,用于后续的模块化开发。
#include<string>
#include<ctype.h>
#include<malloc.h> /* malloc()等*/
#include<limits.h> /* INT_MAX 等*/
#include<stdio.h> /* EOF(=^Z 或F6),NULL */
#include<iostream>
#include<stdlib.h> /* atoi() */
#include<io.h> /* eof() */
#include<math.h>/* floor(),ceil(),abs() */
#include<process.h> /* exit() */
using namespace std;
/* 函数结果状态代码*/
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
//#define OVERFLOW -2 因为在math. h 中已定义OVERFLOW 的值为3,故去掉此行
typedef int Status; /* Status 是函数的类型,其值是函数结果状态代码,如OK 等*/
typedef int Boolean; /* Boolean 是布尔类型,其值是TRUE 或FALSE */
seqlistDef.h文件
这是一个C语言的头文件(seqlistDef.h),它包含两个自定义结构体:
-
Shop
结构体定义了一个商品对象,包含以下字段:name
:表示商品名称,类型为字符串(string)HS
:可能是指商品编号或序列号,同样类型为字符串(string)p_i
:单件商品价格,类型为浮点数p_s
:销售折扣价,类型为浮点数item
:商品数量,类型为整数
-
SqList
结构体定义了一个顺序列表(Sequential List),用于管理商品。它包含:elem
:一个指向Shop
类型的指针,用于存储商品length
:列表的长度,用于跟踪商品数量all_p
:总共的总价,类型为浮点数
文件还包括了预处理宏 #define MAXSIZE 100
,表示列表最多能容纳100个商品。同时,它引入了一个名为 "pubuse.h" 的库文件,可能是其他功能模块的公共头文件。
这个文件提供了一个基本的数据结构框架,用于后续在项目中创建和操作顺序列表商品管理系统。
#include "pubuse.h"
#define MAXSIZE 100
typedef struct
{
string name; //商品名称
string HS; //商品编码
float p_i; //商品进货价格
float p_s; //商品出售价格
int item; //商品库存
}Shop;
typedef struct {
Shop* elem;
int length; //商品的数量
float all_p; //收入
}SqList;
seqlistAlgo.h文件
seqlistAlgo.h 文件定义了一个名为 SqList 的顺序列表类,用于管理商品信息。这个数据结构实现了一系列操作方法,如初始化、定位元素(通过名称或货号)、获取和设置元素值、插入、删除、销毁列表、清空列表、检查是否为空、获取列表长度、遍历上一个和下一个元素,以及购买商品等。输入和展示商品时,用户可以指定操作项,同时处理一些边界错误和特殊情况,比如负数或无效输入。
主要函数包括:
- InitList: 初始化顺序表,分配内存并设置默认值。
- LocateElemName 和 LocateElemHS: 检索商品按名称或货号的位置。
- GetElem: 返回指定索引的商品信息。
- ListInsert 和 RemoveShop: 插入和删除指定索引的商品。
- DestroyList, ClearList, ListEmpty: 分别用于释放资源、清空列表和检查列表是否为空。
- Length, prior_elem, next_elem: 接收索引获取前一个/下一个商品及当前位置的长度。
- InputShop: 输入一个新的商品信息。
- sell: 出售指定索引的商品,并询问是否删除该商品。
- ShowShop: 展示所有商品列表供用户选择,如果商品售罄则提示。
- display: 详细地显示所有商品信息。
- ShowLine: 显示单个商品信息。
- ShowPorN: 显示前一个或后一个商品,或返回到主菜单。
整个类实现了单向链表的基础功能,并配合简单的用户交互。
#include"seqlistDef.h"
// 初始化线性表
Status InitList(SqList& L) {
L.elem = new Shop[MAXSIZE];
if (!L.elem) exit(OVERFLOW);
L.length = 0;
L.all_p = 0.0;
return OK;
}
// 根据名字查找
int LocateElemName(SqList L, string name) {
for (int i = 0; i < L.length; i++) {
if (L.elem[i].name == name) return i + 1;
}
return 0;
}
// 根据商品编号查找
int LocateElemHS(SqList L, string HS) {
for (int i = 0; i < L.length; i++) {
if (L.elem[i].HS == HS) return i + 1;
}
return 0;
}
// 获取线性表第i个元素
Status GetElem(SqList L, int i, Shop& e) {
if (i<1 || i>L.length) return ERROR;
e = L.elem[i - 1];
return OK;
}
// 在指定位置插入元素
Status ListInsert(SqList& L, int i, Shop e) {
if (i < 1 || i > L.length + 1 || L.length == MAXSIZE) return ERROR;
for (int j = L.length - 1; j >= i - 1; j--) {
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = e;
L.length++;
L.all_p -= e.item * e.p_i;
return OK;
}
// 删除指定位置的元素
Status RemoveShop(SqList& L, int i) {
if (i < 1 || i > L.length)
return ERROR;
for (int j = i; j < L.length; j++) {
L.elem[j - 1] = L.elem[j];
}
L.length--;
return OK;
}
//销毁线性表
Status DestroyList(SqList& L) {
delete[] L.elem;
InitList(L);
return OK;
}
//重置为空表
Status ClearList(SqList& L)
{
L.length = 0;
L.all_p = 0.0;
return OK;
}
//是否为空表
Status ListEmpty(SqList L) {
if (L.length != 0)
return OK;
else
return ERROR;
}
//返回元素个数
int Length(SqList L) {
return L.length;
}
//返回非第一元的前驱元素
Status prior_elem(SqList L, int i, Shop& e) {
if (i != 0) {
e = L.elem[i - 1];
return OK;
}
else return ERROR;
}
//返回非最后元的后继元素
Status next_elem(SqList L, int i, Shop& e) {
if (i != L.length - 1) {
e = L.elem[i + 1];
return OK;
}
else return ERROR;
}
……完整代码请下载本篇博客绑定的资源
seqlistUse.cpp文件
这是一个C++程序,名为seqlistUse.cpp
,实现了一个基于序列(顺序表)的商品管理系统。主要功能包括:
- 菜单管理:显示一系列操作选项,如商品进货、检索、出售等。
- 数据结构:使用SqList类,可能是一个自定义的数据结构,包含商品信息(如序号、名称和数量等)并实现了列表操作(初始化、插入、删除等)。
- 基本操作:
- 进货:通过
ListInsert
函数将商品添加到序列表中。 - 获取商品:根据序号、名称或编号查询商品信息。
- 删除商品:在指定位置移除商品。
- 库存检查:确认库存是否为空。
- 统计商品数量:显示库存商品总数。
- 出售商品:通过索引出售商品。
- 显示库存:展示当前库存信息。
- 清除和销毁商品:清空所有商品或将列表销毁。
- 进货:通过
程序采用循环结构,用户选择一个操作后执行相应的函数,并在每一步操作后提示用户继续或者退出。
#include"seqlistAlgo.h"
void ShowMenu() {
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 << "10. 查看商品数量" << endl;
cout << "11. 出售商品" << endl;
cout << "12. 显示库存" << endl;
cout << "0. 退出" << endl;
cout << "请输入你的选择:";
}
void ExitEnter() {
cout << "-------------------------------" << endl;
system("pause");
system("cls");
}
int main() {
SqList L;
// 初始化线性表
InitList(L);
int numF = 12; //菜单选项数量
int choice;
do {
ShowMenu();
cin >> choice;
while (choice < 0 || choice>numF || cin.fail())
{
system("cls");
cin.clear();
cin.ignore();
ShowMenu();
cin >> choice;
}
switch (choice) {
case 1: {
system("cls");
// 商品进货
if (L.length == MAXSIZE) {
cout << "商品已满,无法进货" << endl;
}
else
{
Shop e = InputShop();
if (ListInsert(L, L.length + 1, e)) cout << "进货成功" << endl;
else cout << "进货失败" << endl;
}
ExitEnter();
break;
}
case 2: {
// 按序号获取商品
system("cls");
if (L.length == 0) cout << "无商品,请先进货" << endl;
else {
int ln;
cout << "请输入查找商品的位置(1-" << L.length << "): ";
cin >> ln;
Shop e;// 用于存储返回值的 Shop 对象
if (GetElem(L, ln, e)) {
ShowLine(ln, e);
ShowPorN(L, ln);
}
else cout << "查找失败" << endl;
}
ExitEnter();
break;
}
case 3: {
// 根据商品名称查找
system("cls");
string name;
cout << "请输入查找商品名称:";
cin >> name;
int ln = LocateElemName(L, name);
Shop e;// 用于存储返回值的 Shop 对象
if (GetElem(L, ln, e)) {
ShowLine(ln, e);
ShowPorN(L, ln);
}
else cout << "查找失败" << endl;
ExitEnter();
break;
}
case 4: {
// 根据商品编号查找
system("cls");
string HS;
cout << "请输入查找商品编号:";
cin >> HS;
int ln = LocateElemHS(L, HS);
Shop e;// 用于存储返回值的 Shop 对象
if (GetElem(L, ln, e)) {
ShowLine(ln, e);
ShowPorN(L, ln);
}
else cout << "查找失败" << endl;
ExitEnter();
break;
}
case 5: {
// 在指定位置进货商品
system("cls");
if (L.length == MAXSIZE) cout << "商品已满,无法进货" << endl;
else
{
Shop e = InputShop();
int ln; //商品进货位置
if (L.length == 0) {
cout << "库存无商品,默认在首元位置进货" << endl;
ln = L.length + 1;
}
else
{
cout << "请输入商品位置(1-" << L.length + 1 << "): ";
cin >> ln;
}
if (ListInsert(L, ln , e)) cout << "进货成功" << endl;
else cout << "进货失败" << endl;
}
ExitEnter();
break;
}
case 6: {
// 删除指定位置的商品
system("cls");
if (L.length == 0) {
cout << "库存无商品,无法删除" << endl;
}
else
{
int del_ln; //商品删除位置
cout << "请输入需要删除商品的位置(1-" << L.length << "): ";
cin >> del_ln;
if (RemoveShop(L, del_ln)) cout << "删除成功" << endl;
else cout << "删除失败" << endl;
}
ExitEnter();
break;
}
case 7: {
// 重置所有商品为空
system("cls");
ClearList(L);
cout << "已重置商品为空" << endl;
ExitEnter();
break;
}
case 8: {
// 销毁所有储存的商品
system("cls");
DestroyList(L);
cout << "已销毁所有商品" << endl;
ExitEnter();
break;
}
case 9: {
// 检测商品库存是否为空
system("cls");
if (ListEmpty(L)) cout << "商品库存不为空" << endl;
else cout << "商品库存为空" << endl;
ExitEnter();
break;
}
case 10: {
// 查看商品数量
system("cls");
int num = Length(L);
cout << "库存已有商品:" << num << "种" << endl;
ExitEnter();
break;
}
case 11: {
// 出售商品
system("cls");
int index = ShowShop(L); // 获取用户选择的商品索引
if (index != -1) sell(L, index); // 出售商品
ExitEnter();
break;
}
case 12: {
// 显示库存
system("cls");
display(L);
ExitEnter();
break;
}
case 0: {
cout << "-------------------------------" << endl;
cout << "感谢使用,再见!" << endl;
break;
}
default:
system("cls");
cout << "输入无效,请重新选择!" << endl;
break;
}
} while (choice != 0);
return 0;
}
结语
希望你能通过本篇博客,更好理解数据结构的顺序表。
最后,使用愉快!