数据结构课程设计:源代码(C)客房信息管理系统

main.c

#include <unistd.h>
#include "SeqList.h"
#include "User.h"int main()
{SL user;SLInit(&user);char ans = 0;printf("是否需要导入昨日续住客人的数据:y/n\n");scanf(" %c", &ans);if (ans == 'y'){LoadUser(&user);}else if(ans!='n'){printf("请重新输入y/n\n");scanf(" %c",&ans);}menu();printf("请输入选项:");int choice = 0;while (scanf("%d", &choice)){switch (choice){case 1:userInfoGet(&user);break;case 2:find(&user);break;case 3:remedy(&user);break;case 4:deleteUser(&user);break;case 5:sortUser(&user);break;case 6:printUser(&user);if(user.size==0){printf("当前没有客人入住");} else{printf("当前入住有%d位客人\n",user.size);}break;case 7:printf("当前入住有%d位客人\n剩余%d间房间\n",user.size,user.Max);break;case 8:destroyUser(&user);printf("谢谢使用");return 1;default:printf("请按照菜单重新输入:");break;}usleep(1000);menu();printf("请输入选项:");}
}

Seqlist.c


#include "SeqList.h"//顺序表的初始化
void SLInit(SL* ps)
{assert(ps);//确保没有传入空指针ps->SeqList = NULL;ps->size = 0;ps->Max = 50;//初始化房间最大数量ps->capacity = 0;
}//顺序表的销毁
void SLDestroy(SL* ps)
{assert(ps);if (ps->SeqList){free(ps->SeqList);}ps->SeqList = NULL;ps->size = 0;ps->capacity = 0;
}//顺序表的扩容
void SLCheckCapacity(SL* ps)
{assert(ps);SLDataType* temp = NULL;if (ps->size == ps->capacity){int newCapacity = ps->capacity;temp = (SLDataType*)realloc(ps->SeqList, (newCapacity = (ps->capacity == 0) ? 4 : (ps->capacity * 2)) * sizeof(SLDataType));//扩容assert(temp);ps->SeqList = temp;ps->capacity = newCapacity;temp = NULL;}
}//顺序表的尾部插入
//当顺序表有足够的空间插入时(包括有内容和顺序表为空)
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//顺序表的扩容SLCheckCapacity(ps);//确保SeqList指针不为空之后判断容量是否足够//当顺序表有足够的空间插入时(包括有内容和顺序表为空)ps->SeqList[ps->size] = x;ps->size++;ps->Max--;}
//顺序表的指定位置删除
void SLErase(SL* ps, int pos)
{assert(ps);assert(0 <= pos && pos <= ps->size);//确保pos为有效位置for (int i = pos + 1; i < ps->size; i++){ps->SeqList[i - 1] = ps->SeqList[i];}ps->size--;ps->Max++;
}

Seqlsit.h


#include "SeqList.h"//顺序表的初始化
void SLInit(SL* ps)
{assert(ps);//确保没有传入空指针ps->SeqList = NULL;ps->size = 0;ps->Max = 50;//初始化房间最大数量ps->capacity = 0;
}//顺序表的销毁
void SLDestroy(SL* ps)
{assert(ps);if (ps->SeqList){free(ps->SeqList);}ps->SeqList = NULL;ps->size = 0;ps->capacity = 0;
}//顺序表的扩容
void SLCheckCapacity(SL* ps)
{assert(ps);SLDataType* temp = NULL;if (ps->size == ps->capacity){int newCapacity = ps->capacity;temp = (SLDataType*)realloc(ps->SeqList, (newCapacity = (ps->capacity == 0) ? 4 : (ps->capacity * 2)) * sizeof(SLDataType));//扩容assert(temp);ps->SeqList = temp;ps->capacity = newCapacity;temp = NULL;}
}//顺序表的尾部插入
//当顺序表有足够的空间插入时(包括有内容和顺序表为空)
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);//顺序表的扩容SLCheckCapacity(ps);//确保SeqList指针不为空之后判断容量是否足够//当顺序表有足够的空间插入时(包括有内容和顺序表为空)ps->SeqList[ps->size] = x;ps->size++;ps->Max--;}
//顺序表的指定位置删除
void SLErase(SL* ps, int pos)
{assert(ps);assert(0 <= pos && pos <= ps->size);//确保pos为有效位置for (int i = pos + 1; i < ps->size; i++){ps->SeqList[i - 1] = ps->SeqList[i];}ps->size--;ps->Max++;
}

user.c

#include <unistd.h>
#include "SeqList.h"
#include "User.h"// 系统主菜单
void menu()
{usleep(500000);printf("*****************************\n");printf("******客房管理系统*******\n");printf("*1. 办理入住\n");printf("*2. 查找客人\n");printf("*3. 修改客人信息\n");printf("*4. 退房\n");printf("*5. 以排序输出客人信息\n");printf("*6. 查看所有客人信息\n");printf("*7. 查看当前入住客人人数以及剩余房间数\n");printf("*8. 退出系统以及保存客人信息\n");printf("*****************************\n");
}
//导入历史信息
void LoadUser(SL* user)
{FILE* pf = fopen("/Users/meiyouyu/Desktop/2/user.txt", "rb");if (pf == NULL){perror("fopen error!\n");return;}User tmp;while (fread(&tmp, sizeof(User), 1, pf)){SLPushBack(user, tmp);}fclose(pf);printf("****成功导入历史入住数据****\n");
}
// 打印所有客人信息
void printUser(SL* user)
{for (int i = 0; i < user->size; i++){printf("第%d名客人:", i + 1);printf("\t身份证:%ld", user->SeqList[i].id);printf("\t姓名:%s", user->SeqList[i].name);printf("\t性别:%s", user->SeqList[i].gender);printf("\t入住房间档位:%d", user->SeqList[i].level);printf("\t入住房间号:%d\n", user->SeqList[i].location);}}
//按照房间号排序
int cmp_loc(const void* p1, const void* p2)
{return ((User *)p1)->location - ((User *)p2)->location;
}
// 打印排序后的内容
void printSortedUser(User* tmp, int size)
{for (int i = 0; i < size; i++){printf("第%d名客人:", i + 1);printf("\t客人身份证:%ld", tmp[i].id);printf("\t姓名:%s", tmp[i].name);printf("\t性别:%s", tmp[i].gender);printf("\t入住房间价格:%d", tmp[i].level);printf("\t房间号:%d\n", tmp[i].location);}
}//身份证去重
int repeat_id(User tmp,SL user)
{int i;for (i=0;i<user.size;i++){if(tmp.id==user.SeqList[i].id){return 0;}}return 1;
}// 获取输入
void userInfoGet(SL* user)
{int num = 0;char a=0;printf("请输入入住用户个数:");scanf("%d", &num);for (int i = 0; i < num; i++){User tmp;printf("请输入第%d个客人信息\n", i + 1);printf("请输入客人身份证:");scanf("%ld", &(tmp.id));while (!repeat_id(tmp,*user)){printf("身份证重复,请仔细检查重新输入\n");scanf("%ld", &(tmp.id));}printf("请输入客人姓名:");scanf("%s", tmp.name);printf("请输入客人性别:");scanf("%s", tmp.gender);printf("要查看已被入住的房间号吗?y/n\n");scanf(" %c",&a);if(a=='y'){printf("已经入住的有:\n");qsort(user->SeqList, user->size, sizeof(User), cmp_loc);printSortedUser(user->SeqList, user->size);} else if(a!='n'){printf("请重新输入y/n\n");scanf(" %c",&a);}printf("请输入客人想要入住的价格:1.199大床房,2.299双人床,3.999豪华大床房 : ");scanf("%d", &tmp.level);while (tmp.level!=999&&tmp.level!=299&&tmp.level!=199){printf("\n输入价格格式错误,请重新输入:1.199大床房,2.299双人床,3.999豪华大床房 : ");scanf("%d", &tmp.level);}printf("请输入客人入住对应等级的房间号: ");scanf("%d", &tmp.location);SLPushBack(user, tmp);printf("入住成功\n");}
}// 查找方式菜单
void menuForFind()
{printf("**************\n");printf("*1. 客人身份证\n");printf("*2. 客人姓名\n");printf("*3. 房间号\n");printf("*4. 退出查找\n");printf("**************\n");
}// 按照身份证查找,返回在表中位置
int findBy_id(SL* user, long target)
{for (int i = 0; i < user->size; i++){if (user->SeqList[i].id == target){return i;// 返回对应位置下标}}return -1;
}
//按照房间号
int findBy_loc(SL* user, long loc)
{for (int i = 0; i < user->size; i++){if (user->SeqList[i].location == loc){return i;// 返回对应位置下标}}return -1;
}// 按照名字查找
int findBy_name(SL* user, char* target)
{for (int i = 0; i < user->size; i++){if (strcmp(user->SeqList[i].name, target) == 0){return i;// 返回对应位置下标}}return -1;
}// 选择删除——返回下标
int findUser(SL* user)
{int choice = 0;int pos ;menuForFind();printf("请选择查找方式:");while (scanf("%d", &choice)){switch (choice){case 1:{long target = 0;printf("请输入需要查找的身份证id:");scanf("%ld", &target);pos = findBy_id(user, target);return pos;}case 2:{char name[50] = { 0 };printf("请输入需要查找的客人姓名:");scanf("%s", name);pos = findBy_name(user, name);return pos;}case 3:{long loc = 0;printf("请输入需要查找的身份证id:");scanf("%ld", &loc);pos = findBy_loc(user, loc);return pos;}case 4:return -1;default:menuForFind();printf("请重新按照菜单输入:\n");break;}menuForFind();printf("请选择查找方式:");}return -2;
}// 查找身份证
void findnumber(SL* a, long id)
{int i = 0;while (i != a->size) {if (id == a->SeqList[i].id) {printf("\n身份证:%ld 姓名:%s 性别:%s  房间号:%d 房间价格:%d\n",a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);return;}i++;}printf("没有检索到对应信息的客人\n");}
//查找房间号
void findlocation(SL* a, int location)
{int i = 0;while (i != a->size){if (location == a->SeqList[i].location){printf("身份证:%ld 姓名:%s 性别:%s  房间号:%d 房间价格:%d\n",a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);return;}i++;}printf("没有检索到对应信息的客人\n");}
// 查找姓名
void findname(SL* a, char* name){int i = 0;while (i != a->size){int j = 0;while (a->SeqList[i].name[j] == name[j] &&  name[j] != NULL){j++;}if (j == strlen(name)){printf("用户信息\n身份证:%ld 姓名:%s 性别:%s  入住房间号:%d 房间价格:%d\n",a->SeqList[i].id, a->SeqList[i].name, a->SeqList[i].gender,a->SeqList[i].location,a->SeqList[i].level);return;}i++;}printf("没有检索到对应信息的客人\n");}
// 查找
void find(SL* a)
{printf("请输入需要怎么查找 1.通过身份证查找 2.通过姓名查找 3.通过房间号查找:");int num = 0;scanf("%d", &num);if (num == 1) {printf("请输入需要查找的身份证:");long id = 0;scanf("%ld", &id);findnumber(a, id);}else if(num==2){printf("请输入需要查找的姓名:");char name[50];scanf(" %s", name);findname(a, name);} else if(num==3){printf("请输入需要查找的房间号:");int location;scanf(" %d", &location);findlocation(a,location);} else{printf("输入有误,请仔细检查选项\n");find(a);}
}// 修改员工
void remedy(SL* a) 
{printUser(a);printf("请输入需要修改信息的人员身份证号:");long id = 0;scanf("%ld", &id);int i = 0;while (i != a->size) {if (id == a->SeqList[i].id) {break;}i++;}if(i>=a->size){printf("没有找到对应客人信息\n");return;}printf("输入需要修改的信息编号: 1.身份证 2.姓名 3.性别  4.房间号以及价格:");int num = 0;scanf("%d", &num);long id1 = 0;char name[50];char gender[10];int location;int level;switch (num) {case 1:printf("请输入修改后身份证:");scanf("%ld", &id1);a->SeqList[i].id = id1; break;case 2:printf("请输入修改后姓名:");scanf(" %s", name);strcpy(a->SeqList[i].name, name); break;case 3:printf("请输入修改后性别:");scanf(" %s", gender);strcpy(a->SeqList[i].gender, gender); break;case 4:printf("请输入修改后的房间号和价格:");scanf(" %d", &location);scanf(" %d", &level);a->SeqList[i].location = location;a->SeqList[i].level = level;break;}printf("修改完成\n");
}// 退房
void deleteUser(SL* user)
{char a=0;// 调用查找函数int pos = findUser(user);if(pos==0){return;}if (pos < -1){printf("没有此用户,请仔细核对,或者用户已经办理退房\n");return;}printf("确定为身份证为%ld的客人办理退房吗?y/n\n",user->SeqList[pos].id);scanf(" %c",&a);if(a=='y'){SLErase(user, pos);printf("退房成功\n");}else{printf("返回主菜单");}}// 排序菜单
void menuForSort()
{printf("**************\n");printf("*1. 客人身份证\n");printf("*2. 客人姓名\n");printf("*3. 房间号\n");printf("*4. 房间价格\n");printf("*5. 退出排序\n");printf("**************\n");
}// 按照身份证排序
int cmp_id(const void* p1, const void* p2)
{return ((User*)p1)->id - ((User*)p2)->id;
}
//等级排序
int cmp_lev(const void* p1, const void* p2)
{return ((User*)p1)->level- ((User*)p2)->level;
}// 名字比较
int cmp_name(const void* p1, const void* p2)
{return strcmp(((User*)p1)->name, ((User*)p2)->name);
}// 排序主体
void sortUser(SL* user)
{int choice = 0;menuForSort();printf("请选择需要排序的字段:");while (scanf("%d", &choice)){switch (choice){case 1:qsort(user->SeqList, user->size, sizeof(User), cmp_id);printSortedUser(user->SeqList, user->size);break;case 2:qsort(user->SeqList, user->size, sizeof(User), cmp_name);printSortedUser(user->SeqList, user->size);break;case 3:qsort(user->SeqList, user->size, sizeof(User), cmp_loc);printSortedUser(user->SeqList, user->size);break;case 4:qsort(user->SeqList, user->size, sizeof(User), cmp_lev);printSortedUser(user->SeqList, user->size);break;case 5:return;default:menuForSort();printf("请重新按照菜单输入:");break;}menuForSort();printf("请选择需要排序的字段:");}
}// 向文件中写入数据
void writeIntoFile(SL* user)
{FILE* pf = fopen("/Users/meiyouyu/Desktop/2/user.txt", "wb");if (pf == NULL) {perror("fopen error!\n"); return;}//将通讯录数据写⼊⽂件for (int i = 0; i < user->size; i++){fwrite(user->SeqList + i, sizeof(User), 1, pf);}fclose(pf);printf("数据保存成功!\n");
}// 信息销毁函数
void destroyUser(SL* user)
{char ans = 0;printf("当前剩余客户是否需要续住:y/n\n");scanf(" %c", &ans);if (ans == 'y'){writeIntoFile(user);}else if(ans!='n'){printf("请重新输入y/n\n");scanf(" %c",&ans);}SLDestroy(user);
}

user.h

#pragma once#include "SeqList.h"typedef struct SeqList_dynamic SL;typedef struct User
{long id;//身份证char name[50];//名字char gender[10];//性别int level;//入住房间价格int location;//入住房间号
}User;// 程序菜单
void menu();// 导入数据
void LoadUser(SL* employees);// 初始化——输入
void userInfoGet(SL* employees);// 查找方式菜单
void menuForFind();
// 查找——返回下标
int findUser(SL* user);
// 查找——显示对应客人信息
void find(SL* a);// 修改信息
void remedy(SL* a);// 删除员工信息
void deleteUser(SL* user);// 排序菜单
void menuForSort();
// 按照指定内容排序
void sortUser(SL* user);
// 打印排序后的内容
void printSortedUser(User* tmp, int size);// 向文件中写入数据
void writeIntoFile(SL* user);// 销毁系统数据
void destroyUser(SL* user);// 打印所有员工信息
void printUser(SL* user);

建立如图所示的结构就可以

user.txt打开是乱码是正常的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47823.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode使用及调试方式和技巧

常用快捷键 ctrl ~ 显示隐藏终端面板 Ctrl\ 快速拆分文件编辑 Alt ↑↓ 移动当前代码行的位置 CtrlD 选中当前匹配项 CtrlB 切换侧边栏 alt 单机左键 或 长按鼠标滚轮鼠标左键下拉 添加多处光标 Ctrlp 快捷键设置 vscode调试 2022年了&#xff0c;该学会用VSC…

无人驾驶概览(1)

主要部分包括&#xff1a;高精度地图HD MAPS&#xff0c;定位Localization&#xff0c; 感知perception&#xff0c;预测 perdicition 规划 plan 控制 control 高精度地图HD MAPS中&#xff0c;几乎支持软件栈所有其他模块&#xff0c;包括定位感知预测和规划 定位Localizati…

Redis常用的5大数据类型

Reids字符串&#xff08;String&#xff09; 设置相同的key&#xff0c;之前内容会覆盖掉 Redis列表&#xff08;List&#xff09; 常用命令 从左往右放值 数据结构 Redis集合&#xff08;set&#xff09; sadd<key><value1><value2>...... 数据结构 Set数据…

Servlet运行过程

Servlet运行过程 Servlet程序是由WEB服务器调用&#xff0c;web服务器收到客户端的Servlet访问请求后&#xff1a; ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是&#xff0c;则直接执行第④步&#xff0c;否则执行第②步。 ②装载并创建该Servlet的…

超声波清洗机哪款好用?保姆级教学,教你手把手挑选适合自己的超声波清洗机

提及超声波清洗机&#xff0c;大家都不陌生&#xff0c;尤其是佩戴眼镜的小伙伴&#xff0c;眼镜的镜片长时间不清洁容易模糊不清&#xff0c;而超声波清洗机的出现&#xff0c;可以轻松清洗还不会损坏镜片&#xff0c;备受眼镜党喜爱。但由于现在市面上的超声波清洗机的款式太…

pyqt/pyside QTableWidget失去焦点后,选中的行仍高亮的显示

正常情况下pyqt/pyside的QTableWidget&#xff0c;点击input或者按钮失去焦点后 行的颜色消失了 如何在失去焦点时保持行的选中颜色&#xff0c;增加下面的代码&#xff1a; # 获取当前表格部件的调色板 p tableWidget.palette()# 获取活跃状态下的高亮颜色和高亮文本颜色&a…

排序系列 之 插入排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 插入排序英文名为InsertSort 基本思路 1、认为数组当中的第一个数值已经排好序了2、定义一个游标从第二个数值开始不断地向后进行遍历3、游标指向的数据插入已经排好序的数组中 代码…

Windows server漏洞解决

Windows server漏洞解决 一、SSL/TLS问题1、问题2、建议3、方法1)、winR运行&#xff1a;regedit&#xff0c;进入注册表。2&#xff09;、找到注册表3&#xff09;、在Ciphers新建五个项4&#xff09;、在每个新建文件加入值 二、Apache Tomcat问题1、问题2、下载 好家伙&…

国内从事双臂机器人的团队

一、背景 随着人形机器人的发展&#xff0c;双臂协同操作得到了越来越多研究人员的关注。我自己也是做双臂机器人方向的&#xff0c;虽然通过看论文或刷知乎了解到国内有许多团队在做双臂机器人方向&#xff0c;但还没有系统的整理过&#xff0c;因此趁这次机会&#xff0c;好…

C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 医学影像存储与传输系统&#xff0c;融合了医学信息化…

算法-经典递归解决排列组合

文章目录 前言1. 获取字符串的所有字串2. 数组的子集(无重复)3. 数组的子集(有重复)4. 字符大小写全排列5. 全排列(无重复)6. 全排列(有重复) 前言 如何正确的处理递归 所有的递归都分为带路径的递归和不带路径的递归, 我们之前学二叉树的时候基本上都是带路径的递归, 所有的递…

HBuilder x 使用Git管理项目,配合easy-git插件管理项目代码配置git和推送/拉取使用教程

文章目录 目录 文章目录 使用流程 小结 概要安装流程技术细节小结 概要 克隆/拉取项目代码到本地电脑教程 HBuilder x 使用Git管理项目&#xff0c;配合easy-git插件 克隆项目代码到本地教程-CSDN博客 电脑环境已安装好Hbuilder x工具 如果没有安装可以参考以下先安装好Hbui…

银发经济发展需要什么支持

随着社会老龄化的加剧&#xff0c;“银发经济”应运而生&#xff0c;成为社会发展的新动向。银发经济指的是针对老年人群体的经济活动&#xff0c;包括健康护理、休闲旅游、教育文化等多方面内容。这一现象不仅体现了社会对老年群体的关注和尊重&#xff0c;同时也为经济发展提…

HarmonyOS NEXT零基础入门到实战-第一部分

构建节页面思路&#xff1a; 1、排版 (分析布局) 2、内容&#xff08;基础组件&#xff09; 3、美化&#xff08;属性方法&#xff09; 设计资源-svg图标 界面中展示图标 ->可以使用svg图标&#xff08;任意放大缩小不失真&#xff0c;可以改颜色&#xff09; 使用方式&a…

重磅活动推荐:2024 CLK 大会启动中,承办单位开放报名

中国 Linux 内核开发者大会&#xff08;简称“CLK 大会”&#xff09;是中国 Linux 内核领域最具影响力的峰会之一&#xff0c;由清华大学、英特尔、富士通南大、IBM、阿里云、华为、腾讯等企业支持主办。大会秉承“自由、协作、创新”理念&#xff0c;以推动和普及开源技术为使…

java中Hashcode的作用【详解版】

一 HashCode作用 1.1 HashCode作用 hashCode是object类的一个方法&#xff0c;用于哈希表结构&#xff0c;主要是用来获取哈希值&#xff0c;用于确定对象在哈希表中的位置&#xff0c;如果两个对象的hashcode相同&#xff0c;那么他们可能被放在哈希表同一个位置(这取决于哈…

【每天值得看】文章获得《每天值得看》人工智能板块推荐第三名!为自己点个赞!!!

[2024-07-19]&#xff5c;CSDN每天值得看&#xff5c;人工智能 ① 【机器学习】Grid Search: 一种系统性的超参数优化方法&#xff08;鑫宝Code:[博客] [成就]&#xff09; [质量分&#xff1a;97&#xff1b;难度等级&#xff1a;未知&#xff1b;新鲜技术&#xff1a;99] 摘…

辅助类BigDecima/BigInteger

** 大数据的运算** 编号1方法解释1add2subtract-3multiply*4divide/

如何发一篇顶会论文? 涉及3D高斯,slam,自动驾驶,三维点云等等

SLAM&3DGS 1&#xff09;SLAM/3DGS/三维点云/医疗图像/扩散模型/结构光/Transformer/CNN/Mamba/位姿估计 顶会论文指导 2&#xff09;基于环境信息的定位&#xff0c;重建与场景理解 3&#xff09;轻量级高保真Gaussian Splatting 4&#xff09;基于大模型与GS的 6D pose e…

AutoMQ 生态集成 Redpanda Console

通过 Kafka Web UI 更加便利地管理 Kafka/AutoMQ 集群 随着大数据技术的飞速发展&#xff0c;Kafka 作为一种高吞吐量、低延迟的分布式消息系统&#xff0c;已经成为企业实时数据处理的核心组件。然而&#xff0c;Kafka 集群的管理和监控却并非易事。传统的命令行工具和脚本虽…