题目要求

飞机到达目的地后,游客的行李会进入传送带,由游客自行在取行李处拿取,虽然机场出口处,有工作人员在检查,但也难免会出现拿错行李的事情。请为机场设计一个游客取行李的程序,游客在取行李处,输入自己的身份证号后才能取到自己的行李。
要求:使用线性表实现行李存储,行李信息表如下:**
行李编号 行李航班 姓名 身份证号 行李状态
001 UC8866 张里 510199909090002 到达
002 NI7755 李丽 510200012290001 已取
003 MQ9090 王一 510198810090003 未取
**004 BU8080 赵山 610197708080022 未到达

1.游客输入身份证号,即可获取对应行李箱状态,并领取本人行李箱。**
*2.显示欢迎类语句,为游客增加美好的体验感。*
*3.代码符合规范,正确、易读、易操作。*
**4.分析代码的运行效率,如时间复杂度和空间复杂度。

代码实现

// author: pysnow
#include <cstdio>
#include <cstdlib>
#include <synchapi.h>
#include "string.h"
int count = 0;
// count为判断是否查询错误超过三次的变量

// 数据结构体
typedef struct {
    char package_id[5];
    char flight[8];
    char name[20];
    char id_number[20];
    int status;
} elem;
//线性表结构体
typedef struct {
    elem data[6];
    int length;
} Sqlist;

// 获取用户心理状态,传入状态整数,返回状态的字符串指针
char *GetStatus(int i) {
    static char tmp[10];
    switch (i) {
        case 00:
            strcpy(tmp, "未到达");
            return tmp;
        case 10:
            strcpy(tmp, "到达未取");
            return tmp;
        case 11:
            strcpy(tmp, "已领取");
            return tmp;
    }
}

// 欢迎函数,模拟真实服务
void welcome() {
    printf("[+]欢迎来到优雅航班数据查询服务,很高兴为您服务\n");
    printf("[+]等待系统数据初始化....\n");
}

//单独定义的数据插入函数,其中插入的默认位置为线性表的尾端,若指定位置下标则是修改线性表内容
int InsertData(Sqlist *H, char id[], char flight[], char name[], char number[], int status, int location = 0) {
    location = H->length;
    strcpy(H->data[location].package_id, id);
    strcpy(H->data[location].flight, flight);
    strcpy(H->data[location].name, name);
    strcpy(H->data[location].id_number, number);
    H->data[location].status = status;
    H->length++;
    return 1;
}

//打印整个线性表内容,测试用的,也方便后期拓展功能
void PrintList(Sqlist *H) {
    int count = H->length;
    printf("\n%-6s| %-9s|    %-7s |       %-7s       |  %6s  \n", "行李编号", "行李航班", "姓名", "身份证号", "行李状态");
    for (int i = 0; i < count; i++) {
        printf("%-7s|%-8s|    %-7s  |   %-14s  |  %6s  \n", H->data[i].package_id, H->data[i].flight, H->data[i].name,
               H->data[i].id_number,
               GetStatus(H->data[i].status));
    }
}

//打印单个数据,传入线性表的位置,打印出其结果
void singel_PrintList(Sqlist *H, int i) {
    int count = i;
    printf("\n%-6s| %-9s|    %-7s |       %-7s       |  %6s  \n", "行李编号", "行李航班", "姓名", "身份证号", "行李状态");
    printf("%-7s|%-8s|    %-7s  |   %-14s  |  %6s  \n", H->data[count].package_id, H->data[count].flight,
           H->data[count].name, H->data[count].id_number,
           GetStatus(H->data[count].status));
}

//初始化线性表,包括初始插入的数据
void initSqlist(Sqlist *H) {
    H->length = 0;
    InsertData(H, "001", "UC8866", "张丽", "510199909090002", 10);
    InsertData(H, "002", "NI7755", "李丽", "510200012290001", 11);
    InsertData(H, "003", "MQ9090", "王一", "510198810090003", 10);
    InsertData(H, "004", "BU8080", "赵山", "610197708080022", 00);
    printf("[+]系统数据初始化完成\n");
    printf("[+]请先生或者女士输入一下待查询身份证号码\n");
}

//题目要求的主功能函数,传入一个身份证ID,返回一个行李所有信息,当行李状态为已到达未领取的时候会被更改为已领取
int Package_Get(Sqlist *H, char num[]) {
    for (int i = 0; i < H->length; i++) {
        if (strcmp(H->data[i].id_number, num) == 0) {
            printf("[+]检测到查询数据如下\n");
            singel_PrintList(H, i);
            if (H->data[i].status == 10) {
                H->data[i].status = 11;
                printf("\n[+]您的行李已成功领取");
                singel_PrintList(H, i);
                return 1;
            } else {
                printf("[+]您的行李因为%s,所以无法领取\n", GetStatus(H->data[i].status));
                return 1;
            }
        }
    }
    return 0;
}

//判断是否传入的身份证正确,若不正确则继续输入,不正确输入超过三次会直接退出程序
void judgeStatus(Sqlist *H, char *number) {
    if (Package_Get(H, number)) {
        printf("[+]查询系统关闭,欢迎下次查询\n");
    } else {
        if (count>=2){
            printf("[+]已查询失败3次,3秒后自动退出系统");
            Sleep(1800);
            exit(0);
        }
        printf("[+]未找到目标信息,请重新输入身份证号\n");
        count++;
        scanf("%s", number);
        judgeStatus(H, number);
    }
}

//主函数,代码逻辑尽量写得简单
int main() {
    welcome();
    Sqlist package;
    initSqlist(&package);
    char number[100];
    scanf("%s", number);

    judgeStatus(&package, number);
    system("pause");
}

项目展示

查询失败三次自动退出

image-20220528141355576

查询到达未领取的行李

image-20220528141442816

查询已领取或未到达的行李

image-20220528141613522

image-20220528141637985

问题回答

1.游客输入身份证号,即可获取对应行李箱状态,并领取本人行李箱。

代码实现如下

int Package_Get(Sqlist *H, char num[]) {
    for (int i = 0; i < H->length; i++) {
        if (strcmp(H->data[i].id_number, num) == 0) {
            printf("[+]检测到查询数据如下\n");
            singel_PrintList(H, i);
            if (H->data[i].status == 10) {
                H->data[i].status = 11;
                printf("\n[+]您的行李已成功领取");
                singel_PrintList(H, i);
                return 1;
            } else {
                printf("[+]您的行李因为%s,所以无法领取\n", GetStatus(H->data[i].status));
                return 1;
            }
        }
    }
    return 0;
}

查询逻辑为遍历整个线性表,然后使用strcmp函数对线性表中的内容与传入的内容进行比较,先打印出那个人的行李信息,再进行判断该行李是否可以领取,只有当行李状态为已到达未领取的时候才满足条件

时间复杂度: O(N)

空间复杂度: O(1)

2.显示欢迎类语句,为游客增加美好的体验感。

代码实现如下

void welcome() {
    printf("[+]欢迎来到优雅航班数据查询服务,很高兴为您服务\n");
    printf("[+]等待系统数据初始化....\n");
}

这个类似于前端美化,没什么好说的

3.代码符合规范,正确、易读、易操作。

我把主函数写的很少,大部分功能都是在函数里面实现的,而且每个函数都加了注释

4.分析代码的运行效率,如时间复杂度和空间复杂度。

代码运行效率分析:

由于题目要求的功能只有一个,那就是输入身份证号,然后查询与它相同身份证号所属的信息,我才用的是对线性表里面的内容进行遍历对比,其循环的次数由线性表的长度决定,又因为其长度是可变的,所以时间复杂度是O(N)。

对于空间复杂度,我只创建了一个临时变量i,用于变量线性表里面的数据,所以空间复杂度就是O(1)

总结

对于这个程序,我觉得可拓展的地方还有很多,比如这个行李状态,题目给出了四个状态,未到达,已到达,未领取,已领取,这四个状态很明显是有交集的,如:已到达和未达到都可以是未领取。所以这是我感觉题目出得有问题的地方,所以我把行李的状态简化成了三个状态,状态码分别为00,10,11,分别对应未到达,已到达未取,已领取

然后我在初始化数据的时候并没有采用直接赋值的方法,而是另外创建了一个插入函数,这样可以更方便后期其他功能函数的引入,毕竟在真实环境中,不可能有什么数据是最开始就需要初始化的,除了测试数据。而且有了这个插入功能的函数,我们可以为后期对这个程序进行拓展功能有很大的遍历

最后修改:2022 年 07 月 25 日
如果觉得我的文章对你有用,请随意赞赏
本文作者:
文章标题:C语言线性表
本文地址:https://pysnow.cn/archives/173/
版权说明:若无注明,本文皆Pysnow's Blog原创,转载请保留文章出处。