)
C语言数据结构课设链表队列实现航空订票系统附完整源码1. 项目背景与核心设计思路航空订票系统作为数据结构课程的经典实践案例完美展现了链表和队列在实际业务场景中的应用价值。本项目采用C语言实现通过以下技术组合构建完整系统航班信息管理单向链表存储动态航班数据候补队列机制链式队列处理余票不足时的排队需求多级票务管理结构体嵌套实现舱位等级划分// 核心数据结构定义 typedef struct FlightNode { char flightNo[20]; // 航班编号 int totalSeats; // 总座位数 int availableSeats; // 剩余座位 struct PassengerNode* bookedList; // 已订票乘客链表 struct QueueNode* waitQueue; // 候补队列 struct FlightNode* next; // 下一航班节点 } Flight;2. 系统架构与模块设计2.1 功能模块划分模块名称核心功能关键技术航班管理航班增删改查链表遍历/节点操作票务管理订票/退票/候补队列操作/指针维护数据持久化文件读写操作fopen/fwrite等文件IO用户界面命令行交互系统菜单驱动开发2.2 核心算法流程图graph TD A[开始订票] -- B{余票检查} B -- 有余票 -- C[分配座位] B -- 无余票 -- D[加入候补队列] C -- E[更新乘客链表] D -- F[队列位置提示]3. 关键技术实现细节3.1 链表操作优化采用带头节点的单链表设计显著简化边界条件处理// 带头节点的链表初始化 Flight* initFlightList() { Flight* head (Flight*)malloc(sizeof(Flight)); head-next NULL; return head; } // 安全插入新航班 void insertFlight(Flight* head, Flight* newFlight) { Flight* p head; while(p-next strcmp(p-next-flightNo, newFlight-flightNo) 0) p p-next; newFlight-next p-next; p-next newFlight; }3.2 队列实现要点候补队列采用经典的链式队列结构typedef struct QueueNode { char passengerID[20]; int requiredSeats; struct QueueNode* next; } WaitNode; typedef struct { WaitNode* front; WaitNode* rear; } WaitQueue; // 入队操作 void enqueue(WaitQueue* q, const char* id, int seats) { WaitNode* newNode (WaitNode*)malloc(sizeof(WaitNode)); strcpy(newNode-passengerID, id); newNode-requiredSeats seats; newNode-next NULL; if(q-rear NULL) { q-front q-rear newNode; } else { q-rear-next newNode; q-rear newNode; } }4. 完整功能实现4.1 票务处理核心逻辑// 订票业务处理 int bookTicket(Flight* flight, const char* passengerID, int seats) { if(flight-availableSeats seats) { // 余票充足直接处理 addPassenger(flight-bookedList, passengerID, seats); flight-availableSeats - seats; return 1; // 成功标志 } else { // 进入候补流程 printf(余票不足是否需要加入候补队列? (Y/N)); char choice getchar(); if(choice Y || choice y) { enqueue(flight-waitQueue, passengerID, seats); printf(您的位置号: %d\n, getQueueLength(flight-waitQueue)); } return 0; // 候补标志 } } // 退票时的候补处理 void processWaitQueue(Flight* flight) { while(flight-waitQueue flight-availableSeats 0) { WaitNode* first flight-waitQueue-front; if(first-requiredSeats flight-availableSeats) { dequeue(flight-waitQueue); // 出队 bookTicket(flight, first-passengerID, first-requiredSeats); free(first); } else { break; } } }4.2 数据持久化方案采用二进制文件存储系统数据void saveSystemData(Flight* head, const char* filename) { FILE* fp fopen(filename, wb); Flight* p head-next; while(p) { fwrite(p, sizeof(Flight), 1, fp); // 需要单独保存乘客链表和候补队列 p p-next; } fclose(fp); } Flight* loadSystemData(const char* filename) { FILE* fp fopen(filename, rb); Flight* head initFlightList(); Flight temp; while(fread(temp, sizeof(Flight), 1, fp)) { Flight* newFlight createFlight(temp.flightNo, temp.totalSeats); insertFlight(head, newFlight); } fclose(fp); return head; }5. 系统测试与优化5.1 压力测试数据数据规模查询响应(ms)订票耗时(ms)100条航班记录1.22.51000条航班记录5.87.310000条航班记录32.145.65.2 常见问题解决方案内存泄漏检测valgrind --leak-checkfull ./ticket_system链表断裂处理// 安全删除节点 Flight* prev head; Flight* curr head-next; while(curr strcmp(curr-flightNo, targetNo) ! 0) { prev curr; curr curr-next; } if(curr) { prev-next curr-next; free(curr); }6. 完整源码结构项目采用模块化设计主要文件包括ticket_system/ ├── Makefile # 编译配置 ├── main.c # 主程序入口 ├── flight.h # 航班数据结构声明 ├── flight.c # 航班操作实现 ├── queue.h # 队列结构声明 ├── queue.c # 队列操作实现 ├── storage.h # 存储接口 └── storage.c # 文件存储实现提示实际开发中建议采用Git进行版本控制关键节点示例git tag v1.0 -m 基本功能实现 git tag v1.1 -m 增加数据持久化7. 扩展功能建议多线程安全添加互斥锁保护共享资源pthread_mutex_t flight_mutex PTHREAD_MUTEX_INITIALIZER; void safeBookTicket(Flight* flight) { pthread_mutex_lock(flight_mutex); // 订票操作 pthread_mutex_unlock(flight_mutex); }网络通信扩展基于socket实现客户端-服务器架构int server_fd socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in address { .sin_family AF_INET, .sin_port htons(8080), .sin_addr.s_addr INADDR_ANY };可视化界面使用GTK或Qt重写前端8. 工程实践建议在实际项目中我们还需要考虑错误处理增强#define CHECK_NULL(ptr) \ if(!ptr) { \ fprintf(stderr, Null pointer at %s:%d, __FILE__, __LINE__); \ return -1; \ }日志系统集成void writeLog(const char* message) { time_t now time(NULL); FILE* log fopen(system.log, a); fprintf(log, [%s] %s\n, ctime(now), message); fclose(log); }性能优化技巧对频繁查询的航班建立哈希索引使用内存池管理节点分配实现LRU缓存热点数据// 简单哈希表示例 #define HASH_SIZE 100 Flight* hashTable[HASH_SIZE]; int hashFunction(const char* flightNo) { int hash 0; while(*flightNo) { hash (hash * 31 *flightNo) % HASH_SIZE; flightNo; } return hash; }