社区新冠疫情防控管理系统
项目背景:
基于疫情的久久不退散,以及每日核酸的背景之下,社区疫情防控十分严峻。
功能 :登记社区居民是否进行了核算检测,统计社区居民的疫苗接种情况;并方便管理员查看并及时更新;(添加信息,更改信息, 删除信息,查找信息,分类打印)
选择的数据结构:
哈希表
原因:因为主要是登记每个住户是否接种疫苗,或者是否进行了核酸检测,查找写入的方面比较多,而哈希表的查找很快,同时社区的人口比较多,而链表的大小是不限的。
步骤:
- 定义每个住户的信息的结构体:
包括住户身份证号码后六位,姓名,年龄,是否接种第一针疫苗,第二针, 第三针, 三日内是否进行核酸检测,电话号码。此处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;
- 定义一个链表用来存储数据
Struct node
{
Data_T data;
Node *pNext;
}
3.定义一个数组
Struct Hash
{
Node *hash[SIze]
Int count;
};
3.实现对信息进行增删改查,更新,分类打印等等。
注意:数组的下标处理方法 ,身份证号码输入格式为11-1111
把’\0’的值赋给’-’,将字符分为两部分,并相加作为数组下标index。
4.具体函数实现过程:
- 定义写入数据:
因为是链表,所以采取头插比较方便高效;
Int interItemHash(Hash * pHash, data_t *pdata)
pNode->pNext = pHash->hash[index];
pHash->hash[index] = pNode;
- 删除信息
通过身份证号码的后六位找到该居民,并且对其信息进行删除;
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;
}
- 查找信息:
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
}
- 通过write将信息写入文件,再通过read读出信息,并且将读到的数据插入链表;
//判断文件是否存在
存在,读文件,将都的内容插入哈希表;
不存在,创建文件,将哈希表的数据写入文件;
- 写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;
}
遇到的问题:
- key值的处理,由于身份证号太长,无论输入还是处理都比较麻烦,所以这里采取身份证号的后六位,如00-0000这种输入类型;
- 分类,想不到如何分类,将未做核酸的挑出来,把没打第三针疫苗的挑出来,最后想到只要分类打印就可以实现了,在打印前加入一个判断条件就可以了;
- 开是一直为身份证尾号是x的发愁,最后发现我定义的是char类型的, 也可以正常输入输出X。
|