您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】链表——客房管理

2016-11-04 18:21 281 查看

客房管理(链表)

满足如下要求

定义客房链表结点结构类型,以Hotel和*HLink命名,数据域:客房名称roomN、标准价格Price、入住价格PriceL(默认值=标准价格*80%)、床位数Beds、入住状态State(空闲、入住、预订,默认值为空闲),指针域:*next

实现创建客房基本情况链表函数void Build(HLink &H),输入客房名称、标准价格、床位数,将入住价格、入住状态修改为默认值,建议用文件操作来输入数据

实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state

实现输出客房基本情况函数void Exp(HLink H),输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态

函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%

函数void upBed(HLink &H,int beds),将该链表床位数不超过beds的结点都放在床位数超过beds的结点后面

求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除

函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法

函数void ReverseN2(HLink &H),将单链表的正中间位置结点之后的全部结点倒置的功能,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法

主控函数main()调用以上函数,输出(3)(beds=2,state=”入住”)、(5)、(6)、(7)、(8)、(9)处理后的链表内容、输出入住价格最高的客房基本情况

预处理

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//定义客房链表结点结构
typedef struct HNode
{
char    roomN[7];   //客房名称
float   Price;      //标准价格
float   PriceL; //入住价格(默认值=标准价格*80%)
int    Beds;        //床位数Beds
char       State[5];    //入住状态(值域:"空闲"、"入住"、"预订",默认值为"空闲"
struct HNode  *next;    //指针域
}Hotel, *HLink;


源程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//定义客房链表结点结构
typedef struct HNode{
char roomN[7];  //客房名称
float Price;        //标准价格
float PriceL;   //入住价格(默认值=标准价格*80%)
int Beds;       //床位数Beds
char State[5];  //入住状态(值域:"空闲"、"入住"、"预订",默认值为"空闲"
struct HNode *next; //指针域
}Hotel, *HLink;

HLink H, L, rear, rem;
int beds, k;
char *state;
float MaxPriceL;

#define TRUE 1
#define FALSE 0
void Build(HLink &H);   //创建链表
void updateH(HLink &H, int beds, char *state);  //将入住状态改为state
void Exp(HLink H);  //输出链表
void Output(HLink H);
void Add(HLink &H);     //未入住的客房入住价格均加价20%
void upBed(HLink &H,int beds);      //床位数不超过beds的结点都放在床位数超过beds的结点后面
float MaxPriceLinH(HLink H);
HLink FirstH(HLink &H);     //返回入住价格最高的客房结点指针
HLink MaxPricelH(HLink H);
void MoveK1(HLink &H, int k);   //将单链表中倒数第k个结点移到第一个结点位置
void ReverseN2(HLink &H);       //将单链表的正中间位置结点之后的全部结点倒置

int main(){
Build(H);   //创建链表
Exp(H);

printf("请输入要修改的床位数: ");
scanf("%d", &beds);
char Sstate[5];
printf("请输入新的入住状态: ");
scanf("%s", Sstate);
state = Sstate;
updateH(H, beds, state);    //将入住状态改为state
Add(H);     //未入住的客房入住价格均加价20%
Exp(H);
printf("请输入床位数,系统将根据您的输入整理客房信息: ");
scanf("%d", &beds);
upBed(H, beds);     //床位数不超过beds的结点都放在床位数超过beds的结点后面
printf("更改入住状态、入住价格以及信息整理后:\n");
//将此时所有最大值的信息都删除
Exp(H);

printf("\n现在删除最高入住价格:\n");
MaxPriceLinH(H);
rear = L = (HLink)malloc(sizeof(Hotel));
do{
rem = FirstH(H);
rear->next = rem;
rear = rem;
}while(MaxPricelH(H)&&MaxPriceL == MaxPricelH(H)->PriceL);
printf("最高入住价格:\n");
Exp(L);
Exp(H);

MoveK1(H, k);   //将单链表中倒数第k个结点移到第一个结点位置
Exp(H);
ReverseN2(H);   //将单链表的正中间位置结点之后的全部结点倒置
Exp(H);

return 0;
}

void Build(HLink &H){
HLink rear;
HLink p;
char *indata = "studata.txt";   //数据输入文件路径及名称
FILE *fp;   //文件指针
fp = fopen(indata, "r");    //打开文本文件
if (!fp) {
printf("数据输入文件没找到!\n");
exit(1);
}

H = (HLink)malloc(sizeof(Hotel));
rear = H;

//依次从文本文件中读取结点数据(学号、姓名和成绩)
while(!feof(fp)){   //判断是否读取到文件结尾
p = (HLink)malloc(sizeof(Hotel));
//从文件中逐行读取客房名称p->roomN、标准价格p->price、入住价格p->PriceL、床位数p->Beds和入住状态p->State
fscanf(fp,"%s%f%d",&p->roomN,&p->Price,&p->Beds);
p->PriceL = p->Price * 0.8f;
strcpy(p->State, "空闲");
rear->next = p;
rear = p;
}
rear->next = NULL;
fclose(fp);
}

void Exp(HLink H){
HLink p;
printf("\n客房信息输出如下:\n");
printf("---------------------\n");
printf("客房名称\t标准价格\t入住价格\t床位数\t入住状态\n");
printf("---------------------\n");
for(p = H->next; p!=NULL; p = p->next)
printf("%s\t\t%8.1f\t%8.1f\t%6d%8s\n",p->roomN,p->Price,p->PriceL,p->Beds,p->State);
}

void Output(HLink H){
HLink p;
printf("\n客房信息输出如下:\n");
printf("---------------------\n");
printf("客房名称\t标准价格\t入住价格\t床位数\t入住状态\n");
printf("---------------------\n");
for(p = H; p!=NULL; p = p->next)
printf("%s\t\t%8.1f\t%8.1f\t%6d%8s\n",p->roomN,p->Price,p->PriceL,p->Beds,p->State);
}

void updateH(HLink &H, int beds, char *state){
HLink p;
for(p = H->next; p!=NULL; p = p->next)
if(p->Beds == beds)
strcpy(p->State,state);
}

void Add(HLink &H){
HLink p;
for(p = H->next; p !=NULL; p = p->next){
if(!strcmp(p->State,"空闲"))
p->PriceL = p->PriceL * 1.2f;
}
}

void upBed(HLink &H,int beds){
HLink temp, cal, rear;    //找到最后一个大于beds的结点
for(temp = H->next; temp != NULL; temp = temp->next)
if(temp->Beds > beds)
rear = temp;
if(temp == NULL) return ;
for(cal = H; cal->next; cal = cal->next);
HLink p, p1, p2;
for(p1 = H; p1->next != NULL&&p1!=rear;){
p2 = p = p1->next;
if(p->Beds <= beds){
p1->next = p2->next;
p->next = NULL;
cal->next = p;
cal = cal->next;
}
if(p1->next->Beds <= beds)continue;
else p1 = p1->next;
}
}

float MaxPriceLinH(HLink H){
MaxPriceL = 0;
HLink p;
for(p = H->next; p != NULL; p = p->next)
MaxPriceL = MaxPriceL > p->PriceL ? MaxPriceL : p->PriceL;
return MaxPriceL;
}

HLink FirstH(HLink &H){
HLink p, p1, p2;
p1 = H;
for(p = p1->next; p1->next != NULL;){
p = p2 = p1->next;
if(p->PriceL == MaxPriceL){
p1->next = p2->next;
p->next = NULL;
return p;
}
else  p1 = p1->next;
}
return NULL;
}

HLink MaxPricelH(HLink H){
HLink p;
for(p = H->next; p != NULL; p = p->next){
if(p->PriceL == MaxPriceL){
return p;
}
}
return NULL;
}

void MoveK1(HLink &H, int k){
restart:
printf("\n将单链表中倒数第k个结点移到第一个结点位置: ");
scanf("%d",&k);
HLink p, p1, p2;
for(p = H; k > 0; k--)
p = p->next;
if(k > 0||!p){
printf("输入k超过节点数\n");
goto restart;
}
for(p2 = H; p; p2 = p2->next){
p = p->next;
p1 = p2;
}
p1->next = p2->next;
p2->next = H->next;
H->next = p2;
}

void ReverseN2(HLink &H){
printf("\n将单链表的正中间位置结点之后的全部结点倒置: \n");
HLink p, q, p1, temp;
q = p1 = H;
for(p = H; q&&q->next; p = p->next){
q = q->next->next;
}
temp = p;
for(q = H; q->next; q = q->next);
for(; temp->next != q;){
p = temp;
for(p1 = p->next; q->next != p1; p = p->next){
p->next = p1->next;
p1->next = p1->next->next;
p->next->next = p1;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 链表