C语言实现货物管理系统:基于链表的增删查改与权限控制
本教程详细介绍如何使用C语言和单向链表构建一个具备基本商业逻辑的货物管理系统。通过封装节点结构体,实现了对商品编号、名称、价格、生产日期及库存的动态维护。代码包含了严格的权限认证模块和输入校验机制,并演示了如何将运行时内存数据写入本地文件以确保持久化存储。
核心结构与数据存储
系统的核心在于数据的组织形式。此处使用了单向链表来存储货物信息,每个节点包含货物详细信息以及指向下一个节点的指针。这种结构允许在运行时灵活地插入或删除记录,无需像数组那样预先分配固定空间或进行大量元素移动。
// 日期结构体定义
struct date {
int year;
int month; // 原文中变量名为 mouth,意为月份
int day;
};
// 货物基本信息结构体
typedef struct goods {
char numbs[6]; /* 编号 */
char name[10]; /* 名称 */
float purchase; /* 进价 */
float sales; /* 售价 */
char place[10]; /* 产地 */
struct date Date; /* 生产日期 */
int days; /* 保质期(天) */
int datecha; /* 保质期截止日期差(用于计算过期状态) */
int stock; /* 库存量 */
int salesnumb; /* 销量 */
float income; /* 总收入 */
} GoodsData;
// 链表节点定义
typedef struct node {
GoodsData data;
struct node *next;
} Node, *Link;
主界面与权限验证
程序启动后,首先显示欢迎菜单,允许用户选择进入“主管模式”或“普通用户模式”。主管模式拥有完整的管理权限,包括录入和删除货物;而普通用户仅能查看、搜索和排序现有数据。
- 主管权限:需要输入密码验证。代码中设置了硬编码密码
"123456",且限制最多尝试3次。若多次输入错误则锁定当前会话。 - 普通权限:直接跳过密码环节进入基础浏览菜单。
/* 简单的密码验证逻辑示例 */
static int n = 3; /* 剩余尝试次数 */
char password[7];
char mypassword[] = "123456";
// 循环接收字符并进行比对...
功能操作详解
第1步:录入新货物信息
此步骤仅对主管开放。在执行添加前,系统会遍历现有链表检查编号是否重复。
- 入口:主管菜单 →
1. 录入货物信息 - 动作:提示用户依次输入货物编号、名称、进价、售价、产地、生产日期和库存量。
- 关键点:系统在录入时会自动调用
S_input和Num_input等辅助函数进行边界校验,例如防止年份或月份数值非法。 - 完成状态:新节点被插入到链表头部(前插法),系统标记
saveflag=1表示数据已修改需保存。
第2步:查询与显示货物
系统支持两种维度的显示视图,分别对应不同的权限需求:
- 主管视图:显示完整的财务报表字段,包括编号、名称、进价、售价、产地、生产日期、保质期天数、库存、累计销量及当前收入。
- 普通视图:隐藏敏感的进价数据,仅显示编号、名称、售价、产地、生产日期、保质期天数和当日销量。
查询接口支持通过编号或名称进行精确匹配(Locate 函数),找到目标节点后进行格式化打印。
第3步:数据维护(删除与补货)
在删除功能中,系统同样要求二次确认(y/n),以防止误操作导致的数据丢失。执行删除时,会通过遍历找到指定节点的前驱,然后调整指针完成断开操作,并使用 free() 释放内存。
此外,系统内置了智能补货提醒功能。通过计算 库存 - 销量,如果剩余数量低于阈值(代码中设定为100),则该货物会被标记并在特定菜单下列出。
第4步:有效期管理与促销策略
这是一个较为复杂的业务逻辑点。系统根据设定的“今天日期”,计算每批货物的剩余有效期天数 (datecha):
- 过期处理:若
days < datecha,表明产品已过期,建议删除或下架。 - 临期打折:若
(days - datecha) <= 10,说明距离过期不足10天,系统将自动把售价减半(sales = sales / 2),并标记为优惠商品。
第5步:文件保存与加载
为了保留工作成果,系统提供了两种文件保存方案,均默认保存在 D盘:
- 文本格式 (TXT):
D:\Goods.txt。使用fprintf按固定格式字符串输出,方便人类阅读,但跨平台兼容性较差(路径中的反斜杠转义需注意)。 - 二进制格式 (Binary):
D:\Goods。使用fwrite直接写入结构体内存块,效率更高且占用空间更小。
启动程序时,会自动读取 D:\Goods 二进制文件,利用 fread 将历史数据还原至链表内存中。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









