2023年郑州轻工业大学软件学院数据结构实验五-查找与排序(详解+源码C语言版+运行结果)

实验要求

一、实验目的

1.掌握常用的查找和排序算法思想;

2.能够用所学过的查找和排序算法解决生活中的实际应用问题。

二、课程目标

支撑课程目标(4):能够在软件开发过程中,针对特定需求综合应用数据结构、算法分析与设计等知识解决实际问题,具有积极进取、追求卓越的创新意识。

三、实验任务

设计并实现一个新冠疫苗接种信息管理系统(假设该系统面向需要接种两剂的疫苗)。要求定义一个包含接种者的身份证号、姓名、已接种了几剂疫苗、第一剂接种时间、第二剂接种时间等信息的顺序表,系统至少包含以下功能:

(1)逐个显示信息表中疫苗接种的信息;

(2)两剂疫苗接种需要间隔14~28天,输出目前满足接种第二剂疫苗的接种者信息;

(3)给定一个新增接种者的信息,插入到表中指定的位置;

(4)分别删除指定位置和给定接种者身份证号的接种者记录信息;

(5)利用直接插入排序或者折半插入排序按照身份证号进行排序;

(6)分别利用快速排序和堆排序按照第一剂接种的时间进行排序;

(7)根据身份证号进行折半查找,若查找成功,则返回此接种者的信息;

(9)为提高检索效率,要求利用利用接种者的姓氏为关键字建立哈希表,并利用链地址法处理冲突。给定接种者的身份证号或姓名,查找疫苗接种信息,并输出冲突次数和平均查找长度;

(10)提供用户菜单,方便选择执行功能。可以设计成一级或多级菜单。所有功能都可重复执行。

思路分析

数据结构

使用结构体 info 来表示个体信息,包括身份证号、姓名、接种次数以及接种日期等。

另外,使用结构体 time1 表示日期信息。

链表:

使用链表结构(Lnode)来存储 info 数据,为创建哈希表提供了支持。

哈希表:

使用哈希表,通过数组 Hash[Max] 实现,每个数组元素是一个链表,用于存储 info 数据。

使用 Hashcode 函数计算给定姓名的哈希码,从而确定数组中的索引位置。

信息显示:

 printfinfo factoPrintfInfo 函数

用于显示有关接种者的信息,包括接种日期和次数。

 

排序:

使用插入排序按照身份证号对信息进行排序(insertsort)。

使用快速排序和堆排序按照第一次接种日期对信息进行排序(quicksort 和 heapsort)。

 

搜索:

使用二分搜索(halfinterval)按照身份证号搜索信息。

用户交互:

程序提供了一个用户菜单,允许用户选择不同的功能,如显示信息、添加新记录、删除记录、排序、搜索以及哈希表操作。

 

哈希表操作:

createHashTable 初始化并填充哈希表,使用链表处理碰撞。

Hashselect 在哈希表中根据姓名搜索信息。

基于菜单的程序:

程序采用基于菜单的方法,允许用户交互式地选择不同的功能。

主循环:

主函数包含一个无限循环,在其中用户可以选择菜单中的不同选项,直到决定退出程序。

源码如下所示

#define _CRT_SECURE_NO_WARNINGS 1
#include<string.h>
#include<iostream>
#include<time.h>using namespace std;
#define max 15
#define Max 100
int cur = 9;
int Conflict = 0;
struct time1 {int year;int mon;int day;
};
struct info {long long id;char name[10];int count;struct time1 tm1;struct time1 tm2;int time;
};
typedef struct Lnode {struct info data;struct Lnode* next;
}*Linklist,Lnode;/*
输出信息方法
*/
void printfinfo(struct info info[]) {printf("序号\t");printf("身份证号\t");printf("姓名    \t");printf("接种剂数  ");printf("第一针\t");printf("第二针\t\n");for (int i = 0; i <= cur; i++) {printf("%d\t",i+1);printf("%lld\t",info[i].id);printf("%s\t\t",info[i].name);printf("%d\t", info[i].count);printf("%d/%d/%d\t", info[i].tm1.year, info[i].tm1.mon, info[i].tm1.day);printf("%d/%d/%d\n", info[i].tm2.year, info[i].tm2.mon, info[i].tm2.day);}
}/*
计算时间方法
*/
void countTime(struct info(&info)[max]) {int pyear = 2000;for (int i = 0; i <= cur; i++) {info[i].time = (info[i].tm1.year - pyear) * 365 + info[i].tm1.mon * 30 + info[i].tm1.day;}
}
/*
* 显示信息表中疫苗接种的信息
*/
void factoPrintfInfo(struct info (&info)[max]) {countTime(info);time_t t = time(0);int n = 0;struct tm* curtime = localtime(&t);int day = curtime->tm_mday;int mon = curtime->tm_mon;printf("序号\t");printf("身份证号\t");printf("姓名    \t");printf("接种剂数\t");printf("第一针\t");printf("第二针\t");for (int i = 0; i <= cur; i++) {if (info[i].count == 1) {if (((mon - info[i].tm1.mon) * 30 + info[i].tm1.day - day) > 14) {printf("%d		\t", ++n);printf("%lld\t", info[i].id);printf("%s		\t", info[i].name);printf("%d		\t", info[i].count);printf("%d%d%d\t", info[i].tm1.year, info[i].tm1.mon, info[i].tm1.day);printf("%d%d%d\n", info[i].tm2.year, info[i].tm2.mon, info[i].tm2.day);}}}
}
/*
输入信息
*/
void inputInfo(struct info& info) {cout << "输入信息" << endl;cout << "身份证号:"; cin >> info.id;cout << "姓名:"; cin >> info.name;cout << "接种次数:"; cin >> info.count;printf("请输入日期时间值(按照yyyy/mm/dd格式)\n");cout << "第一次:";scanf("%d/%d/%d", &info.tm1.year, &info.tm1.mon, &info.tm1.day);if (info.count != 1) {cout << "第二次:";scanf("%d/%d/%d", &info.tm2.year, &info.tm2.mon, &info.tm2.day);}else {info.tm2.year = 0;info.tm2.mon = 0;info.tm2.day = 0;}
}
/*
* 输出信息:BUG已修复
*/
void printfinfo1(struct info info) {printf("身份证号\t");printf("姓名\t");printf("接种剂数\t");printf("   第一针\t");printf("第二针\t\n");printf("%lld\t", info.id);printf("%s\t", info.name);printf("%d\t\t", info.count);printf("%d/%d/%d\t", info.tm1.year, info.tm1.mon, info.tm1.day);printf("%d/%d/%d\n", info.tm2.year, info.tm2.mon, info.tm2.day);
}
/*
* 添加信息
*/
int addinfo(struct info(&info)[max]) {int n = 0;cout << "输入要插入的位置:";cin >> n;n--;if (n < max - 1 && cur < max - 1)cur++;else {cout << "信息库满,插入失败" << endl;return 0;}if (n == cur) {inputInfo(info[n]);}else {for (int i = cur; i > n; i--) {info[i] = info[i - 1];}inputInfo(info[n]);cout << "添加成功" << endl;return 0;}
}
/*
通过id查找信息
*/
int selectbyId(long long id, struct info info[max]) {for (int i = 0; i <= cur; i++) {if (info[i].id == id) {return i + 1;}return -1;}
}
/*
* 通过索引删除
*/
int deletebyindex(int n, struct info(&info)[max]) {n--;if (n > cur) {cout << "没有该记录" << endl;return 0;}for (int i = n; i < cur; i++) {info[i] = info[i + 1];}cur--;cout << "删除成功" << endl;return 1;
}
/*
* 通过id删除
*/
void deletebyId(struct info(&info)[max]) {long long id = 0;cout << "输入要删除的身份证号:";cin >> id;int n = selectbyId(id, info);deletebyindex(n, info);//待验证
}
/*
* 插入排序
*/
void insertsort(int n, struct info(&info)[max]) {struct info temp;//中间变量int i = 0, j = 0;for (i = 1; i <= n; i++) {if (info[i].id < info[i - 1].id) {temp = info[i];for (j = i - 1; j >= 0 && info[j].id > temp.id; j--){info[j + 1] = info[j];}info[j + 1] = temp;}}
}
/*
* 判断是否前个时间大于后个时间
*/
bool istimebiger(struct time1 t1, struct time1 t2) {if (t1.year < t2.year)return true;else if (t1.year > t2.year)return false;else {if (t1.mon < t2.mon)return true;else if (t1.mon > t2.mon)return false;else {if (t1.day < t2.day)return true;elsereturn false;}}
}
/*
* 快排
*/
void quicksort(struct info(&info)[max], int left, int right) {struct info temp;struct info pivot;countTime(info);int i, j;if (left > right)return;pivot = info[left];i = left;j = right;while (i < j) {while (pivot.time >= info[i].time && i < right)i++;while (pivot.time < info[j].time)j--;if (i < j) {temp = info[i];info[i] = info[j];info[j] = temp;}}info[left] = info[j];info[j] = pivot;quicksort(info, left, j - 1);quicksort(info, j+1, right);
}
/*
* 二分查找
*/
void halfinterval(struct info (&info)[max]) {insertsort(cur, info);long long target;cout << "输入要查找的身份证号:";cin >> target;int left = 0,right = cur;int mid;while (left <= right) {mid = (left + right) / 2;if (info[mid].id > target) {right = mid - 1;}else if (info[mid].id < target) {left = mid + 1;}elsebreak;}if (left <= right) {printf("信息如下\n");printfinfo1(info[mid]);}elseprintf("查无此人\n");
}
/*
* 交换函数
*/
void swap(struct info(&info)[max], int i, int j) {struct info temp = info[i];info[i] = info[j];info[j] = temp;
}
/*
* 调整函数
*/
void adjust(struct info(&info)[max], int m, int n) {int i = m;int j = (i * 2) + 1;while (j <= n) {if (j + 1 <= n && info[j].time < info[j + 1].time)j++;if (info[i].time > info[j].time)return;else {swap(info, i, j);i = j;j = (i * 2) + 1;}}
}
/*
* 堆排序
*/
void heapsort(struct info(&info)[max], int len) {int i;countTime(info);for (i = len / 2 - 1; i >= 0; i--) {adjust(info, i, len - 1);}for (i = len - 1; i > 0; i--) {swap(info, 0, i);adjust(info, 0, i - 1);}
}
/*
* 哈希码计算
*/
int Hashcode(char n[10]) {int code = 0;code = abs((int)n[0]) + abs((int)n[1]);return code % 100;
}
/*
* intiHashTable,初始化哈希表
*/
void intiHashTable(struct Lnode(&Hash)[Max]) {for (int i = 0; i < Max; i++)Hash[i].next = NULL;
}
/*
* 创建哈希表
*/
void createHashTable(info info[max], Lnode (&Hash)[Max]) {intiHashTable(Hash);int sum = 0;for (int i = 0; i <= cur; i++) {struct Lnode* n = (Linklist)malloc(sizeof(Lnode));n->data = info[i];n->next = NULL;int code = Hashcode(info[i].name);if (Hash[code].next == NULL) {Hash[code].next = n;sum++;}else {int i = 1;Conflict++;sum += 2;struct Lnode* n1 = (Linklist)malloc(sizeof(Lnode));n1 = Hash[code].next;while (n1->next != NULL) {sum += i++;n1 = n1->next;}n1->next = n;}}float num = (float)sum / (cur + 1);cout << "冲突次数:" << Conflict << endl;cout << "平均查找长度:" << num ;
}
/* 
* Hashselect,按照姓名查找
*/
void Hashselect(char str[], Lnode(&Hash)[Max]) {int code = Hashcode(str);if (Hash[code].next == NULL) {cout << "未找到该姓名的接种者信息" << endl;return;}struct Lnode* current = Hash[code].next;while (current != NULL) {if (strcmp(current->data.name, str) == 0) {printfinfo1(current->data);return;}current = current->next;}cout << "未找到该姓名的接种者信息" << endl;
}
/*
* 获取身份证号对应的姓名
*/
void getnamebyid(long long id, struct info info[max], char res[10]) {for (int i = 0; i <= cur; i++) {if (info[i].id == id) {strcpy(res, info[i].name);return;}}// 否则无法找到该idstrcpy(res, "无法找到此id");
}
/*
* 主函数
*/
int main() {int n = 0;struct info info[max] = { {123123123,"输入你的姓名",2,{2020,11,11},{2021,6,8}},{321321321,"输入你的姓名2",2,{2020,10,29},{2021,6,7}} };struct Lnode Hash[Max];char res[10];long long id;while (true) {cout << "+++++++++++++++++++++++" << endl;cout << "+选择功能" << endl;cout << "+1. 显示信息" << endl;cout << "+2. 显示可接种者信息" << endl;cout << "+3. 新增接种者信息" << endl;cout << "+4. 删除接种者信息" << endl;cout << "+5. 直接插入排序信息" << endl;cout << "+6. 快速排序和堆排序" << endl;cout << "+7. 折半查找" << endl;cout << "+8. 哈希表查找" << endl;cout << "+0. 退出" << endl;cout << "+++++++++++++++++++++++" << endl;cin >> n;switch (n) {case 0:exit(0);case 1:printfinfo(info); break;case 2:factoPrintfInfo(info); break;case 3:addinfo(info); break;case 4: {cout << "+++++++++++++++++++++" << endl;cout << "+选择功能" << endl;cout << "+1. 按索引删除" << endl;cout << "+2. 按身份证号删除" << endl;cout << "+0. 退出" << endl;cout << "+++++++++++++++++++++" << endl;cin >> n;switch (n) {case 0:exit(0);case 1:cout << "输入要删除的位置:"; cin >> n;deletebyindex(n, info); break;case 2:deletebyId(info);}break;}case 5:insertsort(cur, info); printfinfo(info); break;case 6: {cout << "+++++++++++++++++++++" << endl;cout << "+选择功能" << endl;cout << "+1. 快速排序" << endl;cout << "+2. 堆排序" << endl;cout << "+0. 退出" << endl;cout << "+++++++++++++++++++++" << endl;cin >> n;switch (n) {case 0:exit(0);case 1:quicksort(info, 0, cur); printfinfo(info); break;case 2:heapsort(info, cur); printfinfo(info);}break;}case 7:halfinterval(info); break;case 8: {cout << "+++++++++++++++++++++" << endl;cout << "+选择功能" << endl;cout << "+1. 按姓名查找" << endl;cout << "+2. 按身份证号查找" << endl;cout << "+0. 退出" << endl;cout << "+++++++++++++++++++++" << endl;createHashTable(info, Hash);cin >> n;switch (n) {case 0:exit(0);case 1:cout << "输入要查找的姓名:"; cin >> res; Hashselect(res, Hash); break;case 2:cout << "输入要查找的身份证号:"; cin >> id; getnamebyid(id, info, res); Hashselect(res, Hash);}break;}}}
}

实验结果

显示信息:

 

新增信息:

 

删除信息:

 

 排序展示(略,因为都是按照id升序,无需展示)

折半查找:

哈希表查找:

 最后声明!

本代码完全免费开源!请勿非法倒卖!!严查必究!有什么BUG去评论区留言,我会及时回复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 代理静态资源,解决跨域问题

&#x1f602; 背景&#xff1a;移动端 H5 项目&#xff0c;依赖了一个外部的 JS 文件。访问时&#xff0c;出现跨域&#xff0c;导致请求被 block。 当前域名&#xff1a;https://tmcopss.test.com要访问的 JS 文件&#xff1a;https://tm.test.com/public/scripts/y-jssdk.j…

漏洞复现-海康威视网络对讲广播系统远程命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

基于Java (spring-boot)的在线培训考试系统

一、项目介绍 在线培训系统是一款基于SpringBootVue开发的考试系统。一款多角色在线培训考试系统&#xff0c;系统集成了用户管理、角色管理、部门管理、题库管理、试题管理、试题导入导出、考试管理、在线考试、错题训练等功能&#xff0c;考试流程完善。 多角色&#xff1a;多…

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码

基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于蝴蝶算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于蝴蝶优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…

100天精通Python(实用脚本篇)——第111天:批量将PDF转Word文档(附上脚本代码)

文章目录 专栏导读1. 将PDF转Word文档需求2. 模块安装3. 模块介绍4. 注意事项5. 完整代码实现6. 运行结果书籍推荐 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到就业》&#xff1a;本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整教…

GRU算法

前置知识&#xff1a;RNN&#xff0c;LSTM LSTM需要训练的参数很多&#xff0c;极消耗计算资源。GRU是一种LSTM的改进算法&#xff0c;参数更少&#xff0c;更容易训练。 它将忘记门和输入门合并成为一个单一的更新门&#xff0c;同时合并了数据单元状态和隐藏状态&#xff0…

CSS 缩减顶部动画

<template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container" mou…

MATLAB指令

01--根据数学公式进行绘制 1.绘制连续函数 ①一元函数 t0:0.1:10; y3*t2; plot(t,y) ②一元二次函数 t0:0.1:10; yt.*t; plot(t,y) 注意此处应为点乘 ③一元3次 t0:0.1:10; yt.*t.*t; plot(t,y) ④y1/t t0:0.1:10; y1./t; plot(t,y) ⑤yexp(t) t0:0.1:10; yexp(2*t); p…

计算机基础面试题 |03.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Python爬虫---selenium基本使用

为什么使用selenium&#xff1f; 使用urllib.request.urlopen()模拟浏览器有时候获取不到数据,所以使用selenium (1) selenium是一个用于web应用程序测试的工具 (2) selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样 (3) 支持通过各种driver (FirfoxDri…

23种设计模式Python版

目录 创建型模式简单工厂模式工厂方法模式抽象工厂模式单例模式原型模式建造者模式 结构型模式适配器模式桥接模式组合模式装饰器模式外观模式享元模式代理模式 行为型模式职责链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式模板方法模式访…

改进YOLO系列 | YOLOv5/v7 更换主干网络之 ResNet50/ResNet101

论文地址:https://arxiv.org/abs/1512.03385v1 更深层的神经网络更难以训练。我们提出了一个残差学习框架,以便于训练比以往使用的网络更深层的网络。我们明确地将层重构为学习相对于层输入的残差函数,而不是学习无参考的函数。我们提供了全面的实证证据,表明这些残差网络…

接口测试工具Postman接口测试图文教程

一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致&#xff0c;任何一方的进度跟不上&#xff0c;都无法及时完…

APP UI自动化测试常见面试题,或许有用呢~

1.Android APP 内存不足时&#xff0c;如何获得内存&#xff1f; 系统优先结束被挂起&#xff08;暂停&#xff09;的进程&#xff0c;释放内存。 2.APP 测试常见问题有哪些&#xff1f;原因有哪些&#xff1f; 常见的有 crash、ANR&#xff08;应用无响应、卡死&#xff09…

STM32G030F6P6读写flash失败问题(HAL)

STM32G030是F0系列的升级版&#xff0c;其在性能上比F0要好很多&#xff0c;具体G0参数如下&#xff1a; 最开始做项目选用的单片机是STM32F030F4P6&#xff0c;但是在后期使用中发现&#xff0c;我的FLASH&#xff08;16K&#xff09;不够用了&#xff0c;就选择了STM32G030F6…

【Matlab】LSTM长短期记忆神经网络时序预测算法(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88688439 一&#xff0c;概述 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种常用的循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;结构&#xff0c;由于其对于…

ros2基础学习13 DDS 通信得学习

ROS2中最为重大的变化——DDS&#xff0c;我们在前边课程中学习的话题、服务、动作&#xff0c;他们底层通信的具体实现过程&#xff0c;都是靠DDS来完成的&#xff0c;它相当于是ROS机器人系统中的神经网络。 通信模型 DDS的核心是通信&#xff0c;能够实现通信的模型和软件框…

科技云报道:2024年六大科技趋势前瞻,最热门的技术都在这里了!

科技云报道原创。 物之生也&#xff0c;若骤若驰&#xff0c;无动而不变&#xff0c;无时而不移。 技术创新的步伐丝毫没有放缓的迹象&#xff0c;在这个日新月异的时代&#xff0c;科技创新在改变人们生活、推动社会进步方面扮演着关键的角色。2024年有望成为又一个开创性的…

高效管理文件夹:使用重命名进行文件夹名称大小写转换的技巧

在计算机管理中&#xff0c;文件夹名称的大小写规范是一个经常被忽视的细节。然而&#xff0c;文件夹名称的大小写有时可能会影响工作流程&#xff0c;例如在某些文件搜索或识别过程中。掌握文件夹名称大小写转换的技巧&#xff0c;可以更高效地管理文件夹。现在一起来看看云炫…

分布式定时任务Xxl_Job详细使用手册

看了很多网上的版本&#xff0c;思路描述的都不是很清晰&#xff0c;都只是几步操作就完成了&#xff0c;看效果&#xff0c;导致容易走入弯路&#xff08;不排除是自己理解能力把&#xff09;&#xff0c;最开始以为是把admin模块集成到项目&#xff0c;后来测试了会&#xff…