c语言数据结构项目——基于Hash表的人员管理系统

目录

功能目录 

主函数

.h文件

功能实现

1.创建hash表

2.定义hash函数

3.添加功能

4.根据ID查找

5.显示所有人员

6.根据ID删除人员

7.根据ID修改人员信息

8.销毁hash表

9.从txt文件加载人员信息

10.将人员信息保存到txt文件中

功能演示

1.添加

2.显示

 3.根据ID查找

4.根据ID删除

5.根据ID修改人员信息

功能目录 

主函数

#include "../include/info.h"

int main()
{
    int op = 0;
    data_type item;
    Hash *pHash = createHash();
	load(pHash,"info.txt");
    while (1)
    {
        menu();
		int res=0;
        scanf("%d", &op);
        if (op == 0)
            break;
        switch (op)
        {
        case 1:
            printf("请输入人员ID:\n");
            scanf("%d", &item.id);
            printf("请输入人员姓名:\n");
            scanf("%s", item.name);
            printf("请输入人员年龄:\n");
            scanf("%d", &item.age);
            printf("请输入人员职位:\n");
            scanf("%s", item.status);
            res=add(pHash, item);
			if(res==OK)
			{
				printf("-----------------------------------------\n");
				printf("添加成功!\n");
				printf("-----------------------------------------\n");
			}
            break;
        case 2:
            show(pHash);
            break;
		case 3:
			printf("请输入要查找人员的ID:\n");
			scanf("%d",&item.id);
		    res=find(pHash,item);
			if(res!=OK)
			{
				printf("-----------------------------------------\n");
				printf("没有ID为%d的人员!\n",item.id);
				printf("-----------------------------------------\n");
			}
			break;
		case 4:
			printf("请输入要删除人员的ID:\n");
			scanf("%d",&item.id);
			del(pHash,item);
			break;
		case 5:
			printf("请输入要修改人员的ID:\n");
			scanf("%d",&item.id);
			res=change(pHash,item);
			if(res==OK)
			{
				printf("-----------------------------------------\n");
				printf("ID为%d的人员修改信息成功!\n",item.id);
				printf("-----------------------------------------\n");
			}
			break;
		case 6:
			res=Destroy(&pHash);
			if(res==OK)
			{
				printf("-----------------------------------------\n");
				printf("销毁成功!\n");
				printf("-----------------------------------------\n");
			}
			break;
		case 7:
			res=save(pHash,"info.txt");
			if(res==OK)
			{
				printf("-----------------------------------------\n");
				printf("保存成功!\n");
				printf("-----------------------------------------\n");
			}
			break;
        }
    }
}

.h文件

#ifndef _INFO_H
#define _INFO_H

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

#define SIZE 30


typedef struct info
{
    int id; // key
    char name[SIZE];
    int age;
    char status[SIZE];
} data_type;

typedef struct node
{
    data_type data;
    struct node *next;
} Node;

typedef struct hash
{
    Node *pArr[SIZE];
    int count;
} Hash;
enum opt
{
    OPENERROR = -7,
	ERROR,
    DOWNLOADERROR,
    UPLOOADERROR,
    EXIST,
    NOEXIST,
    MALLOCERROR,
    OK
};
void menu();
Hash *createHash();
int HashFunc(int key);
int show(Hash *pHash);
int add(Hash *pHash, data_type pData);
int find(Hash *pHash, data_type pData);
int del(Hash *pHash, data_type pData);
int change(Hash *pHash,data_type pData);
int Destroy(Hash **pHash);
int namefind(Hash *pHash,data_type pData);
int save(Hash *pHash,char *filename);
int load(Hash *pHash,char *filename);
#endif

功能实现

1.创建hash表

//创建一个hash表
Hash *createHash()
{
    Hash *pHash = NULL;
    pHash = (Hash *)malloc(sizeof(Hash));
    if (NULL == pHash)
    {
        perror("malloc error");
        return NULL;
    }
    memset(pHash, 0, sizeof(Hash));
    return pHash;
}

2.定义hash函数

//hash函数
int HashFunc(int key)
{
		int pos;
		pos=key%13;
		return pos;
}

3.添加功能

//添加
int add(Hash *pHash, data_type pData)
{
    if (pHash == NULL)
    {
		perror("malloc error");
        return NOEXIST;
    }
	int res=0;
	res=find(pHash,pData);
    //当前数据元素是否已经存在
	if ( res==OK )
    {
		printf("-----------------------------------------\n");
  	  	printf("该ID对应人员已存在!\n");
		printf("-----------------------------------------\n");
        return EXIST;
    }
    //创建一个新结点
    Node *pNew = NULL;
    pNew = (Node *)malloc(sizeof(Node));
    if (NULL == pNew)
    {
        perror("malloc error");
        return MALLOCERROR;
    }
    //memset(pNew, 0, sizeof(Node));
    pNew->data = pData;
    int pos = HashFunc(pData.id);
    //保护好后面的结点
    pNew->next = pHash->pArr[pos];
    pHash->pArr[pos] = pNew;
    
    return OK;
}

4.根据ID查找

int find(Hash *pHash, data_type pData)
{
	if (NULL == pHash)
	{
		perror("malloc error");
		return NOEXIST;
	}
	int pos = HashFunc(pData.id);
	Node *pTmp = NULL;
	pTmp = pHash->pArr[pos];
	if (NULL == pTmp)
	{
		return NOEXIST;
	}
	while (pTmp != NULL)
	{
		if (pData.id == pTmp->data.id)
		{
			printf("ID为%d的人员信息如下:\n", pData.id);
			printf("-----------------------------------------\n");
			printf("ID:%d    ", pTmp->data.id);
			printf("姓名:%s    ", pTmp->data.name);
			printf("年龄:%d    ", pTmp->data.age);
			printf("职位:%s\n", pTmp->data.status);
			printf("-----------------------------------------\n");
			return OK;
		}
	}
}

5.显示所有人员

int show(Hash *pHash)
{
	if (NULL == pHash)
	{
		perror("malloc error");
		return MALLOCERROR;
	}
	//遍历输出
	int i = 0;
	Node *pTmp = NULL;
	for (i = 0; i < SIZE; i++)
	{
		//结构体指针指向链表首地址
		pTmp = pHash->pArr[i];
		while (pTmp != NULL)
		{
			printf("-----------------------------------------\n");
			printf("ID:%d    ", pTmp->data.id);
			printf("姓名:%s    ", pTmp->data.name);
			printf("年龄:%d    ", pTmp->data.age);
			printf("职位:%s\n", pTmp->data.status);
			printf("-----------------------------------------\n");
			pTmp = pTmp->next;
		}
	}
	return OK;
}

6.根据ID删除人员

int del(Hash *pHash, data_type pData)
{
	if (NULL == pHash)
	{
		perror("malloc error");
		return MALLOCERROR;
	}
	int res = 0;
	res = find(pHash, pData);
	if (res != OK)
	{

		printf("-----------------------------------------\n");
		printf("没有该ID为%d的人员!\n", pData.id);
		printf("-----------------------------------------\n");
		return ERROR;
	}
	if (pData.id < 0)
	{
		return ERROR;
	}
	int pos = HashFunc(pData.id);
	Node *pTmp = NULL;
	pTmp = pHash->pArr[pos];
	Node *pPre = pTmp;
	Node *pDel = pTmp->next;
	if (pData.id = pPre->data.id)
	{
		pDel = pPre;
		pHash->pArr[pos] = pPre->next;
		printf("-----------------------------------------\n");
		printf("删除成功!\n");
		printf("-----------------------------------------\n");
		free(pDel);
		pHash->count--;
		return OK;
	}
	else
	{
		while (NULL != pDel)
			if (pData.id == pDel->data.id)
			{
				pPre->next = pDel->next;
				printf("-----------------------------------------\n");
				printf("删除成功!删除人员信息如下:\n");
				printf("ID:%d    ", pTmp->data.id);
				printf("姓名:%s    ", pTmp->data.name);
				printf("年龄:%d    ", pTmp->data.age);
				printf("职位:%s\n", pTmp->data.status);
				printf("-----------------------------------------\n");
				free(pDel);
				return OK;
			}
			else
			{
				pPre = pDel;
				pDel = pDel->next;
			}
	}
	if (NULL == pDel)
	{
		printf("-----------------------------------------\n");
		printf("此ID对应人员信息不存在\n");
		printf("-----------------------------------------\n");
	}
	return OK;
}

7.根据ID修改人员信息

int change(Hash *pHash, data_type pData)
{
	if (NULL == pHash)
	{
		perror("malloc error");
		return MALLOCERROR;
	}
	if (pData.id < 0)
	{
		return ERROR;
	}
	int res = 0;
	res = find(pHash, pData);
	if (res != OK)
	{
		printf("-----------------------------------------\n");
		printf("没有该ID为%d的人员!\n", pData.id);
		printf("-----------------------------------------\n");
		return ERROR;
	}
	int pos = HashFunc(pData.id);
	Node *pTmp = NULL;
	pTmp = pHash->pArr[pos];
	while (pTmp->data.id != pData.id)
	{
		pTmp = pTmp->next;
	}
	printf("请输入ID为%d的人员修改后的名字:\n", pData.id);
	scanf("%s", pTmp->data.name);
	printf("请输入ID为%d的人员修改后的年龄:\n", pData.id);
	scanf("%d", &pTmp->data.age);
	printf("请输入ID为%d的人员修改后的职位:\n", pData.id);
	scanf("%s", pTmp->data.status);
	return OK;
}

8.销毁hash表

int Destroy(Hash **pHash)
{
	if (NULL == pHash)
	{
		return ERROR;
		printf("-----------------------------------------\n");
		printf("销毁成功!\n");
		printf("-----------------------------------------\n");
	}
	int i;
	Node *pDel = NULL;
	Node *pTmp = NULL;
	for (i = 0; i < SIZE; i++)
	{
		pTmp = (*pHash)->pArr[i];
		while (pTmp != NULL)
		{
			//头删法
			pDel = pTmp;
			pTmp = pTmp->next;
			free(pDel);
			pDel = NULL;
		}
	}
	free(*pHash);
	*pHash = NULL;
	return OK;
}

9.从txt文件加载人员信息

int load(Hash *pHash, char *filename)
{
	data_type infodata;
	if (pHash == NULL)
	{
		perror("malloc error");
		return ERROR;
	}
	int fp = open(filename, O_RDONLY);
	if (fp < 0)
	{
		perror("open error");
		return ERROR;
	}
	while (1)
	{
		int res = read(fp, &infodata, sizeof(data_type));
		if (0 == res)
		{
			printf("信息已导入!\n");
			break;
		}
		else if (res < 0)
		{
			printf("导入失败!\n");
			return ERROR;
		}
		else
		{
			add(pHash, infodata);
			pHash->count++;
		}
	}
	close(fp);
	return OK;
}

10.将人员信息保存到txt文件中

int save(Hash *pHash, char *filename)
{
	int fw = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0777);
	if (fw < 0)
	{
		perror("open error");
		return ERROR;
	}
	int i;
	for (i = 0; i < SIZE; i++)
	{
		Node *pTmp = pHash->pArr[i];
		while (pTmp != NULL)
		{
			// memset(&pTmp->data,0,sizeof(data_type));
			//写入
			int res = write(fw, &pTmp->data, sizeof(data_type));
			if (res < 0)
			{
				printf("save error");
			}
			else if (0 == res)
			{
				printf("save error");
				break;
			}
			pTmp = pTmp->next;
		}
	}
	close(fw);
	return OK;
}

功能演示

1.添加

 

2.显示

 3.根据ID查找

4.根据ID删除

5.根据ID修改人员信息

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值