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

客房管理链表系统
本文介绍了一个使用链表实现的客房管理系统,包括创建客房链表、更新客房状态、调整客房价格等功能,并提供了完整的源代码实现。

客房管理(链表)

满足如下要求

  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;
        }
    }
}
### 复现 DeepSeek R1 模型的方法 为了复现或实现 DeepSeek R1 的功能,需遵循 HuggingFace 提供的技术路线图并利用相关资源。具体来说: #### 使用知识蒸馏创建高质量语料库 根据技术报告中的描述,在第一步中,应采用 DeepSeek-R1 蒸馏高质量语料库以复制 R1-Distill 模型[^1]。此过程涉及到使用预训练的大规模语言模型作为教师模型,指导较小的学生模型的学习。 ```python from transformers import AutoModelForSequenceClassification, Trainer, TrainingArguments teacher_model = "path_to_teacher_model" student_model = "path_to_student_model" # 加载教师和学生模型 teacher = AutoModelForSequenceClassification.from_pretrained(teacher_model) student = AutoModelForSequenceClassification.from_pretrained(student_model) training_args = TrainingArguments( output_dir="./results", num_train_epochs=3, per_device_train_batch_size=8, per_device_eval_batch_size=8, warmup_steps=500, weight_decay=0.01, logging_dir='./logs', ) trainer = Trainer( model=student, args=training_args, train_dataset=train_dataset, eval_dataset=val_dataset, teacher=teacher # Knowledge distillation setup ) trainer.train() ``` #### 构建基于强化学习的管道 第二步涉及构建用于生成 R1-Zero 版本的纯 RL pipeline。这一步骤可能需要准备针对不同领域的新数据集,特别是那些有助于提高数学推理能力和编程技能的数据集合。 对于这部分工作,可以考虑使用 `stable-baselines3` 库来设置环境并与之交互,从而优化策略网络。 ```python import gym from stable_baselines3 import PPO env = gym.make('MathProblem-v0') # 假设有一个自定义的 Gym 环境名为 MathProblem-v0 model = PPO("MlpPolicy", env, verbose=1) model.learn(total_timesteps=10_000) obs = env.reset() for i in range(1000): action, _states = model.predict(obs, deterministic=True) obs, rewards, dones, info = env.step(action) if dones: break ``` #### 进行多阶段训练转换至最终版本 最后一步是从基础架构逐步演变为完全由强化学习驱动的形式。这一过程中会经历几个迭代周期,每次都会调整参数配置直至达到最佳性能表现。 在此期间,建议定期评估中间产物的质量,并据此做出必要的改进措施。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值