数据结构小项目
今天结束了关于数据结构的学习,收获和感触颇多,于是就浅写一下一个简单的项目。
这个项目是关于员工管理系统的,当然哈😂,确实比较简单。欢迎大家的阅读学习,话不多说,start!
一、定义结构体
也就是定义一个储存学生信息的结构体,结构体信息的大体如下:
-
学生的姓名
-
学生的学号
-
学生的年龄
-
学生的年级(先定义这么多,还有啥可以自己加)
#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.创建哈希表
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;
}
最后
好了,这就是项目的全部内容了,这个项目只是最基础性的,它的改动和优化还有很大的进步空间,我也会不断的进行完善,感谢大家的阅读!!!