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

2 篇文章 0 订阅
1 篇文章 0 订阅

客房管理(链表)

满足如下要求

  1. 定义客房链表结点结构类型,以Hotel和*HLink命名,数据域:客房名称roomN、标准价格Price、入住价格PriceL(默认值=标准价格*80%)、床位数Beds、入住状态State(空闲、入住、预订,默认值为空闲),指针域:*next
  2. 实现创建客房基本情况链表函数void Build(HLink &H),输入客房名称、标准价格、床位数,将入住价格、入住状态修改为默认值,建议用文件操作来输入数据
  3. 实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state
  4. 实现输出客房基本情况函数void Exp(HLink H),输出所有客房的客房名称、标准价格、入住价格、床位数、入住状态
  5. 函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%
  6. 函数void upBed(HLink &H,int beds),将该链表床位数不超过beds的结点都放在床位数超过beds的结点后面
  7. 求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除
  8. 函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法
  9. 函数void ReverseN2(HLink &H),将单链表的正中间位置结点之后的全部结点倒置的功能,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法
  10. 主控函数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;
        }
    }
}
  • 21
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实验一 客房管理链表应用实验) 定义客房链表结点结构HLink (1)实现创建客房信息链表函数void Build(HLink &H),输入(客房名称、标准价格、床位数),同时修改入住价格、入住状态为默认值,即入住价格=标准价格*80%,入住状态为”空闲”(提示:用strcpy()字符串拷贝函数)。为了提高程序调试效率,强烈建议:用文件操作来输入客房信息(客房名称、标准价格、床位数); (2)实现输出客房信息函数void Exp(HLink H),输出所有客房客房名称、标准价格、入住价格、床位数、入住状态; (3)函数int Find(HLink &H, char *roomN)),查找房间名称为roomN的客房。 (4)实现函数void updateH(HLink &H, int beds, char *state),将床位数为beds的客房入住状态改为state。 (5)函数void Add(HLink &H),将该链表中未入住的客房入住价格均加价20%; (6)求出入住价格最高的客房函数HLink FirstH(HLink &H),该函数内return语句返回入住价格最高的客房结点指针,返回前将该结点在链表中删除; (7)函数void MoveK1(HLink &H, int k),将单链表中倒数第k个结点移到第一个结点位置,注意:严禁采用先计算链表长度n再减k(即n-k)的方法; (8)函数void ReverseN2(HLink &H),将单链表的正中间位置结点之后的全部结点倒置的功能,注意:严禁采用先计算链表长度n再除以2(即n/2)的方法; (9)函数void SortPriceL(HLink &H),按照客房(入住价格,客房名称)升序排序; (10)函数void upBed(HLink &H,int beds),创建一个【床位数为beds的新结点】(还需输入:客房名称、标准价格等信息),使链表的形态为:【头结点】->【床位数>beds的结点】->【床位数为beds的新结点】->【床位数=1则输出该客房链表中的位置序号,否则输出该客房不存在;输出(4)~(10)处理后的链表内容,(6)还要输出入住价格最高的客房信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值