《數據結構》課程設計題目:床位分配_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也有很多相似之處呢.

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM