C语言数据结构课设链表队列实现航空订票系统核心模块深度解析1. 系统架构设计与数据结构选型航空订票系统的核心在于高效管理航班信息和乘客订单。我们采用单链表存储航班数据每个航班节点包含以下关键字段typedef struct hangban { char qidian[20]; // 起点站 char zhongdian[20]; // 终点站 char hbID[20]; // 航班编号 char hbnum[20]; // 飞机号 char day[20]; // 飞行日期 int maxnum; // 总座位数 int less; // 剩余票数 int lessgrade1; // 经济舱余票 int lessgrade2; // 商务舱余票 hangban *next; // 下一航班指针 CList cusLinkList; // 乘客链表头指针 LinkQueue wQgrade1; // 经济舱候补队列 LinkQueue wQgrade2; // 商务舱候补队列 } hangban, *Phangban;选择链表的三大优势动态内存分配适应航班数量变化O(1)时间复杂度的头插法添加新航班非连续存储避免数组扩容问题候补队列采用链式队列结构确保先到先服务的公平性typedef struct HbNode { char name[20]; // 乘客姓名 char ID[20]; // 身份证号 int num; // 订票数量 struct HbNode *next; } QhbNode, *Phb; typedef struct Queue { Phb front; // 队头指针 Phb rear; // 队尾指针 } LinkQueue;2. 五大核心模块实现解析2.1 航班初始化与数据加载系统启动时通过initFlight()初始化空链表Create()函数加载预设航班数据void initFlight() { pFlight (hangban *)malloc(sizeof(hangban)); pFlight-next NULL; // 创建带头节点的空链表 } int Create(Phangban flight1) { hangban *p pFlight, *q; for(int i0; i16; i) { q (hangban *)malloc(sizeof(hangban)); strcpy(q-qidian, flight1[i].qidian); // ...复制其他字段... initCusLinkList(q-cusLinkList); // 初始化乘客链表 initQueue(q-wQgrade1); // 初始化候补队列 q-next p-next; // 头插法插入 p-next q; } return 1; }关键技巧采用头插法使新航班总是插入链表头部时间复杂度O(1)。注意初始化乘客链表和候补队列避免野指针。2.2 订票业务逻辑实现订票函数dingpiao()处理三种情况余票充足直接出票余票不足建议改签接受候补登记void dingpiao() { hangban *info find(); // 根据航班号查找 if(info-lessgrade1 need) { // 经济舱有余票 for(int i0; ineed; i) printf(座位号%d\n, info-maxnum - info-less i 1); info-lessgrade1 - need; addlink(info-cusLinkList, need, name, id, day, grade); } else { printf(余票不足是否候补(Y/N)); if(getch() Y) { enqueue(grade1 ? info-wQgrade1 : info-wQgrade2, name, need, id); } } }座位号生成算法总座位数 - 剩余票数 序号确保唯一性。候补乘客使用队列的FIFO特性保证公平性。2.3 退票与候补联动机制退票时需检查候补队列自动为排队乘客办理订票void tuipiao() { // ...退票逻辑... info-lessgrade1 p1-order_amount; // 恢复余票 // 检查经济舱候补队列 if(!isEmpty(info-wQgrade1) info-lessgrade1 info-wQgrade1.front-num) { Phb wait dequeue(info-wQgrade1); addlink(info-cusLinkList, wait-num, wait-name, wait-ID, day, 1); info-lessgrade1 - wait-num; printf(已为候补乘客%s办理订票\n, wait-name); } }设计要点退票后立即检查候补队列实现票务资源的自动再分配。使用dequeue()出队操作保证先到先得。2.4 航班查询优化策略系统提供三种查询方式均基于链表遍历查询方式时间复杂度关键代码全量航班列表O(n)while(p!NULL) pp-next按航班号查询O(n)strcmp(number, p-hbID)按起终点查询O(n)strcmp(qidian, p-qidian)void sousuoflight() { char qidian[10], zhongdian[10]; hangban *p pFlight-next; while(p ! NULL) { if(strcmp(qidian,p-qidian)0 strcmp(zhongdian,p-zhongdian)0) { printf(%s→%s 余票%d\n, p-qidian, p-zhongdian, p-less); } p p-next; } }性能优化对高频查询可建立哈希表索引将时间复杂度降至O(1)但会增加内存开销。2.5 管理员功能实现航班管理采用标准的链表操作// 添加航班 void zengjiaFlight() { hangban *new (hangban*)malloc(sizeof(hangban)); // ...输入航班信息... new-next pFlight-next; // 头插法 pFlight-next new; } // 删除航班 void shanchuFlight(char* hbID) { hangban *pre pFlight, *p pre-next; while(p ! NULL) { if(strcmp(p-hbID, hbID) 0) { pre-next p-next; free(p); break; } pre p; p p-next; } }内存安全删除节点时必须先保存next指针再free避免内存泄漏。新增航班时要初始化所有指针字段。3. 关键数据结构操作详解3.1 链表操作核心代码// 头插法添加节点 void insertHead(Phangban head, hangban *new) { new-next head-next; head-next new; } // 按航班号查找 hangban* find(char* hbID) { hangban *p pFlight-next; while(p ! NULL) { if(strcmp(p-hbID, hbID) 0) return p; p p-next; } return NULL; }3.2 队列操作实现// 入队操作 void enqueue(LinkQueue *q, char* name, int num, char* ID) { Phb new (Phb)malloc(sizeof(QhbNode)); strcpy(new-name, name); new-num num; new-next NULL; if(q-rear NULL) { // 空队列 q-front q-rear new; } else { q-rear-next new; q-rear new; } } // 出队操作 Phb dequeue(LinkQueue *q) { if(q-front NULL) return NULL; Phb temp q-front; q-front q-front-next; if(q-front NULL) q-rear NULL; return temp; }4. 系统优化与实践建议数据持久化添加文件存储功能使用fwrite/fread保存航班数据界面优化采用ncurses库实现控制台图形界面性能监控添加clock()计时器评估关键操作耗时错误处理增强输入校验如使用正则表达式验证身份证号// 示例文件存储实现 void saveToFile(char* filename) { FILE *fp fopen(filename, wb); hangban *p pFlight-next; while(p ! NULL) { fwrite(p, sizeof(hangban), 1, fp); p p-next; } fclose(fp); }实际开发中建议采用模块化设计将链表、队列操作封装为独立模块通过头文件暴露接口提高代码复用性。