一、系统概述
本宾馆客房管理系统是一个基于C语言开发的简单管理系统,采用链表数据结构存储宾客信息,实现了客房入住、查询、修改、退房等基本功能。系统具有以下特点:
-
使用链表动态管理宾客数据
-
支持数据持久化存储和读取
-
提供简洁的文本界面操作
-
包含基本的客房管理功能
二、数据结构设计
1. 宾客信息结构体
typedef struct _Guest {
char name[20]; // 姓名
char sex[20]; // 性别
int fanghao; // 房号
} Guest;
2. 链表节点结构
typedef struct _Node {
Guest gue; // 宾客信息
struct _Node* pNext; // 指向下一个节点的指针
} Node;
系统使用全局变量g_pHead
作为链表头节点:
Node *g_pHead = NULL; // 头节点指针
三、核心功能实现
1. 客房入住功能
void log() {
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
// 头插法添加新节点
if (g_pHead == NULL) {
g_pHead = pNewNode;
} else {
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
// 输入宾客信息
printf("请输入房间号:\n");
scanf("%d",&pNewNode->gue.fanghao);
printf("请输入性别:\n");
scanf("%s",pNewNode->gue.sex);
printf("请输入姓名:\n");
scanf("%s",pNewNode->gue.name);
printf("房间已入住成功,欢迎您的入住\n");
system("pause");
system("cls");
}
实现要点:
-
使用
malloc
动态分配内存 -
采用头插法将新节点插入链表
-
收集宾客信息并存储到节点中
2. 客房查询功能
Node* FindGuest() {
int guest;
printf("请输入查询的房间:\n");
scanf("%d",&guest);
Node* p = g_pHead;
while(p != NULL) {
if (p->gue.fanghao == guest) {
return p;
}
p = p->pNext;
}
return NULL;
}
实现要点:
-
遍历链表查找匹配房间号
-
返回找到的节点指针或NULL
3. 信息修改功能
void ModifyRoom() {
int fanghao;
printf("请输入要修改的房间号:\n");
scanf("%d",&fanghao);
Node* p = g_pHead;
while(p != NULL) {
if (p->gue.fanghao == fanghao) {
printf("请输入要修改的宾客 姓名 性别: \n");
scanf("%s %s",p->gue.name,p->gue.sex);
printf("修改成功");
break;
}
p = p->pNext;
}
if (p == NULL) {
printf("没有找到该学生信息。\n");
}
system("pause");
system("cls");
}
4. 退房功能
void deleteguest() {
int fanghao;
printf("请输入要退房的房间号:\n");
scanf("%d",&fanghao);
// 处理头节点情况
if(g_pHead->gue.fanghao == fanghao) {
Node* p1 = g_pHead;
g_pHead = g_pHead->pNext;
free(p1);
return;
}
// 遍历查找要删除的节点
Node* p = g_pHead;
while(p->pNext != NULL) {
if (p->pNext->gue.fanghao == fanghao) {
Node* p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2);
return;
}
p = p->pNext;
}
printf("没有找到该客人");
system("pause");
system("cls");
}
四、数据持久化
1. 数据保存
void SaveRoom() {
FILE* fp = fopen("D:\\dev\\room.dat","w+");
Node* p = g_pHead;
while(p != NULL) {
fwrite(&p->gue,1,sizeof(Guest),fp);
p = p->pNext;
}
fclose(fp);
printf("数据保存成功\n");
system("pause");
system("cls");
}
2. 数据读取
void ReadGuest() {
FILE *fp = fopen("D:\\dev\\room.dat","r");
if (fp == NULL) {
printf("打开文件失败\n");
}
Guest Guest;
while(fread(&Guest,1,sizeof(Guest),fp) {
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL;
memcpy(&pNewNode->gue,&Guest,sizeof(Guest));
if (g_pHead == NULL) {
g_pHead = pNewNode;
} else {
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
}
fclose(fp);
printf("加载数据成功\n");
system("pause");
system("cls");
}
五、系统主界面
void welcome() {
printf("**************************\n");
printf("*****宾馆客房管理系统*****\n");
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(" 0.退出系统\n");
}
六、总结
本文详细介绍了使用C语言实现宾馆客房管理系统的全过程,包括数据结构设计、核心功能实现和数据持久化处理。该系统虽然简单,但涵盖了链表操作、文件I/O等C语言编程的核心知识点,非常适合初学者学习参考。读者可以根据实际需求对系统进行扩展和完善。
全部代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
void welcome() //欢迎
{
printf("**************************\n");
printf("*****宾馆客房管理系统*****\n");
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(" 0.退出系统\n");//
}
typedef struct _Guest //结构体 ,宾客信息
{
char name[20]; //姓名
char sex[20]; //性别
int fanghao; //房号
}Guest;
typedef struct _Node //链表
{
Guest gue; //宾客
struct _Node* pNext; //指向下一个节点的指针
}Node;
Node *g_pHead = NULL; //头节点
void log() //入住房间
{
Node* pNewNode = (Node*)malloc(sizeof(Node)); //建一个新的节点,动态开辟内存 ,malloc返回一个*void指针,需要强转成*Node才能赋给pNewNode
pNewNode->pNext = NULL; //将节点指向NULL。
if (g_pHead == NULL) //判断该头节点是否为NULL,如果为真,头节点为新创建的节点,如果为假,新节点指向头节点,头节点为新节点。头插法。
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
printf("请输入房间号:\n");
scanf("%d",&pNewNode->gue.fanghao);
printf("请输入性别:\n");
scanf("%s",pNewNode->gue.sex);
printf("请输入姓名:\n");
scanf("%s",pNewNode->gue.name);
printf("房间已入住成功,欢迎您的入住\n");
system("pause");
system("cls"); //清屏
}
void PrintRoom()
{
printf("**************************\n");
printf("*******宾馆客房管理*******\n");
printf("**************************\n");
printf("房间号 性别 姓名\n");
printf("**************************\n");
//你
Node* p = g_pHead; //从头节点开始
while(p!=NULL) //不为空节点,就一直遍历
{
printf("%d %s %s\n",p->gue.fanghao,p->gue.sex,p->gue.name);
p = p->pNext;
printf("**************************\n");
}
system("pause");
system("cls");
}
void SaveRoom() //保存信息
{
//打开文件
FILE* fp = fopen("D:\\dev\\room.dat","w+");
Node* p = g_pHead; //从头节点开始
while(p!=NULL)
{
fwrite(&p->gue,1,sizeof(Guest),fp);
p = p->pNext;
}
fclose(fp); //关闭文件
printf("数据保存成功\n");
system("pause");
system("cls");
}
void ReadGuest() //加载数据
{
//打开文件
FILE *fp = fopen("D:\\dev\\room.dat","r"); //打开文件
if (fp == NULL)
{
printf("打开文件失败\n");
}
Guest Guest;
while(fread(&Guest,1,sizeof(Guest),fp)) //读取信息
{
//创建一个新节点
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->pNext = NULL; //指向空
memcpy(pNewNode,&Guest,sizeof(Guest)); //拷取信息
if (g_pHead == NULL)
{
g_pHead = pNewNode;
}
else
{
pNewNode->pNext = g_pHead;
g_pHead = pNewNode;
}
}
fclose(fp);
printf("加载数据成功\n");
system("pause");
system("cls");
}
int Sumguest()
{
int count = 0;
//遍历链表
Node* p = g_pHead;
while(p!=NULL)
{
count++;
p = p->pNext;
}
system("pause");
system("cls");
return count;
}
Node* FindGuest()
{
int guest;
char Name[20];
printf("请输入查询的房间:\n");
scanf("%d",&guest);
Node* p = g_pHead;
while(p != NULL)
{
if (p->gue.fanghao == guest)
{
return p;
}
p = p->pNext;
}
return NULL;
}
void ModifyRoom()
{
int fanghao;
printf("请输入要修改的房间号:\n");
scanf("%d",&fanghao);
Node* p = g_pHead;
while(p != NULL)
{
if (p->gue.fanghao == fanghao)
{
printf("请输入要修改的宾客 姓名 性别: \n");
scanf("%s %s",p->gue.name,p->gue.sex);
printf("修改成功");
break;
}
p = p->pNext;
}
if (p == NULL)
{
printf("没有找到该学生信息。\n");
}
system("pause");
system("cls");
}
void deleteguest()
{
int fanghao;
printf("请输入要退房的房间号:\n");
scanf("%d",&fanghao);
Node* p1,*p2;
if(g_pHead->gue.fanghao == fanghao)
{
p1 = g_pHead;
g_pHead = g_pHead->pNext;
free(p1);
return;
}
Node* p = g_pHead;
while(p->pNext != NULL)
{
if (p->pNext->gue.fanghao == fanghao)
{
p2 = p->pNext;
p->pNext = p->pNext->pNext;
free(p2 );
system("pause");
system("cls");
return ;
}
p = p->pNext;
if (p->pNext == NULL)
{
break;
}
}
if (p->pNext == NULL)
{
printf("没有找到该客人");
}
system("pause");
system("cls");
}
int main()
{
while (1)
{
welcome();
char ch = getch();
switch (ch)
{
case'1': //查询房间
{
Node* p = FindGuest();
if (p!=NULL)
{
printf("性别:%s 姓名:%s\n",p->gue.sex,p->gue.name);
}
else
printf("没有该客人\n");
system("pause");
system("cls");
break;}
case'2': //入住房间
log();
break;
case'3': //修改房间
ModifyRoom();
break;
case'4':
PrintRoom(); //房间入住情况
break;
case'5': //保存信息
SaveRoom();
break;
case'6': //读取信息
ReadGuest();
break;
case'7': //入住人数
printf("入住总人数:%d\n",Sumguest());
break;
case'8': //退出房间
deleteguest();
break;
case'0': //退出系统
printf("再见\n");
return 0;
default:
printf("您的输入有问题,请重新输入\n");
system("pause");
system("cls");
break;
}
getchar();
}
return 0;
}