基于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("1\t\t插入\n");
		printf("2\t\t显示\n");
		printf("3\t\t删除\n");
		printf("4\t\t修改\n");
		printf("5\t\t查找\n");
		printf("-1\t\t退出\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("\t\t             *车辆管理系统*\n");
		printf("\t\t===================================================\n");
		printf("\t\t           欢迎使用车辆管理系统\n");
		printf("\t\t              按1进入系统菜单\n");
		printf("\t\t                按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("1\t\t插入\n");
		printf("2\t\t显示\n");
		printf("3\t\t删除\n");
		printf("4\t\t修改\n");
		printf("5\t\t查找\n");
		printf("-1\t\t退出\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("释放前:%p\n",pHash);
	destoryHash(&pHash);
	printf("释放后:%p\n",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("%s\t",pFind->data.name);
			printf("%d\t",pFind->data.num);
			printf("%s\t",pFind->data.power);
			printf("%d\t",pFind->data.price);
			printf("%s\t",pFind->data.status);
			printf("%s\t",pFind->data.xh);
			printf("%s\t",pFind->data.cs);
			printf("%s\t",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("%s\t",pFind->data.name);
			printf("%d\t",pFind->data.num);
			printf("%s\t",pFind->data.power);
			printf("%d\t",pFind->data.price);
			printf("%s\t",pFind->data.status);
			printf("%s\t",pFind->data.xh);
			printf("%s\t",pFind->data.cs);
			printf("%s\t",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表进行释放。

此项目是完成了一个简单的车辆管理系统,对于真正的车辆管理系统还有很大的欠缺,自己本身也对知识掌握的不是很充分,仅仅是实现了部分功能,望各位大佬问批评指正,感激之至。
  • 9
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈吓

您的打赏是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值