C语言实现电影院管理系统:链表操作与文件存储实战

洛溪
洛溪
发布时间:2026-10-15 | 4人浏览过
原创

本文介绍如何使用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步:用户注册与登录逻辑

登录过程涉及文件的读取校验与输入缓冲区的特殊处理:

  1. 登录入口:程序启动后调用Login()函数。
  2. 密码不回显:使用getch()逐字获取密码字符,不将其输出到屏幕,同时打印*占位符。当检测到退格键\b时,通过移动光标和打印空格实现撤销效果。
  3. 账户校验:从user.txt中读取已注册的用户名和密码进行比对。若无对应记录则提示错误。
  4. 注册流程:若选择注册,则将新的用户名和密码写入user.txt(覆盖模式)。

第4步:电影数据的加载(Reload)

登录后,系统调用Reload()函数将硬盘上的数据还原到内存链表中:

  1. 以追加/读模式(a+)打开data.txt。
  2. 循环使用fscanf读取电影的固定字段(名称、评分、时长、场次、厅号、价格)。
  3. 根据读取到的number(场次),循环读取对应的number个时间段字符串。
  4. 通过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的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表