IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 哈希表的项目分享-----新冠疫情防控系统 -> 正文阅读

[数据结构与算法]哈希表的项目分享-----新冠疫情防控系统

社区新冠疫情防控管理系统

项目背景:

基于疫情的久久不退散,以及每日核酸的背景之下,社区疫情防控十分严峻。

功能 :登记社区居民是否进行了核算检测,统计社区居民的疫苗接种情况;并方便管理员查看并及时更新;(添加信息,更改信息, 删除信息,查找信息,分类打印)

选择的数据结构:

哈希表

原因:因为主要是登记每个住户是否接种疫苗,或者是否进行了核酸检测,查找写入的方面比较多,而哈希表的查找很快,同时社区的人口比较多,而链表的大小是不限的。

步骤:

  1. 定义每个住户的信息的结构体:

包括住户身份证号码后六位,姓名,年龄,是否接种第一针疫苗,第二针, 第三针, 三日内是否进行核酸检测,电话号码。此处Key值为身份证号码的后六位;例如21-2112

Struct ?community

{

Char ID[20];例如21-2112

Char name[20];

Int age;

Char vaccine[20];

Char nucleic[20];

Long Num;

}data_t;

  1. 定义一个链表用来存储数据

Struct node

{

Data_T data;

Node *pNext;

}

3.定义一个数组

Struct Hash

{

Node *hash[SIze]

Int count;

};

3.实现对信息进行增删改查,更新,分类打印等等

注意:数组的下标处理方法 ,身份证号码输入格式为11-1111

把’\0’的值赋给’-’,将字符分为两部分,并相加作为数组下标index。

4.具体函数实现过程

  1. 定义写入数据:

因为是链表,所以采取头插比较方便高效;

Int interItemHash(Hash * pHash, data_t *pdata)

pNode->pNext = pHash->hash[index];

pHash->hash[index] = pNode;

  1. 删除信息

通过身份证号码的后六位找到该居民,并且对其信息进行删除;

Int deleteItemHash(Hash *pHash, data_t *pdata)

如果没有这个ID,Null == pHash->[index] 返回未找到;

如果第一个刚好是我们要找的信息

strcmp (pTmp->data_t.id, pdata.id)= 0

{

pHash->hash[SIZE] = pTmp->Next;

Free(pTmp)

Count--;

}

While(pDel != NUll)

{

strcmp (pDel->data_t.id, pdata.id)= 0

Free(pDel);

Count--;

pTmp = pTmp->pNext

pDel = pTmp->pNext;

}

  1. 查找信息:

Int searchItem(Hash *pHash, data_t *pdata)

没有此id:NUll = pHash->hash[index]

While(pTmp != Null)

{

If (pTmp->data.id ?== ?pdata->id ) (strcmp)

{

Printf (...............................)

}

pTmp = pTmp->pNext

}

  1. 通过write将信息写入文件,再通过read读出信息,并且将读到的数据插入链表;

//判断文件是否存在

存在,读文件,将都的内容插入哈希表;

不存在,创建文件,将哈希表的数据写入文件;

  1. 写makefile

1.函数:增删改查,查找,释放:hash.s

#include "../include/hashpoj.h"

//菜单
void menu()
{
	printf("1............输入\n");
	printf("2............删除\n");
	printf("3............查找\n");
	printf("4............修改疫苗接种信息\n");
	printf("5............修改核酸检测信息\n");
	printf("6............修改手机号信息\n");
	printf("7............输出\n");
	printf("8............N天内未完成核酸检测的人\n");
	printf("9............没有接种第三针疫苗的人\n");
	printf("0............退出\n");
	printf("11............清屏\n");
}

//处理下标
static int indexpFun(char *key)
{
	if(NULL == key)
	{
		return HASH_ERROR;
	}
	char str[20] = {0};
	strcpy(str, key);
	char *argv[2] = {0};
	argv[0] = key;
	int i = 0;
	while(str[i])
	{
		if('-' == str[i])
		{
			str[i] = '\0';
			argv[1] = &str[i + 1];
		}
		i++;
	}
	int index = atoi(argv[0]) + atoi(argv[1]);
	return index;
}

//创建节点
static Node * createNode(data_t data)
{
	Node *pNode = (Node *)malloc(sizeof(Node));
	if(NULL == pNode)
	{
		return NULL;
	}
	memset(pNode, 0, sizeof(Node));
	pNode->data = data;
	return pNode;
}

//创建数组
Hash *createHash()
{
	Hash *pHash = (Hash *)malloc(sizeof(Hash));
	if(NULL == pHash)
	{
		return NULL;
	}
	memset(pHash, 0, sizeof(Hash));
	return pHash;
}

//插入信息(头插)
int insertItemHash(Hash *pHash, data_t *pdata)
{
	if(NULL == pHash || NULL == pdata)
	{
		return HASH_ERROR;
	}
	int index = indexpFun(pdata->id);
	Node *pNode = createNode(*pdata);

	pNode->pNext = pHash->hash[index];
	pHash->hash[index] = pNode;
	pHash->count++;
	return HASH_OK;
}

//删除信息
int deleteItemHash(Hash *pHash, data_t *pdata)
{
	if(NULL == pHash || NULL == pdata)
	{
		return HASH_ERROR;
	}

	int index = indexpFun(pdata->id);
	if(NULL == pHash->hash[index])
	{
		return NOT_FOUND;
	}
	else
	{
		Node *pTmp = pHash->hash[index];
		if(0 == strcmp(pTmp->data.id, pdata->id))
		{
			pHash->hash[index] = pTmp->pNext;
			free(pTmp);
			pTmp = NULL;
			pHash->count--;
			return HASH_OK;
		}
	
		Node *pDel = pTmp->pNext;
		while(pDel != NULL)
		{
			if(0 != strcmp(pDel->data.id, pdata->id))
			{
				pTmp->pNext = pDel->pNext;
				free(pDel);
				pDel = NULL;
				pHash->count--;
				return HASH_OK;
			}
			pTmp = pTmp->pNext;
			pDel = pTmp->pNext;
		}
		return NOT_FOUND;
	}
}

//通过ID查找
int searchItemHash(Hash *pHash, data_t *pdata)
{
	if(NULL == pHash || NULL == pdata)
	{
		return HASH_ERROR;
	}
	int index = indexpFun(pdata->id);
	if(NULL == pHash->hash[index])
	{
		return NOT_FOUND;
	}

	Node *pTmp = pHash->hash[index];
	while(pTmp != NULL)
	{
		if(0 == strcmp(pTmp->data.id, pdata->id))
		{
			*pdata = pTmp->data;
			printf("已找到:\n");
			printf("身份证号码:%s 姓名:%s 接种%s针疫苗 是否核酸:%s 手机:%ld\n", pTmp->data.id, pTmp->data.name, pTmp->data.vaccine, pTmp->data.nucleic, pTmp->data.num);
			return HASH_OK;
		}
		pTmp = pTmp->pNext;
	}
	return NOT_FOUND;

}

//修改疫苗接种信息
int updataVaccine(Hash *pHash, data_t *pdata)
{
	if(NULL == pHash || NULL == pdata)
	{
		return HASH_ERROR;
	}

	int index = indexpFun(pdata->id);
	if(NULL == pHash->hash[index])
	{
		return NOT_FOUND;
	}

	Node *pTmp = pHash->hash[index];
	while(pTmp != NULL)
	{
		if(0 == strcmp(pTmp->data.id, pdata->id))
		{
			strcpy(pTmp->data.vaccine, pdata->vaccine);
			return HASH_OK;
		}
		pTmp = pTmp->pNext;
			
	}
	return NOT_FOUND;
}

//修改核酸检测信息
int updataNucleic(Hash *pHash, data_t *pdata)
{
	if(NULL == pHash || NULL == pdata)
	{
		return HASH_ERROR;
	}

	int index = indexpFun(pdata->id);
	if(NULL == pHash->hash[index])
	{
		return NOT_FOUND;
	}

	Node *pTmp = pHash->hash[index];
	while(pTmp != NULL)
	{
		if(0 == strcmp(pTmp->data.id, pdata->id))
		{
			strcpy(pTmp->data.nucleic, pdata->nucleic);
			return HASH_OK;
		}
		pTmp = pTmp->pNext;
			
	}
	return NOT_FOUND;
}

//修改手机号信息
int updataNum(Hash *pHash, data_t *pdata)
{
	if(NULL == pHash || NULL == pdata)
	{
		return HASH_ERROR;
	}

	int index = indexpFun(pdata->id);
	if(NULL == pHash->hash[index])
	{
		return NOT_FOUND;
	}

	Node *pTmp = pHash->hash[index];
	while(pTmp != NULL)
	{
		if(0 == strcmp(pTmp->data.id, pdata->id))
		{
			pTmp->data.num =  pdata->num;
			return HASH_OK;
		}
		pTmp = pTmp->pNext;
			
	}
	return NOT_FOUND;
}

//展示
int showHash(Hash *pHash, data_t *pdata)
{
	if(NULL  == pHash)
	{
		return HASH_ERROR;
	}
	int i;
	for(i = 0; i < SIZE; i++)
	{
		if(NULL == pHash->hash[i])
		{
			continue;
		}
		Node *pTmp = pHash->hash[i];
		while(pTmp != NULL)
		{
			printf("身份证号码:%s 姓名:%s 接种%s针疫苗 是否核酸:%s 手机:%ld\n", pTmp->data.id, pTmp->data.name, pTmp->data.vaccine, pTmp->data.nucleic, pTmp->data.num);
			pTmp = pTmp->pNext;
		}
	}
	return HASH_OK;
}

//展示未进行核酸检测的
int showNoNucleic(Hash *pHash, data_t *pdata)
{
	if(NULL  == pHash)
	{
		return HASH_ERROR;
	}
	int i;
	int num1 = 0;
	for(i = 0; i < SIZE; i++)
	{
		if(NULL == pHash->hash[i])
		{
			continue;
		}
		Node *pTmp = pHash->hash[i];
		while(pTmp != NULL)
		{	
			if(0 == strcmp(pTmp->data.nucleic, "否"))
			{
				printf("身份证号码:%s 姓名:%s 接种%s针疫苗 是否核酸:%s 手机:%ld\n", pTmp->data.id, pTmp->data.name, pTmp->data.vaccine, pTmp->data.nucleic, pTmp->data.num);
				num1++;
			}
			pTmp = pTmp->pNext;
		}
	}
	printf("未做核酸的人数为:%d\n", num1);
	return NOT_FOUND;
}

//展示未接种第三针疫苗的
int showNoVaccine(Hash *pHash, data_t *pdata)
{
	if(NULL == pHash)
	{
		return HASH_ERROR;
	}
	int i;
	int num2 = 0;
	for(i = 0; i < SIZE; i++)
	{
		if(NULL == pHash->hash[i])
		{
			continue;
		}
		Node *pTmp = pHash->hash[i];
		while(pTmp != NULL)
		{	
			if(0 != strcmp(pTmp->data.vaccine, "三"))
			{
				printf("身份证号码:%s 姓名:%s 接种%s针疫苗 是否核酸:%s 手机:%ld\n", pTmp->data.id, pTmp->data.name, pTmp->data.vaccine, pTmp->data.nucleic, pTmp->data.num);
				num2++;
			}
			pTmp = pTmp->pNext;
		}
	}
	printf("未接种第三针疫苗的人数为:%d\n", num2);
	return NOT_FOUND;
}

//释放空间
void destoryHash(Hash **ppHash)
{
	if(NULL == ppHash || *ppHash)
	{
		return;
	}
	int i;
	for(i = 0; i < SIZE; i++)
	{
		if(NULL == (*ppHash)->hash[i])
		{
			continue;
		}
		Node *pDel = (*ppHash)->hash[i];
		while(pDel != NULL)
		{
			(*ppHash)->hash[i] = pDel->pNext;
			free(pDel);
			pDel = (*ppHash)->hash[i];
		}
	}
	free(*ppHash);
	(*ppHash) = NULL;

}

2.函数的声明,结构体, 枚举等 hash.h

#ifndef _HASHPOJ_H
#define _HASHPOJ_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define SIZE 10240



enum HASH_OP
{
	HASH_ERROR = -1,
	HASH_OK = 0,
	NOT_FOUND = 1
};

typedef struct community
{
	char id[20];
	char name[20];
	char vaccine[100];
	char nucleic[100];
	long num;
}data_t;

typedef struct Node
{
	data_t data;
	struct Node *pNext;
}Node;

typedef struct Hash
{
	Node *hash[SIZE];
	int count;
}Hash;

void menu();
Hash *createHash();
int insertItemHash(Hash *pHash, data_t *pdata);
int deleteItemHash(Hash *pHash, data_t *pdata);
int searchItemHash(Hash *pHash, data_t *pdata);
int updataVaccine(Hash *pHash, data_t *pdata);
int updataNucleic(Hash *pHash, data_t *pdata);
int updataNum(Hash *pHash, data_t *pdata);
int showHash(Hash *pHash, data_t *pdata);
int showNoNucleic(Hash *pHash, data_t *pdata);
int showNoVaccine(Hash *pHash, data_t *pdata);
void destoryHash(Hash **ppHash);

#endif

3.主函数:函数的调用,写入文件 main.c

#include "../include/hashpoj.h"


int main(int argc, const char *argv[])
{
	if(argc < 2)
	{
		printf("请输入文件!!!\n");
		return -1;
	}

	int key1 = 123;
	int key2;
	int j;
	for(j = 5; j >= 0; j--)
	{	
		printf("输入密码:");
		scanf("%d", &key2);
		system("clear");
		if(key1 == key2)
		{
			break;
		}
		if(0 == j)
		{
			return -1;
		}
		printf("您还可以输入%d次密码!!!\n", j);
	}

	Hash *pHash = createHash();
	int cmd = 0;
	data_t data;
	int fd = open(argv[1], O_RDWR);
	if(fd > 0)
	{
		while(1)
		{
			int ret = read(fd, &data, sizeof(data_t));
			if(ret < 0)
			{
				perror("read error!!!");
			}
			if(0 == ret)
			{
				break;
			}
			insertItemHash(pHash, &data);
		}
	}
	else if(fd <  0)
	{
		int fd = open(argv[1], O_CREAT | O_TRUNC, 0666);
		if(fd < 0)
		{
			perror("open 2 error!");
			return -1;
		}
	}
	
	while(1)
	{
		menu();
		scanf("%d", &cmd);
		if(0 == cmd)
		{
			break;
		}
		if(11 == cmd)
		{
			system("clear");
		}
		switch(cmd)
		{
			case 1:
				printf("身份证号码00-0000  姓名  接种了(零/一/二/三)疫苗  N天内(是否)核酸  电话\n");
				scanf("%s%s%s%s%ld", data.id, data.name, data.vaccine, data.nucleic, &data.num);
				insertItemHash(pHash, &data);
				break;
			case 2:
				printf("请输入id后六位00-0000:");
				scanf("%s", data.id);
				deleteItemHash(pHash, &data);
				break;
			case 3:
				printf("请输入id后六位00-0000:");
				scanf("%s", data.id);
				int ret7 = searchItemHash(pHash, &data);
				{
					if(NOT_FOUND == ret7)
					{
						printf("没有此ID!\n");
					}
				}
				break;
			case 4:
				printf("请输入id后六位00-0000:");
				scanf("%s", data.id);
				printf("请输入疫苗接种情况:");
				scanf("%s", data.vaccine);
				int ret8 = updataVaccine(pHash, &data);
				{
					if(NOT_FOUND == ret8)
					{
						printf("没有此ID!\n");
						continue;
					}
				}
				printf("修改成功\n");
				break;
			case 5:
				printf("请输入id后六位00-0000:");
				scanf("%s", data.id);
				printf("请输入核酸检测信息:");
				scanf("%s", data.nucleic);
				int ret9 = updataNucleic(pHash, &data);
				{
					if(NOT_FOUND == ret9)
					{
						printf("没有此ID!\n");
						continue;
					}
				}
				printf("修改成功\n");
				break;
			case 6:
				printf("请输入id后六位00-0000:");
				scanf("%s", data.id);
				printf("请输入新的手机号:");
				scanf("%ld", &data.num);
				int ret0 = updataNum(pHash, &data);
				{
					if(NOT_FOUND == ret0)
					{
						printf("没有此ID!\n");
						continue;
					}
				}
				printf("修改成功\n");
				break;
			case 7:
				showHash(pHash, NULL);
				printf("统计人数为:%d\n", pHash->count);
				break;
			case 8:
				showNoNucleic(pHash, NULL);
				break;
			case 9:
				showNoVaccine(pHash, NULL);
				break;
		}
		getchar();
		fd = open(argv[1], O_RDWR | O_TRUNC);
		if(fd < 0)
		{
			perror("open 3 error!");
		}
		else
		{
			int i;
			for(i = 0; i < SIZE; i++)
			{
				if(NULL == pHash->hash[i])
				{
					continue;
				}
				Node *pTmp = pHash->hash[i];
				while(pTmp != NULL)
				{
					int ret1 = write(fd, &pTmp->data, sizeof(data_t));
					if(ret1 < 0)
					{
						perror("write error!");
						return -1;
					}
					pTmp = pTmp->pNext;
				}
				
			}
		}

	}
	close(fd);
	destoryHash(&pHash);
	return 0;
}

遇到的问题:

  1. key值的处理,由于身份证号太长,无论输入还是处理都比较麻烦,所以这里采取身份证号的后六位,如00-0000这种输入类型;
  2. 分类,想不到如何分类,将未做核酸的挑出来,把没打第三针疫苗的挑出来,最后想到只要分类打印就可以实现了,在打印前加入一个判断条件就可以了;
  3. 开是一直为身份证尾号是x的发愁,最后发现我定义的是char类型的, 也可以正常输入输出X。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:36:44  更:2022-09-04 01:39:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 17:02:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码