C语言实现宾馆客房管理系统开发详解

一、系统概述

本宾馆客房管理系统是一个基于C语言开发的简单管理系统,采用链表数据结构存储宾客信息,实现了客房入住、查询、修改、退房等基本功能。系统具有以下特点:

  1. 使用链表动态管理宾客数据

  2. 支持数据持久化存储和读取

  3. 提供简洁的文本界面操作

  4. 包含基本的客房管理功能

二、数据结构设计

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;
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xienda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值