为旅客分配房间c语言思路,《数据结构》课程设计题目:床位分配_C语言链表实现...

#include #include#include#include

intlevels,rooms,beds;

typedefstruct tm *tim; //time函数库里的结构体//床

typedef structbed

{char name[20];charsex;intage;intfull;

tim p;//时间

} bed;//房间

typedef structroom

{intbeds;intlevel;intnum;

bed Bed[10];int full; //满了则为1;

struct room *next;

} room;//房间等级

typedef structlevel

{introoms;intlevelNum;intfull;

room*fRoom; //房间的头地址;

struct level *next;

} level;//宾馆

structhotel

{intlevels;

level*fLevel; //level的头地址;

} myhotel; //创建一个旅馆;

int oppositeSex(room *guestRoom,charsex);int ifFull(intdlevel);//入住

int creat(char name[],char sex,int age,tim p,intselectedLevel)

{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; ibeds; 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; ibeds; i++)

{if(guestRoom->Bed[i].full)

count++;

}if(count==guestRoom->beds)

guestRoom->full=1;elseguestRoom->full=0;break; //跳出循环

}

}

printInfo(guestRoom,guestBed);

}void printInfo(room *groom,intbed)

{

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("**************************************************");

}//输出所有房间

voidprintAll()

{

level*guestLevel = myhotel.fLevel->next; //头结点不能用,得用他后面的第一个有意义的结点

room *guestRoom=NULL;while(guestLevel!=NULL)

{

guestRoom=guestLevel->fRoom->next;while(guestRoom!=NULL)

{for(int i=0; ibeds; i++)

{if(guestRoom->Bed[i].full==1)

printInfo(guestRoom,i);

}

guestRoom=guestRoom->next;

}

guestLevel=guestLevel->next;

}

}//退房

void checkOut(int droom,intbed)

{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,intbed)

{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(intdLevel)

{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; irooms; i++)

{if(guestRoom->full)

count_room++; //遍历每个房间

guestRoom=guestRoom->next;

}if(count_room==guestLevel->rooms) //如果满人的房间数=这个level的指定房间数,则房间数已满,使level=1

{

guestLevel->full=1;return 1;

}elseguestLevel->full=0;break;

}

}

}return 0;

}//查看房间里是否有异性,并返回1或0;

int oppositeSex(room *guestRoom,charsex)

{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);returncould;

}

}

}return could; //如果循环结束没有触发if,则房间里没有异性,默认接受

}intmain()

{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

{

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

{

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;intlevel,age;charsex;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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值