C语言实现电影院管理系统:链表操作与文件存储实战
本文介绍如何使用C语言的单向链表结构实现一个基础的命令行电影院管理系统。该系统涵盖了用户身份验证、电影数据的结构化存储、文件I/O读写以及基础的数据排序功能,适合初学者作为数据结构与算法课程的实践项目。
功能概览与准备
该管理系统主要包含以下核心模块:
- 用户管理:支持简单的用户名/密码注册与登录,密码输入提供视觉掩码保护。
- 数据管理:通过链表动态存储电影信息(名称、评分、场次、时长、厅号、票价、时间段)。
- CRUD操作:提供新建、查询、修改和删除单条记录的功能。
- 文件持久化:利用
data.txt保存数据,程序启动时自动加载;退出或修改后需手动保存至本地文件。
文件目录结构
在运行程序前,建议明确相关文件的位置。原稿展示了如下目录示意:
关键说明:
user.txt:用于存储注册用户信息,格式为“用户名 密码”(空格分隔),初始为空时系统将进入注册流程。data.txt:用于存储电影数据,每行代表一部电影,字段间以空格区分。
核心功能实现步骤
第1步:编译环境准备
由于代码使用了非标准的Windows API函数(如getch(), system("cls"), fopen等),建议在Windows平台下使用Visual Studio (VS) 或 Dev-C++ 进行编译。
- 头文件依赖:需包含
stdio.h(文件IO)、stdlib.h(内存分配)、string.h(字符串处理)。 - 路径注意:若文件读取失败,请确认
.exe执行路径与.txt文件所在位置一致,或在代码中检查文件路径(相对路径vs绝对路径)。
第2步:数据结构的定义
系统采用带哨兵节点(Head Node)的单向链表来管理电影数据。自定义的结构体Cinema定义了电影的各项属性:
typedef struct Cinema {
char name[100]; // 电影名
int grade; // 评分
int number; // 一天放映场次
int time; // 电影时长(分钟)
int hall; // 展厅号
double price; // 票价
char timeline[100][100]; // 时间段数组
struct Cinema* next; // 指向下一个节点的指针
} Cinema, *List;
List head = NULL; // 全局链表头指针
注:代码中原文将`struct a`定义为别名,此处修正为更有意义的Cinema以保持语义清晰。
第3步:用户注册与登录逻辑
登录过程涉及文件的读取校验与输入缓冲区的特殊处理:
- 登录入口:程序启动后调用
Login()函数。 - 密码不回显:使用
getch()逐字获取密码字符,不将其输出到屏幕,同时打印*占位符。当检测到退格键\b时,通过移动光标和打印空格实现撤销效果。 - 账户校验:从
user.txt中读取已注册的用户名和密码进行比对。若无对应记录则提示错误。 - 注册流程:若选择注册,则将新的用户名和密码写入
user.txt(覆盖模式)。
第4步:电影数据的加载(Reload)
登录后,系统调用Reload()函数将硬盘上的数据还原到内存链表中:
- 以追加/读模式(
a+)打开data.txt。 - 循环使用
fscanf读取电影的固定字段(名称、评分、时长、场次、厅号、价格)。 - 根据读取到的
number(场次),循环读取对应的number个时间段字符串。 - 通过
malloc创建新节点并挂接到链表中。
第5步:数据的增删改查(CRUD)
- 添加(Create):分配新节点,按提示录入信息,遍历链表尾部插入。
- 删除(Delete):遍历链表查找匹配的电影名。找到后保留前驱节点指针,释放当前节点内存,并将前驱节点的
next指向后继节点。注意:原代码存在未检查空指针的风险,生产环境应增加判空逻辑。 - 修改(Modify):定位节点后,逐个询问是否修改各字段值。
- 查询(Search):线性扫描链表,输出匹配的详细信息。
- 清空(DeleteAll):遍历链表释放所有数据节点内存,并调用
remove("data")删除临时文件或重置状态(原代码此处参数有误,实际应为"data.txt",见Review Notes)。
第6步:排序与保存
系统实现了简易的选择排序或冒泡排序变体:
- 排序(Sort):支持按评分或场次排序,可选择升序或降序。通过交换节点内部的数据字段实现(非交换指针,避免破坏链表结构复杂度)。
- 保存(Save):以写模式(
w)打开data.txt,遍历链表将所有节点数据格式化写入文件。每次新增或修改后务必执行此步以防数据丢失。
总结
该示例代码展示了C语言中链表管理的典型用法,包括节点的动态分配、内存释放以及复杂结构体的文件序列化。对于初学者而言,重点在于理解指针在链表遍历中的变化,以及文件操作中fscanf/fprintf与结构体字段的一一对应关系。
以上就是C语言实现电影管理系统的具体代码和详细功能解析,更多关于C语言数据结构与文件IO的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









