zoukankan      html  css  js  c++  java
  • 《数据结构》课程设计题目:床位分配_C语言链表实现

    问题如下:

    *****************************************************************************

      某客店有N个等级的房间,第k级客房有A(k)个,每个房间有B(k)个单人床,以菜单:床位分配,查找,统计,调用方式设计为单身旅客分配床位以及离店时收回床位的程序。要求分配成功时,印出旅客姓名、年龄、性别、到达日期、客房等级、房间号及床位号;分配不成功时,允许更改房间等级,若不更改等级,印出“满客”提示。

      #考虑性别

    ***********************************************************

    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    #include<time.h>
    
    int levels,rooms,beds;
    typedef struct tm *tim; //time函数库里的结构体
    
    
    //
    typedef struct bed
    {
        char name[20];
        char sex;
        int age;
        int full;
        tim p;  //时间
    } bed;
    
    //房间
    typedef struct room
    {
        int beds;
        int level;
        int num;
        bed Bed[10];
        int  full;      //满了则为1;
        struct room *next;
    } room;
    //房间等级
    typedef struct level
    {
        int rooms;
        int levelNum;
        int full;
        room *fRoom;     //房间的头地址;
        struct level *next;
    } level;
    //宾馆
    struct hotel
    {
        int levels;
        level *fLevel;  //level的头地址;
    } myhotel;          //创建一个旅馆;
    
    int oppositeSex(room *guestRoom,char sex);
    int ifFull(int dlevel);
    
    //入住
    int creat(char name[],char sex,int age,tim p,int selectedLevel)
    {
        int count_room=0;      //统计一个level中的房间数;
        //在指定的Level中给他找一个房间,并在Bed中把他的信息都放进去;
        level *guestLevel = myhotel.fLevel->next;           //头结点不能用,得用他后面的第一个有意义的结点
        room *guestRoom=NULL;
    
    
    
    
    
    
    
        //先查看这个level是否满人了
    
        while(ifFull(selectedLevel))
        {
            printf("这个level人已经满了,请再选一个level:
    ");
            scanf("%d",&selectedLevel);
        }
    
    
        int guestBed=0;
        int count=0;
        while(guestLevel!=NULL)
        {
            if(guestLevel->levelNum!=selectedLevel)         //选择适合客人的level的指针;
            {
                guestLevel=guestLevel->next;
            }
            else
            {
                guestRoom = guestLevel->fRoom->next;               //获得这个level里所有房间的头指针
    
                //找到一个有空位置的房间;
                while(guestRoom->full)
                    guestRoom=guestRoom->next;
    
                //看房间里是否有异性
                while(!oppositeSex(guestRoom,sex))
                {
                    guestRoom=guestRoom->next;      //不能接受就换下一个房间
                }
    
                //客人已经找到适合的房间了,现在找一个空床位
    
                for(int i=0; i<guestRoom->beds; i++)
                {
                    if(!guestRoom->Bed[i].full)
                    {
                        guestBed = i;           //找到了适合客人的空床
                        break;
                    }
                }
    
                //将客人的信息填入这个床的信息中
                strcpy(guestRoom->Bed[guestBed].name,name);
                guestRoom->Bed[guestBed].sex = sex;
                guestRoom->Bed[guestBed].age = age;
                guestRoom->Bed[guestBed].p =p;
                guestRoom->Bed[guestBed].full = 1;
    
                //验证房间里是否满人,满人则full变1,未满则full变0
                for(int i=0; i<guestRoom->beds; i++)
                {
                    if(guestRoom->Bed[i].full)
                        count++;
                }
                if(count==guestRoom->beds)
                    guestRoom->full=1;
                else
                    guestRoom->full=0;
    
                break;  //跳出循环
            }
        }
        printInfo(guestRoom,guestBed);
    }
    
    
    
    void printInfo(room *groom,int bed)
    {
        printf("**************************************************
    ");
        printf("*             Infomation of Guest              
    ");
        printf("*             Name:%s                          
    ",groom->Bed[bed].name);
        printf("*             Sex:%c                           
    ",groom->Bed[bed].sex);
        printf("*             Age:%d                           
    ",groom->Bed[bed].age);
        printf("*             门牌号:%d0%d	床号:%d            
    ",groom->level,groom->num,bed);
        printf("*    Time OF Checking in:%d-%d-%d %d:%d:%d     
    ",
               1900+groom->Bed[bed].p->tm_year,1+groom->Bed[bed].p->tm_mon,groom->Bed[bed].p->tm_mday,
               groom->Bed[bed].p->tm_hour,groom->Bed[bed].p->tm_min,groom->Bed[bed].p->tm_sec);
        printf("**************************************************
    ");
    }
    
    //输出所有房间
    void printAll()
    {
        level *guestLevel = myhotel.fLevel->next;           //头结点不能用,得用他后面的第一个有意义的结点
        room *guestRoom=NULL;
        while(guestLevel!=NULL)
        {
            guestRoom=guestLevel->fRoom->next;
            while(guestRoom!=NULL)
            {
                for(int i=0; i<guestRoom->beds; i++)
                {
                    if(guestRoom->Bed[i].full==1)
                        printInfo(guestRoom,i);
                }
                guestRoom=guestRoom->next;
            }
            guestLevel=guestLevel->next;
        }
    }
    
    //退房
    void checkOut(int droom,int bed)
    {
        int outLevel = (int)droom/100;
        int outroom = (int)droom%100;
        level *guestLevel = myhotel.fLevel->next;
        room *guestRoom=NULL;
    
        while(guestLevel!=NULL)
        {
            if(guestLevel->levelNum!=outLevel)        //选择适合客人的level的指针;
                guestLevel=guestLevel->next;
            else
            {
                guestRoom = guestLevel->fRoom->next;
                while(guestRoom->num!=outroom)
                    guestRoom=guestRoom->next;
                guestRoom->Bed[bed].full=0;
                guestRoom->full=0;
                break;
            }
        }
        printf("已成功退房!
    ");
    }
    
    //查询
    void Query(int droom,int bed)
    {
        int outLevel = (int)droom/100;
        int outroom = (int)droom%100;
        level *guestLevel = myhotel.fLevel->next;
        room *guestRoom=NULL;
        while(guestLevel!=NULL)
        {
            if(guestLevel->levelNum!=outLevel)        //选择适合客人的level的指针;
                guestLevel=guestLevel->next;
            else
            {
                guestRoom = guestLevel->fRoom->next;
                while(guestRoom->num!=outroom)
                    guestRoom=guestRoom->next;
                printInfo(guestRoom,bed);
                break;
            }
        }
    }
    
    
    //查看这个楼层是否满人
    int ifFull(int dLevel)
    {
        int count_room=0;
        level *guestLevel = myhotel.fLevel->next;           //头结点不能用,得用他后面的第一个有意义的结点
        room *guestRoom = NULL;
    
        while(guestLevel!=NULL)
        {
            if(guestLevel->levelNum!=dLevel)         //进入指定的楼层;
            {
                guestLevel=guestLevel->next;
            }
            else
            {
                if(guestLevel->full)        //如果满人了,直接返回1
                    return 1;
                else
                {
                    guestRoom = guestLevel->fRoom->next;    //获得这个level的第一个房间
                    for(int i=0; i<guestLevel->rooms; i++)
                    {
                        if(guestRoom->full)
                            count_room++;       //遍历每个房间
                        guestRoom=guestRoom->next;
                    }
    
    
                    if(count_room==guestLevel->rooms)       //如果满人的房间数=这个level的指定房间数,则房间数已满,使level=1
                    {
                        guestLevel->full=1;
                        return  1;
                    }
                    else
                        guestLevel->full=0;
                    break;
                }
            }
        }
    
        return 0;
    }
    
    
    //查看房间里是否有异性,并返回1或0;
    int oppositeSex(room *guestRoom,char sex)
    {
        int could=1;
    
        //如果这个房间有人
        for(int i=0; i<10; i++)
        {
    
            if(guestRoom->Bed[i].full)
            {
                if(guestRoom->Bed[i].sex!=sex)       //如果房间里有异性,询问其能否接受;
                {
                    printf("Could you stand having the opposite sex in the room?(Yes:1 or No:0)
     ");
                    scanf("%d",&could);
    
                    return could;
                }
            }
    
        }
    
        return could;   //如果循环结束没有触发if,则房间里没有异性,默认接受
    }
    
    
    
    int main()
    {
        int select;
        room *findRoom,*r;
        level *findLevel,*l;
        //输入旅馆的基本信息
        printf("How many levels does Hotel have?:");
        scanf("%d",&levels);
        printf("How many rooms does a level have?:");
        scanf("%d",&rooms);
        printf("How many beds does a room have?:");
        scanf("%d",&beds);
        printf("%d %d %d",levels,rooms,beds);
    
    
        findLevel = (level *)malloc(sizeof(level));           //level中的头节点;
        findLevel->fRoom = NULL;
        findLevel->next = NULL;
    
        //健全旅馆信息
        myhotel.levels=levels;
        myhotel.fLevel=findLevel;
    
        for(int i=0; i<levels; i++)
        {
            findRoom = (room*)malloc(sizeof(room));              //room中的头节点;
            findRoom->next = NULL;
    
            //建立level链表
            l=(level *)malloc(sizeof(level));
            l->fRoom = findRoom;      //将每一个level里的房间链表中的头节点的地址赋给fRoom;
            l->rooms=rooms;             //将房间数赋给Level;
            l->full=0;
            l->levelNum=i+1;
            findLevel->next=l;
            findLevel=l;
    
            //建立room链表
            for(int j=1; j<=rooms; j++)
            {
    
                r=(room*)malloc(sizeof(room));
                for(int k=0; k<beds; k++)
                {
                    r->Bed[k].full=0;
                }
                r->full=0;      //房间初始的时候都设为未满;
                r->level=i+1;   //房间level;
                r->beds=beds;
                r->num=j;       //房间号,用它和Level创建门牌号;
                findRoom->next=r;     //将新结点接在头节点的后面;
                findRoom=r;           //头节点变为下一个结点;
            }
            r->next=NULL;
        }
        l->next=NULL;
        while(1)
        {
            printf("
    ********************HOTEL*************************");
            printf("
    *----------------1>Check In----------------------*");
            printf("
    *----------------2>Check Out---------------------*");
            printf("
    *----------------3>PrintAll----------------------*");
            printf("
    *----------------4>Query-------------------------*");
            printf("
    *----------------5>Exit--------------------------*");
            printf("
    ------------Please Input Number-------------------
    ");
            int roomNum=0, bedNum=0;
            int level,age;
            char sex;
            char name[20],date[20];
            scanf("%d",&select);
            switch(select)
            {
            case 1:
                //输入基本信息
                printf("
    Please Input Your Information:");
                printf("
    Name:");
                scanf("%s",name);
                printf("
    Room Level(1-%d):",levels);
                scanf("%d",&level);
                printf("
    Age:");
                scanf("%d",&age);
                printf("
    Sex(M or F):");
                getchar();
                scanf("%c",&sex);
    
                //获得时间
                time_t t;
                tim p;
                time(&t);
                p=localtime(&t);//获得当地的时间
                creat(name,sex,age,p,level);
                break;
            case 2:
                printf("
    请输入要退的房间号:");
                scanf("%d",&roomNum);
                printf("
    请输入要退的床号:");
                scanf("%d",&bedNum);
                checkOut(roomNum,bedNum);
                break;
            case 3:
                printAll();
                break;
            case 4:
                printf("
    请输入要查询的房间号:");
                scanf("%d",&roomNum);
                printf("
    请输入要查询的床号:");
                scanf("%d",&bedNum);
                Query(roomNum,bedNum);
                break;
            case 5:
                printf("Exited Successfully!.");
                return 0;
            default :
                break;
            }
        }
        return 0;
    }

     

     可能是写惯了Java的原因,最后居然写出了Java的感觉,不过没事,其实C的结构体和Java的Class也有很多相似之处呢.

  • 相关阅读:
    各种文件的mime类型
    LeetCode_122. Best Time to Buy and Sell Stock II
    LeetCode_121. Best Time to Buy and Sell Stock
    LeetCode_119. Pascal's Triangle II
    LeetCode_118. Pascal's Triangle
    LeetCode_112. Path Sum
    LeetCode_111. Minimum Depth of Binary Tree
    LeetCode_110. Balanced Binary Tree
    LeetCode_108. Convert Sorted Array to Binary Search Tree
    LeetCode_107. Binary Tree Level Order Traversal II
  • 原文地址:https://www.cnblogs.com/Ravenzzz/p/9967642.html
Copyright © 2011-2022 走看看