#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h> //system("cls"):清屏
#include <conio.h> //getch()
typedef struct Parking
{
char name[20]; //车主姓名
char carname[10]; //车牌号
long information; //车主联系方式
char region; //车位区域编号
int num; //车位编号
struct Parking* next; //指针
}Parking;
void F(Parking* head) //打印用户信息
{
system("cls");
Parking* p = head->next;
printf("\n\t\t --停车场用户信息-- \n\n");
printf("\t---------------------------------------------------------------------\n");
printf("\t车主姓名--------车牌号-------车主联系方式-------车位编号----\n");
while (p)
{
printf("\t%-17s%-16s%-15lld%-17d\n", p->name, p->carname, p->information, p->num);
p = p->next;
}
_getch();
return;
}
Parking* Addcar(Parking* head) //添加车辆信息
{
int x;
system("cls");
Parking* p = head;
while (p->next != NULL)
{
p = p->next;
}
printf("输入需要添加的车辆个数:");
scanf("%d", &x);
while (x--)
{
system("cls");
Parking* Node = (Parking*)malloc(sizeof(Parking));
printf("\n输入用户姓名:");
scanf("%s", Node->name);
printf("\n输入车牌号:");
scanf("%s", Node->carname);
printf("\n输入车主联系方式:");
scanf("%ld", &Node->information);
printf("\n输入车位编号:");
scanf("%d", &Node->num);
Node->next = NULL;
p->next = Node;
p = p->next;
}
printf("\n输入完成!");
F(head);
printf("\n按任意键返回主页\n");
_getch();
return head;
}
Parking* Change(Parking* head) //修改用户信息
{
char name[20];
system("cls");
printf("输入需要修改的用户姓名:");
scanf("%s", name);
Parking* p = head->next;
while (p)
{
if (strcmp(p->name, name) == 0)
{
system("cls");
int x;
printf("\n\t\t --该用户信息-- \n\n");
printf("\t---------------------------------------------------------------------\n");
printf("\t车主姓名--------车牌号-------车主联系方式-------车位编号----\n");
printf("\t%-17s%-16s%-15lld%-17d\n", p->name, p->carname, p->information, p->num);
printf("\n输入你要修改的信息编号:\n");
printf(" 1-车主姓名 \n");
printf(" 2-车牌号 \n");
printf(" 3-车主联系方式 \n");
printf(" 5-车位编号 \n");
scanf("%d", &x);
switch (x)
{
case 1:
printf("\n\t输入修改后的信息");
scanf("%s", p->name);
break;
case 2:
printf("\n\t输入修改后的信息");
scanf("%s", p->carname);
break;
case 3:
printf("\n\t输入修改后的信息");
scanf("%ld", &p->information);
break;
case 4:
printf("\n\t输入修改后的信息");
scanf("%d", &p->num);
break;
}
printf("\n\t\t修改后的用户信息为");
printf("\t车主姓名--------车牌号-------车主联系方式-------车位编号----\n");
printf("\t%-17s%-16s%-15lld%-17d\n", p->name, p->carname, p->information, p->num);
break;
}
p = p->next;
}
if (p == NULL)
{
printf("\n未找到相应用户");
printf("\n按任意键返回主页\n");
_getch();
return head;
}
printf("\n修改完成!");
F(head);
printf("\n按任意键返回主页\n");
_getch();
return head;
}
Parking* Delete(Parking* head) //删除用户信息
{
char name[20];
system("cls");
printf("\n\t\t输入你要删除的用户姓名:");
scanf("%s", name);
Parking* p = head;
Parking* q = p->next;
while (q) //找到需要删除数据的前结点
{
if (strcmp(q->name, name) == 0) //判断字符串是否相等函数
{
p->next = q->next;
free(q); //释放内存空间
break;
}
p = q;
q = p->next;
}
if (p->next == NULL)
{
printf("\n\t\t未找到该用户信息!");
}
else
{
printf("\n\t\t删除成功!!");
F(head);
}
printf("\n\t\t按任意键返回主菜单");
_getch();
return head;
}
void Find(Parking* head) //查找用户信息
{
system("cls");
char name[20];
printf("\n\t\t输入你要查找的用户姓名:");
scanf("%s", name);
Parking* p = head;
while (p->next)
{
if (strcmp(p->next->name, name) == 0)
{
printf("找到了!\n");
printf("该用户的信息如下:");
printf("\n\t\t---用户姓名 %s", p->next->name);
printf("\n\t\t---车牌号 %s", p->next->carname);
printf("\n\t\t---车主联系方式 %lld", p->next->information);
printf("\n\t\t---车位编号 %ld", p->next->num);
break;
}
p = p->next;
}
if (p->next == NULL)
printf("\n\t\t没有找到该用户信息");
printf("\n\t\t按任意键返回主菜单");
_getch();
}
void RegionalVehicles(Parking* head) //寻找指定区域内车辆信息
{
system("cls");
char c;
printf("\n\t\t输入你想要查看的区域");
getchar();
scanf("%c", &c);
Parking* p = head->next;
printf("\n\t\t --%c区域内车辆用户信息-- \n\n", c);
printf("\t---------------------------------------------------------------------\n");
printf("\t车主姓名--------车牌号-------车主联系方式------车位编号----\n");
while (p)
{
if (p->region == c) //判断区域字符与输入字符是否相等,相等则输出
{
printf("\t%-17s%-16s%-15ld%-17d\n", p->name, p->carname, p->information, p->num);
}
p = p->next;
}
printf("\n\t\t按任意键返回主菜单");
_getch();
}
void Preservation(Parking* head) //保存数据在文件中
{
FILE* fp;
if ((fp = fopen("i停车管理信息.txt", "r")) == NULL)
{
perror("无法打开文件!\n");
exit(1);
}
Parking* p = head->next;
while (p)
{
fprintf(fp, "%s %s %ld %d\n", p->name, p->carname, p->information, p->num); //向文件内输入数据
p = p->next;
}
fclose(fp); //关闭文件
return;
}
Parking* Read() //读取文件内数据
{
FILE* fp;
if ((fp = fopen("停车管理信息.txt", "r")) == NULL)
{
perror("无法打开文件!\n");
exit(1);
}
Parking* head = (Parking*)malloc(sizeof(Parking)); //为头指针申请内存空间
head->next = NULL;
Parking* p1 = (Parking*)malloc(sizeof(Parking)); //申请存放数据的结点
p1->next = NULL;
if (fscanf(fp, "%s %s %ld %c %d", p1->name, p1->carname, &p1->information, &p1->region, &p1->num) != EOF) //判断所读文件内容是否为空
{
head->next = p1;
Parking* tmp = head;
while (tmp->next) //利用尾插法插入结点,确保读出的数据安正序输出
{
tmp = tmp->next;
}
while (fgetc(fp) != EOF) //判断文件是否为空
{
Parking* p = (Parking*)malloc(sizeof(Parking));
fscanf(fp, "%s %s %ld %d", p->name, p->carname, &p->information, &p->num);
tmp->next = p;
p->next = NULL;
tmp = tmp->next;
}
Parking* p2 = head; //删除最后一个结点
while (p2->next->next)
{
p2 = p2->next;
}
p2->next = NULL;
}
else
return NULL;
fclose(fp);
return head->next;
}
void menu() //主菜单
{
Parking* head = (Parking*)malloc(sizeof(Parking));
head->next = Read(); //读取文件信息
system("cls");
int choice;
do
{
system("cls"); //主页面
printf("--------------------------------------------------------------");
printf("\n\n");
printf("********************欢迎来到停车位管理系统********************\n");
printf("\n\n");
printf("---------------------------------------------------------\n");
printf("\n 1- 录入车辆信息 ");
printf("\n 2- 查找车辆信息 ");
printf("\n 3- 移除车辆信息 ");
printf("\n 4- 修改车辆信息 ");
printf("\n 5- 查询停车情况 ");
printf("\n 6- 管理长期停车用户信息 ");
printf("\n 0- 退出管理系统并保存数据 \n");
printf("\n-------------------------------------------------------\n");
scanf("%d", &choice);
switch (choice)
{
case 1:
head = Addcar(head);//添加
break;
case 2:
Find(head);//查找
break;
case 3:
head = Delete(head);//删除
break;
case 4:
head = Change(head);//修改
break;
case 5:
RegionalVehicles(head);
break;
case 6:
F(head);
break;
}
} while (choice != 0);
Preservation(head); //保存数据
}
int main()
{
menu();
return 0;
}