《数据结构》课程设计题目:床位分配_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:\n");
        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("**************************************************\n");
    printf("*             Infomation of Guest              \n");
    printf("*             Name:%s                          \n",groom->Bed[bed].name);
    printf("*             Sex:%c                           \n",groom->Bed[bed].sex);
    printf("*             Age:%d                           \n",groom->Bed[bed].age);
    printf("*             门牌号:%d0%d\t床号:%d            \n",groom->level,groom->num,bed);
    printf("*    Time OF Checking in:%d-%d-%d %d:%d:%d     \n",
           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("**************************************************\n");
}

//输出所有房间
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("已成功退房!\n");
}

//查询
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)\n ");
                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("\n********************HOTEL*************************");
        printf("\n*----------------1>Check In----------------------*");
        printf("\n*----------------2>Check Out---------------------*");
        printf("\n*----------------3>PrintAll----------------------*");
        printf("\n*----------------4>Query-------------------------*");
        printf("\n*----------------5>Exit--------------------------*");
        printf("\n------------Please Input Number-------------------\n");
        int roomNum=0, bedNum=0;
        int level,age;
        char sex;
        char name[20],date[20];
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            //输入基本信息
            printf("\nPlease Input Your Information:");
            printf("\nName:");
            scanf("%s",name);
            printf("\nRoom Level(1-%d):",levels);
            scanf("%d",&level);
            printf("\nAge:");
            scanf("%d",&age);
            printf("\nSex(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("\n请输入要退的房间号:");
            scanf("%d",&roomNum);
            printf("\n请输入要退的床号:");
            scanf("%d",&bedNum);
            checkOut(roomNum,bedNum);
            break;
        case 3:
            printAll();
            break;
        case 4:
            printf("\n请输入要查询的房间号:");
            scanf("%d",&roomNum);
            printf("\n请输入要查询的床号:");
            scanf("%d",&bedNum);
            Query(roomNum,bedNum);
            break;
        case 5:
            printf("Exited Successfully!.");
            return 0;
        default :
            break;
        }
    }
    return 0;
}

 

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

 

 

 

 

 

posted @ 2018-11-16 10:00  Umbrellaox  阅读(1633)  评论(15编辑  收藏  举报