数据结构练手小项目(AVL树、哈希表、循环链表、MySQL数据库)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

在这里插入图片描述
@[toc]

前言

本月主打数据结构,当然,月初的时候入门了MySQL。
不过吧,一直学一直学,人都学傻了,死读书读死书,==以练代学,学以致用==才是正道。
这不,我找到了一个数据结构的练手小项目,拿来练练,如果有兴趣,可以一起试试啊。

正文(无删减)

1.主题区域“移动运营商的客户服务”的信息系统应在以下位置输入,存储,处理和显示数据:
-顾客
-移动运营商拥有的SIM卡;
-客户发行或退回SIM卡。

2.有关每个客户端的数据应包含:
护照号码-格式为“ NNNN-NNNNNN”的字符串,其中N为数字;
护照的签发地点和日期-字符串;
名称-字符串;
出生年份-整个;
地址是一个字符串;

注意-线的长度(护照号码除外)由学生独立确定。

3.==客户数据应组织为AVL搜索树==,并==按“护照号”排序==。

4.每个SIM卡的数据必须包含:
SIM卡号码-格式为“ NNN-NNNNNNN”的字符串,其中N是数字
资费是一个字符串
发布年份-整体;
可用性的标志是合乎逻辑的。

注意-线路的长度(“ SIM卡号”除外)由学生独立确定。

5.==SIM卡上的数据应以哈希表的形式进行组织==,==哈希表的主键为“ SIM卡号”==,哈希方法由作业选项确定。
6.客户发行或退回SIM卡的数据必须包含
护照号码-一行,其格式对应于客户数据中的相似行;
SIM卡号-格式对应于SIM卡中数据中类似行的行;
发布日期-字符串;
到期日期-字符串。

注意:1.在此数据中存在在“护照号”字段中包含值X的条目,在“ SIM卡号”中包含值Y的条目分别表示向客户发放了护照号码X的SIM卡号Y。 证明没有为护照号码为X的客户发行了编号为Y的SIM卡。2.可以向一个客户发行多张SIM卡。 因此,可能存在在其字段中具有重复值的数据。

7.客户==SIM卡的发行或归还数据应以循环链表的形式进行组织==,并==按主键“ SIM卡号”的顺序进行排列==。 列表视图和排序方法由作业选项确定。

8.信息系统“移动运营商的客户服务”应执行以下操作:
新客户注册;
客户服务提现
查看所有注册客户
清除客户数据;
通过“护照号”搜索客户 搜索结果-有关找到的客户的所有信息以及发给他的SIM卡号;
客户按全名或地址的片段进行搜索。 搜索结果-找到的客户列表指示护照号码,姓名和地址。

添加新的SIM卡;
删除SIM卡信息
查看所有可用的SIM卡
清除SIM卡数据
通过“ SIM卡号”搜索SIM卡。 搜索结果-有关找到的SIM卡的所有信息,以及该SIM卡发给的客户的姓名和护照号码;
按费率搜索SIM卡。 搜索结果-找到的SIM卡列表,指示“ SIM卡号”,资费,制造年份
向客户发行SIM卡的注册
注册客户返回的SIM卡。

9.查看所有注册客户或查看所有SIM卡时发出的客户或SIM卡数据的组成由学生独立确定,但必须包含至少两个字段

10.由学生独立确定以一定速率搜索SIM卡的方法。 必须将所选方法与替代方法进行比较。

11.通过全名或地址的片段搜索客户端应通过==系统遍历AVL搜索树==来进行。 解决方法由作业选项确定。 在按全名或地址的片段搜索客户端时,可以指定全名或地址及其组成部分(例如,仅客户端的姓氏,不包括名字和中间名,仅地址中的街道名)。 要检测全名或地址中的给定片段,应使用在任务变体中指定的文本中搜索单词的算法。

12.仅当移动运营商拥有SIM卡(相应SIM卡的“可用性标志”字段的值为“ True”)时,才应进行向客户的SIM卡发行注册。

13.在注册向客户发行SIM卡或客户返还SIM卡时,必须调整相应SIM卡的“可用性标志”字段的值。

我的想法(删减修改版)

数据导入与数据存储

MySQL数据库。


功能实现

数据库数据写入AVL树与哈希表。

新客户注册;(AVL树中插入数据)
客户服务提现;(AVL树中主键搜索)
查看所有注册客户;(主键遍历AVL树)
清除客户数据;(AVL树中主键删除)
客户按全名或地址的片段进行搜索。 搜索结果-找到的客户列表指示护照号码,姓名和地址。(AVL中非主键搜索)

添加新的SIM卡;(哈希表主键插入)
删除SIM卡信息;(哈希表主键删除)
查看所有可用的SIM卡;(哈希表主键遍历)
按费率搜索SIM卡。 搜索结果-找到的SIM卡列表,指示“ SIM卡号”,资费,制造年份(哈希表中非主键搜索)

通过“ SIM卡号”搜索SIM卡。 搜索结果-有关找到的SIM卡的所有信息,以及该SIM卡发给的客户的姓名和护照号码;(哈希表主键搜索+AVL树主键搜索)
向客户发行SIM卡的注册。(哈希表主键搜索+AVL树主键搜索)
注销客户的SIM卡。(哈希表主键搜索+AVL树主键搜索)

AVL树与哈希表数据写回数据库。


数据结构

2.有关每个客户端的数据应包含:
护照号码-格式为“ NNNN-NNNNNN”的字符串,其中N为数字;
护照的签发地点和日期-字符串;
名称-字符串;
出生年份-整个;
地址是一个字符串;

注意-线的长度(护照号码除外)由学生独立确定。

3.==客户数据应组织为AVL搜索树==,并==按“护照号”排序==。

4.每个SIM卡的数据必须包含:
SIM卡号码-格式为“ NNN-NNNNNNN”的字符串,其中N是数字
资费是一个字符串
发布年份-整体;
可用性的标志是合乎逻辑的。

用户结构

typedef struct User_Message{
    string passport_number;
    string passport_issue_address;
    string passport_issue_time; 
    string user_name;
    string user_birthday;
    string user_hometown;
}UM_t;

SIM卡结构

typedef struct SIM_Message{
    string SIM_number;
    string last_money;
    string SIM_issue_time;
    int issue_flag;
    string owner_number;    //持卡人护照号码
}SIM_t;

AVL树数据结构

struct User_Tree_Node{
    User_Tree_Node* left;
    User_Tree_Node* right;
    User_Message* data;
}

哈希表结构

underored_map<string,SIM_Message*> hash_SIM;

数据表

用户表

create table UM(
    passport_number varchar(12) primary key,
    passport_issue_address varchar(12) not NULL,
    passport_issue_time varchar(12) not NULL,
    user_name varchar(12) not NULL,
    user_birthday varchar(12),
    user_hometown varchar(12)
);

SIM卡表

create table SIM(
    SIM_number varchar(12) primary key,
    last_money varchar(12) not NULL,
    SIM_issue_time varchar(12) not NULL,
    issue_flag int not NULL,
    owner_number varchar(12) 
);

时间安排

预计用时3天,规划一天,数据库方面一天,数据结构方面一天。
在这里插入图片描述

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
122 3
 算法系列之数据结构-Huffman树
|
4月前
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
303 19
|
6月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
159 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
6月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
156 12
|
6月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
142 10
|
6月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
210 3
|
8月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
190 5
|
8月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
185 59
|
1月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
23 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。

推荐镜像

更多