数据结构的小项目


今天结束了关于数据结构的学习,收获和感触颇多,于是就浅写一下一个简单的项目。
这个项目是关于员工管理系统的,当然哈😂,确实比较简单。欢迎大家的阅读学习,话不多说,start!

一、定义结构体

也就是定义一个储存学生信息的结构体,结构体信息的大体如下:

  1. 学生的姓名

  2. 学生的学号

  3. 学生的年龄

  4. 学生的年级(先定义这么多,还有啥可以自己加)

#define N 20

typedef struct data
{
    char name[N]
	int stunum;
	int year;
	char Class[N];	
}data_type;

二、定义我们储存方式

我采用的是哈希的方式

typedef struct link
{
	data_type data;
	struct link *pNext;
}Link;

typedef struct hash
{
	Link *pArr[M];
	int count;
	int lastct;
}Hash;

三、功能实现

定义完毕后就要开始功能的书写了,开始之前我先介绍下要实现的功能:

  1. 创建哈希表的功能
  2. 哈希函数
  3. 学生信息输入的功能
  4. 显示学生信息的功能
  5. 学生信息删除的功能
  6. 学生信息查询的功能
  7. 学生信息修改的功能
  8. 销毁哈希表

1.创建哈希表

Hash *createHash(void)
{
	Hash *pHash = (Hash *)malloc(sizeof(Hash));
	if(NULL == pHash)
	{
		return NULL;
	}
	memset(pHash,0,sizeof(Hash));
	return pHash;
}

2.哈希函数

int hashFun(int key)
{
	return key-1;
}

3. 学生信息输入

int insertHash(Hash *pHash,data_type item)
{
	if(NULL == pHash)
	{
		return NULLERROR;
	}
	Link *pNew = (Link *)malloc(sizeof(Link));
	memset(pNew,0,sizeof(Link));
	pNew->data = item;
	int pos = hashFun(item.stunum);
	pNew->pNext = pHash->pArr[pos];
	pHash->pArr[pos] = pNew;
	pHash->count++;
	return OK;
}

4.学生信息显示

int showHash(Hash *pHash)
{
	if(NULL == pHash)
	{
		return NULLERROR;
	}
	int i;
	Link *pFind = NULL;
	for(i=0;i<pHash->lastct;i++)
	{
		pFind = pHash->pArr[i];
		while(pFind != NULL)
		{
			printf("*****************************\n");
			printf("学生姓名:%d\n",pFind->data.name);
			printf("学号:%d\n",pFind->data.stunum);
			printf("年龄:%d\n",pFind->data.year);
			printf("年级:%s\n",pFind->data.Class);
			printf("*****************************\n");
			pFind = pFind->pNext;
		}
	}
	return OK;
}

5.学生信息删除

我们默认学生信息遭到删除时,就是学生毕业的时候。

int deleteHash(Hash *pHash,int stunum)
{
	if(NULL == pHash)
	{
		return NULLERROR;
	}
	if(num < 0 || num > pHash->lastct)
	{
		return NUMERROR;
	}
	Link *pDel = NULL;
	int pos = hashFun(stunum);
	pDel = pHash->pArr[pos];
	if(NULL == pDel)
	{
		return NOBODY;
	}
	while(pDel != NULL)
	{
		if(pDel->data.stunum == stunum)
		{
			strcpy(pDel->data.state,"毕业");
		}
		pDel = pDel->pNext;
	}
	return OK;
}

6.学生信息查询

int searchHash(Hash *pHash,int stunum,data_type *Data)
{
	if(NULL == pHash)
	{
		return NULLERROR;
	}
	if(num <0 || num > pHash->lastct)
	{
		return NUMERROR;
	}
	int pos = hashFun(stunum);
	Link *pFind = NULL;
	pFind = pHash->pArr[pos];
	if(NULL == pFind)
	{
		return NOBODY;
	}
	while(pFind != NULL)
	{
		if(num == pFind->data.num)
		{
			printf("\t*****************************\n");
			printf("姓名:%s\n",pFind->data.name);
			printf("学号:%d\n",pFind->data.stunum);
			printf("年龄:%d\n",pFind->data.year);
			printf("年纪:%s\n",pFind->data.Class);
			printf("*****************************\n");
			*Data = pFind->data;
			break;
		}
		else
		{
			pFind = pFind->pNext;
		}
	}
	return OK;
}

7.学生信息修改

int alterHash(Hash *pHash,int num,data_type item)
{
	if(NULL == pHash)
	{
		return NULLERROR;
	}
	int pos = hashFun(num);
	Link *pAlter = NULL;
	pAlter = pHash->pArr[pos];
	while(pAlter != NULL)
	{
		if(num == pAlter->data.num)
		{
			pAlter->data = item;
			break;
		}
		else
		{
			pAlter = pAlter->pNext;
		}
	}
	return OK;
}

8.销毁哈希表

int destroyHash(Hash **pHash)
{
	if(NULL == *pHash)
	{
		return NULLERROR;
	}
	Link *pDes = NULL;
	Link *pDel = NULL;
	int i;
	for(i=0;i<(*pHash)->lastct;i++)
	{
		pDel = (*pHash)->pArr[i];
		while(NULL != pDes)
		{	
			pDes = pDel;
			pDel = pDel->pNext;
			free(pDes);
			pDes = NULL;
		}
	}
	free(*pHash);
	*pHash = NULL;
	return OK;
}

三、一些头文件以及主函数

1.头文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define N 20
#define M 10

2.main函数

int main()
{
	int op,i=0,stunum = 0;
	data_type item;
	data_type messagedata;
	Hash *pHash = createHash();
	int fr = open("message.txt",O_RDONLY | O_CREAT,0664);
	if(fr < 0)
	{
		perror("open error!\n");
		return -1;
	}
	while(1)
	{
		int rd_count = read(fr,&messagedata,sizeof(data_type));
		if(0 == rd_count)
		{
			printf("\t读取完毕!\n");
			break;
		}else if(0 > rd_count)
		{
			printf("读取失败!\n");
			return ERROR;
		}
		else
		{
			insertHash(pHash,messagedata);
			pHash->lastct++;
		}
	}
	close(fr);
	while(1)
	{
		printf("**********学生管理系统**********\n");
		printf("1-------------------存入学生信息\n");
		printf("2-------------------查看学生信息\n");
		printf("3-------------------删除学生信息\n");
		printf("4-------------------查询学生信息\n");
		printf("5-------------------修改学生信息\n");
		printf("-1----------------------退出系统\n");
		printf("********************************\n");
		printf("请输入操作:");
		scanf("%d",&op);
		if(-1 == op)
		{
			printf("\t退出系统成功!\n");
			break;
		}
		switch(op)
		{
			case 1:
				printf("\t请输入姓名:\n");
				scanf("%d",&item.name); 
				++pHash->lastct;
				printf("请输入年龄:\n");
				scanf("%d",&item.year);
				printf("请输入年级:\n");
				scanf("%s",item.Class);
				insertHash(pHash,item);
				break;
			case 2:
				showHash(pHash);
				break;
			case 3:
				printf("\t请输入要报备的机号:\n");
				scanf("%d",&stunum);
				deleteHash(pHash,atunum);
				break;
			case 4:
				printf("\t请输入要查询的学号:\n");
				scanf("%d",&stunum);
				searchHash(pHash,stunum,&item);
				if(NULL == item.Class)
				{
					printf("未查找到\n");
				}
				break;
			case 5:
				printf("\t请输入要修改的姓名:\n");
				scanf("%s",item.name);
				printf("\t请输入要修改的学号:\n");
				scanf("%d",&item.stunum);
				printf("请输入要修改年龄:\n");
				scanf("%d",item.year);
				printf("请输入要修改的年级:\n");
				scanf("%s",item.Class);
				alterHash(pHash,num,item);
				break;
		}
	}
	int fw = open("message.txt",O_WRONLY);
	if(fw < 0)
	{
		perror("open error!\n");
		return ERROR;
	}
	for(i=0;i<pHash->lastct;i++)
	{	
		Link *pFind = NULL;
		pFind = pHash->pArr[i];
		while(pFind != NULL)
		{
			int wr_count = write(fw,&pFind->data,sizeof(data_type));
			if(-1 == wr_count)
			{
				perror("写入失败!\n");
				return ERROR;
			}
			pFind = pFind->pNext;
		}
	}
	close(fw);
	destroyHash(&pHash);
	return 0;
}

最后

好了,这就是项目的全部内容了,这个项目只是最基础性的,它的改动和优化还有很大的进步空间,我也会不断的进行完善,感谢大家的阅读!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值