基于C语言实现车辆管理系统
目录
该项目是基于C语言实现的一个简单的车辆管理系统,实现了车辆信息的增、删、改、查等功能,里面利用了C语言和数据结构的知识,项目中还可增加新功能,后续会更新。
项目说明
项目名称:车辆管理系统
项目背景:现如今,随着汽车数量的不断增加,很多地方因为车辆管理方法还比较落后,会专门招聘车辆管理人员将车辆信息进行统计并记录在册,很不方便。该管理系统就是为了解决此类问题而设计的。
项目功能:
实现了车辆信息(如:车辆的名称,车辆的编号,车辆的动力,车辆的价格,车辆的状态,车辆的型号,车辆的厂商,车辆的颜色)的增、删、改、查。
功能目录
代码实现
此项目是利用hash实现的车辆信息的增删改查,车辆的信息是利用结构体进行封装的,方便后续功能的增加或者删除。
头文件
#ifndef _CAR_H
#define _CAR_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 50
定义hash函数
//定义元素的类型
typedef struct car
{
char name[30];//车名
int num;//汽车的编号
char power[10];//汽车的动力
int price;//汽车的价格
char status[20];//汽车的状态
char xh[10];//型号
char cs[10];//厂商
char color[10];//颜色
}data_type;
//定义链表节点的数据类型
typedef struct linkNode
{
data_type data;
struct linkNode *pNext;
}Link;
//定义hash的数据类型
typedef struct hash
{
Link *pArr[SIZE];//结构体类型的指针数组,存放size个Link *类型的指针
int count;//汽车的数量
int lastNum;//最后一辆车的编号
}Hash;
定义枚举
enum res
{
HASH_NULL=-3,
MALLOC_ERR,
NOCAR,
OK
};
函数声明
创建hash表
//创建一个hashOC表
//参数:空
//返回值:成功返回hash表首地址,失败返回NULL
Hash *createHash(void);
创建hash函数
//创建Hash函数
//参数:key
//返回值:返回key-1;
int hashFun(int key);
插入元素
//插入元素
int insertHash(Hash *pHash,data_type item);
显示信息
//显示
//参数:hash表头
//返回值:成功返回OK。失败返回失败原因
int showHash(Hash *pHash);
删除信息
//删除
//参数hash头,要删除的车辆的编号
//返回值:成功返回OK,失败返回失败原因
int deleteHash(Hash *pHash,int num);
修改信息
//修改
//参数:hash表头,修改车辆的编号
//成功返回OK,失败返回失败原因
int alterHash(Hash *pHash,data_type NewData);
查找信息
//查找
//参数:hash表头,要查找的车辆的编号,保存要查找的数据
//返回值:成功返回OK,失败返回失败原因
int searchHash(Hash *pHash,int num,data_type *pData);
销毁hash表
//销毁
//参数:hash
//成功返回OK,失败返回失败原因
int destoryHash(Hash **pHash);
主函数
将车辆的所有信息存放到文件中,方便后续的查看与调用。
首先是对文件的操作,此处是以只读的方式先打开文件,如果文件必须先存在,如果不存在,请先在该目录下新建文件(touch message.txt即可新建一个名为message.txt文件)。
//打开文件
int fr=open("Message.txt",O_RDONLY);
if(fr <0)
{
perror("open err");
return -1;
}
//操作文件
data_type MessageData;
while(1)
{
int rd_count = read(fr,&MessageData,sizeof(data_type));
if(0 == rd_count)
{
printf("倒入信息完毕n");
break;
}
else if(rd_count<0)
{
printf("倒入失败n");
return -1;
}
else
{
insertHash(pHash,MessageData);
pHash->lastNum++;
}
}
//关闭文件
close(fr);
文件打开后要将数据写入到文件中,下面问写入数据到文件的代码
//打开文件
int fw=open("Message.txt",O_WRONLY | O_CREAT,0666);
if(fw<0)
{
perror("open err");
return -1;
}
//操作文件
int i;
for(i=0;i<pHash->lastNum;i++)
{
Link *pFind=pHash->pArr[i];
while(pFind != NULL)
{
int fw_count = write(fw,&pFind->data,sizeof(data_type));
if(fw_count == 0)
{
printf("倒入失败n");
break;
}
else if(fw_count <0)
{
printf("倒入失败n");
break;
}
pFind=pFind->pNext;
}
}
//关闭文件
close(fw);
菜单
printf("***************车辆管理系统*********************n");
printf("1tt插入n");
printf("2tt显示n");
printf("3tt删除n");
printf("4tt修改n");
printf("5tt查找n");
printf("-1tt退出n");
printf("***************请输入你的选择*******************n");
printf("************************************************n");
插入信息到hash表中
//插入
printf("请输入你要插入车辆的名称:n");
scanf("%s",item.name);
item.num=pHash->lastNum+1;
pHash->lastNum++;
printf("请输入你要插入车辆的动力:n");
scanf("%s",item.power);
printf("请输入你要插入车辆的价格:n");
scanf("%d",&item.price);
printf("请输入你要插入车辆的状态:n");
scanf("%s",item.status);
printf("请输入你要插入的车辆的型号n");
scanf("%s",item.xh);
printf("请输入你要插入的车辆的厂商n");
scanf("%s",item.cs);
printf("请输入你要插入的车辆的颜色n");
scanf("%s",item.color);
insertHash(pHash,item);
显示
//显示
showHash(pHash);
删除
printf("请输入你要删除的车辆的编号n");
scanf("%d",&num);
deleteHash(pHash,num);
printf("删除成功,已将信息修改n");
修改
printf("请输入你修改的车辆的名称:n");
scanf("%s",item.name);
printf("请输入你要修改车辆的编号:n");
scanf("%d",&item.num);
printf("请输入你要修改车辆的动力:n");
scanf("%s",item.power);
printf("请输入你要修改车辆的价格:n");
scanf("%d",&item.price);
printf("请输入你要修改车辆的状态:n");
scanf("%s",item.status);
printf("请输入你要修改车辆的型号:n");
scanf("%s",item.xh);
printf("请输入你要修改车辆的厂商:n");
scanf("%s",item.cs);
printf("请输入你要修改车辆的颜色:n");
scanf("%s",item.color);
alterHash(pHash,item);
查找
//查找
printf("请输入你要查找的车辆的编号n");
scanf("%d",&num);
searchHash(pHash,num,NULL);
main函数整体代码
#include "../include/car.h"
int main(void)
{
int op=0;
int num=0;
data_type item;
Hash *pHash=createHash();
do
{
printf("tt *车辆管理系统*n");
printf("tt===================================================n");
printf("tt 欢迎使用车辆管理系统n");
printf("tt 按1进入系统菜单n");
printf("tt 按2推出系统n");
scanf("%d",&op);
if(op==1)
break;
else if(op == 2)
exit(0);
}
while(1);
//打开文件
int fr=open("Message.txt",O_RDONLY);
if(fr <0)
{
perror("open err");
return -1;
}
//操作文件
data_type MessageData;
while(1)
{
int rd_count = read(fr,&MessageData,sizeof(data_type));
if(0 == rd_count)
{
printf("倒入信息完毕n");
break;
}
else if(rd_count<0)
{
printf("倒入失败n");
return -1;
}
else
{
insertHash(pHash,MessageData);
pHash->lastNum++;
}
}
//关闭文件
close(fr);
while(1)
{
printf("***************车辆管理系统*********************n");
printf("1tt插入n");
printf("2tt显示n");
printf("3tt删除n");
printf("4tt修改n");
printf("5tt查找n");
printf("-1tt退出n");
printf("***************请输入你的选择*******************n");
printf("************************************************n");
scanf("%d",&op);
if(-1 == op)
{
break;
}
switch(op)
{
case 1:
{
//插入
printf("请输入你要插入车辆的名称:n");
scanf("%s",item.name);
item.num=pHash->lastNum+1;
pHash->lastNum++;
printf("请输入你要插入车辆的动力:n");
scanf("%s",item.power);
printf("请输入你要插入车辆的价格:n");
scanf("%d",&item.price);
printf("请输入你要插入车辆的状态:n");
scanf("%s",item.status);
printf("请输入你要插入的车辆的型号n");
scanf("%s",item.xh);
printf("请输入你要插入的车辆的厂商n");
scanf("%s",item.cs);
printf("请输入你要插入的车辆的颜色n");
scanf("%s",item.color);
insertHash(pHash,item);
break;
}
case 2:
{
//显示
showHash(pHash);
break;
}
case 3:
{
//删除
printf("请输入你要删除的车辆的编号n");
scanf("%d",&num);
deleteHash(pHash,num);
printf("删除成功,已将信息修改n");
break;
}
case 4:
{
//修改
printf("请输入你修改的车辆的名称:n");
scanf("%s",item.name);
printf("请输入你要修改车辆的编号:n");
scanf("%d",&item.num);
printf("请输入你要修改车辆的动力:n");
scanf("%s",item.power);
printf("请输入你要修改车辆的价格:n");
scanf("%d",&item.price);
printf("请输入你要修改车辆的状态:n");
scanf("%s",item.status);
printf("请输入你要修改车辆的型号:n");
scanf("%s",item.xh);
printf("请输入你要修改车辆的厂商:n");
scanf("%s",item.cs);
printf("请输入你要修改车辆的颜色:n");
scanf("%s",item.color);
alterHash(pHash,item);
break;
}
case 5:
{
//查找
printf("请输入你要查找的车辆的编号n");
scanf("%d",&num);
searchHash(pHash,num,NULL);
break;
}
}
}
//打开文件
int fw=open("Message.txt",O_WRONLY | O_CREAT,0666);
if(fw<0)
{
perror("open err");
return -1;
}
//操作文件
int i;
for(i=0;i<pHash->lastNum;i++)
{
Link *pFind=pHash->pArr[i];
while(pFind != NULL)
{
int fw_count = write(fw,&pFind->data,sizeof(data_type));
if(fw_count == 0)
{
printf("倒入失败n");
break;
}
else if(fw_count <0)
{
printf("倒入失败n");
break;
}
pFind=pFind->pNext;
}
}
//关闭文件
close(fw);
//释放
printf("释放前:%pn",pHash);
destoryHash(&pHash);
printf("释放后:%pn",pHash);
return 0;
}
函数功能的实现
创建hash表
//创建一个hash表
//参数:void
//返回值:成功返回hash表的首地址,失败返回失败原因
Hash *createHash(void)
{
Hash *pHash=NULL;
pHash=(Hash *)malloc(sizeof(Hash));
if(NULL == pHash)
{
perror("malloc err");
return NULL;
}
memset(pHash,0,sizeof(Hash));
return pHash;
}
创建hash函数
//创建hash函数
int hashFun(int key)
{
return key-1;
}
插入元素
//插入元素
//参数:hash表头,插入的元素
//返回值:成功返回OK,失败返回失败原因
int insertHash(Hash *pHash,data_type item)
{
//入参判断
if(NULL == pHash)
{
return HASH_NULL;
}
//创建一个新节点
Link *pNew = (Link *)malloc(sizeof(Link));
if(NULL == pNew)
{
perror("malloc err");
return MALLOC_ERR;
}
memset(pNew,0,sizeof(Link));
pNew->data=item;
//通过hash函数得到要存储的下标
int pos=hashFun(item.num);
//保护号要插入节点后的所有节点
pNew->pNext=pHash->pArr[pos];
//插入新节点
pHash->pArr[pos]=pNew;
//count++;
pHash->count++;
return OK;
}
显示车辆信息
//显示
//参数:hash头
//返回值:成功返回OK。失败返回失败原因
int showHash(Hash *pHash)
{
if(NULL == pHash)
{
return HASH_NULL;
}
int i=0;
Link *pFind=NULL;
printf("车名t");
printf("编号t");
printf("动力t");
printf("价格t");
printf("状态t");
printf("型号t");
printf("厂商t");
printf("颜色t");
printf("n");
for(i=0;i<pHash->lastNum;i++)
{
pFind=pHash->pArr[i];
while(pFind != NULL)
{
printf("%st",pFind->data.name);
printf("%dt",pFind->data.num);
printf("%st",pFind->data.power);
printf("%dt",pFind->data.price);
printf("%st",pFind->data.status);
printf("%st",pFind->data.xh);
printf("%st",pFind->data.cs);
printf("%st",pFind->data.color);
pFind=pFind->pNext;
}
printf("n");
}
return OK;
}
删除车辆信息
//删除
//参数:hash表头,要删除的车辆的编号
//返回值:成功返回OK,失败返回失败原因
int deleteHash(Hash *pHash,int num)
{
//入参判断
if(NULL == pHash)
{
return HASH_NULL;
}
if(num < 0 || num > pHash->lastNum)
{
return NOCAR;
}
//通过Hash函数找到要删除的下标
int pos=hashFun(num);
//定义一个指针,指向链表的头节点
Link *pFind=pHash->pArr[pos];
if(NULL == pFind)
{
return NOCAR;
}
while(pFind != NULL)
{
if(pFind->data.num == num)
{
//更改车辆状态信息
pHash->count--;
strcpy(pFind->data.status,"已卖出");
break;
}
pFind=pFind->pNext;
}
return OK;
}
修改车辆信息
//修改
//参数:hash表头,修改的车辆信息
//返回值:成功返回OK,失败返回失败原因
int alterHash(Hash *pHash,data_type NewData)
{
//入参判断
if(NULL == pHash)
{
return HASH_NULL;
}
//根据车辆的编号找到要修改的车辆的信息
//根据hash函数找到要修改车辆的下标
int pos=hashFun(NewData.num);
//定义一个指针,初始化为链表的首节点
Link *pFind = pHash->pArr[pos];
//判断该指针是否为空,为空,则该位置无节点,不为空,则遍历,找到所要修改的车辆的编号,在将信息进行修改
if(NULL == pFind)
{
return NOCAR;
}
while(pFind != NULL)
{
if(pFind->data.num == NewData.num)
{
pFind->data=NewData;
}
pFind = pFind->pNext;
}
return OK;
}
查找
//查找
//参数:hash表头,要查找的车辆的编号,保存要查找的数据
//返回值:成功返回OK,失败返回失败原因
int searchHash(Hash *pHash,int num,data_type *pData)
{
//入参判断
if(NULL == pHash)
{
return HASH_NULL;
}
if(num < 0 || num > pHash->lastNum)
{
return NOCAR;
}
//根据车辆的编号找到要修改的车辆的信息
//根据hash函数找到要修改车辆的下标
int pos=hashFun(num);
//定义一个指针,初始化为链表的首节点
Link *pFind = pHash->pArr[pos];
//判断该指针是否为空,为空,则该位置无节点,不为空,则遍历,找到与输入编号相同的车辆信息,然后打印其信息
if(NULL == pFind)
{
return NOCAR;
}
while(pFind != NULL)
{
if(pFind->data.num == num)
{
printf("%st",pFind->data.name);
printf("%dt",pFind->data.num);
printf("%st",pFind->data.power);
printf("%dt",pFind->data.price);
printf("%st",pFind->data.status);
printf("%st",pFind->data.xh);
printf("%st",pFind->data.cs);
printf("%st",pFind->data.color);
pFind=pFind->pNext;
}
}
printf("n");
return OK;
}
销毁hash表
//销毁‘
//参数:hash
//成功返回OK,失败返回失败原因
int destoryHash(Hash **pHash)
{
if(NULL == pHash || *pHash == NULL)
{
return HASH_NULL;
}
//使用头删法删除链表,
//定义指针
Link *pFind=NULL;
Link *pDel=NULL;
int i;
for(i=0;i<(*pHash)->lastNum;i++)
{
pFind=(*pHash)->pArr[i];
while(pFind != NULL)
{
//头删法删除
pDel=pFind;
pFind=pFind->pNext;
free(pDel);
pDel=NULL;
}
}
free(*pHash);
*pHash=NULL;
return OK;
}
运行结果
输入1进入系统菜单
输入1插入信息
插入信息完毕
输入2
红色框为插入车辆的信息
输入3,删除车辆信息。
此处是根据车辆的编号进行删除的,顾输入车辆编号4将刚刚插入的车辆信息进行删除。
删除后查看
删除后车辆的状态信息从之前的在库变为已卖出。
输入4,修改车辆的信息
修改后再次查看
车辆的价格和颜色均发生改变。
输入5查找车辆信息
查找完成。
输入-1退出
退出后将hash表进行释放。
尾
此项目是完成了一个简单的车辆管理系统,对于真正的车辆管理系统还有很大的欠缺,自己本身也对知识掌握的不是很充分,仅仅是实现了部分功能,望各位大佬问批评指正,感激之至。