基于C语言的卡丁车管理系统【控制台应用程序】

注意:需要提前创建对应的.dat文件
本项目实现了数据的永久存储,有用户的注册、登录。
管理员对卡丁车的管理、查看预约用户、修改帐户权限。
用户对个人信息的管理、查看并预约卡丁车、卡丁车维修上报。
维修员对卡丁车的维修状态上报、个人信息管理。

登录信息页面

login.h

//
// Created by SGCNB666 on 2024/12/27.
//#ifndef GO_KARTS_LOGIN_H
#define GO_KARTS_LOGIN_H#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 账户机构提
typedef struct User
{char username[20]; // 用户名char password[20]; // 密码char permission;   // 权限
}User;// 用户个人信息
typedef struct UserPerson
{char name[20]; //用户名char phone[15]; //电话int kart_booknot; //预约卡丁车编号
}UserPerson;// 用户链表
typedef struct UserList
{User  data; // 用户信息struct UserList *next; // 指向下一个用户
}UserList;// 用户个人信息链表
typedef struct UserPersonList
{UserPerson data; //用户个人信息struct UserPersonList *next; //指向下一个用户个信息
}UserPersonList;/*** 登录验证* */
UserList* user(UserList *head);/*** 注册* */
int enroll_user(UserList **head);/*** 插入用户* */
int init_user_list(UserList **head, User user);/*** 用户信息的添加* */
void add_user_person(UserPersonList **head, UserList *user);/*** 创建用户个人信息* */
int init_user_Person_list(UserPersonList **head, UserPerson *userPerson);/*** 销毁用户列表* */
void destroy_user_list(UserList *head);/***  销毁用户个人信息列表* */
void destroy_user_person_list(UserPersonList *head);/*** 保存用户列表到文件* */
void save_user_file(UserList *head);/***  保存用户个人信息列表到文件* */
void save_user_person_file(UserPersonList *head);/*** 从文件加载用户列表* */
void load_user_file(UserList **head);/*** 从文件加载用户个人信息列表* */
void load_user_person_file(UserPersonList **head);/*** 程序欢迎界面* */
void login_welcome();/*** 登录主界面* */
UserList* login(UserList **head);/*** 输出用户列表* */
void print_user_list(UserList *head);#endif //GO_KARTS_LOGIN_H

login.c

#include "login.h"/*** 登录验证* */
UserList* user(UserList *head)
{UserList *p = head; // p指向头节点User user;   // 用户信息printf("请输入用户名:");scanf("%s", user.username); // 输入用户名printf("请输入密码:");scanf("%s", user.password); // 输入密码while(p) // 遍历链表{if(!strcmp(p->data.username, user.username) && !strcmp(p->data.password, user.password)) // 用户名和密码都正确{return p;}p = p->next; // p指向下一个节点}return NULL;
}/*** 注册* */
int enroll_user(UserList **head)
{User user; // 用户信息UserList *p = *head; // p指向头节点int flag = 1; // 标志位while(flag) // 循环输入用户名{printf("请输入用户名:");scanf("%s", user.username); // 输入用户名while (p){if(!strcmp(p->data.username, user.username)) // 用户名已存在{printf("用户名已存在,请重新输入!\n");flag = 1;break;}flag = 0; // 没有找到相同的用户名,更改标志位p = p->next; // p指向下一个节点}p = *head; // p重新指向头节点}printf("请输入密码:");scanf("%s", user.password); // 输入密码if(strcmp(user.username, "admin")) // 如果是管理员,管理员有且仅有admin一个{user.permission = 'A'; // 管理员权限}else{user.permission = 'U'; // 否则是用户权限}if( init_user_list(head, user) ) // 插入用户{return -1;}return 0;
}/*** 插入用户* */
int init_user_list(UserList **head, User user)
{UserList *pNew = (UserList *)malloc(sizeof (UserList)); // 分配内存UserList *p = *head; // p指向头节点if(!pNew) // 分配内存失败{perror("内存分配失败!");return -1;}if(*head != NULL) // 链表不为空{while(p->next) // 遍历链表{p = p->next; // p指向下一个节点}p->next  = pNew; // p指向新节点pNew->data = user; // 插入用户信息pNew->next = NULL; // 新节点的next指向NULLreturn 0;}pNew->next = NULL; // 新节点的next指向NULLpNew->data = user; // 插入用户信息*head = pNew; // 头节点指向新节点return 0;
}/*** 用户信息的添加* */
void add_user_person(UserPersonList **head, UserList *user)
{UserPersonList *p = *head; // p指向头节点while(p) // 遍历链表{if(!strcmp(p->data.name, user->data.username)) // 找到相同的用户名{return;}p = p->next; // p指向下一个节点}UserPerson userPerson; // 用户个人信息printf("您是第一次登录,请完善个人信息\n");strcpy(userPerson.name ,user->data.username); // 用户名userPerson.kart_booknot = 0; // 默认没有预约,默认为0,1表示已经被预约printf("请输入您的手机号:");scanf("%s", userPerson.phone); // 手机号while (getchar()!= '\n');init_user_Person_list(head, &userPerson); // 插入用户个人信息return;
}/*** 创建用户个人信息* */
int init_user_Person_list(UserPersonList **head, UserPerson *userPerson)
{UserPersonList *pNew = (UserPersonList *)malloc(sizeof (UserPersonList)); // 分配内存UserPersonList *p = *head; // p指向头节点if(!pNew) // 分配内存失败{perror("内存分配失败!");return -1;}if(*head != NULL) // 链表不为空{while(p->next) // 遍历链表{p = p->next; // p指向下一个节点}p->next  = pNew; // p指向新节点pNew->data = *userPerson; // 插入用户个人信息pNew->next = NULL; // 新节点的next指向NULLreturn 0;}pNew->next = NULL; // 新节点的next指向NULLpNew->data = *userPerson; // 插入用户个人信息*head = pNew; // 头节点指向新节点return 0;
}/*** 销毁用户列表* */
void destroy_user_list(UserList *head)
{UserList *p = head, *q = NULL; // p指向头节点,q指向p的前一个节点while(p) // 遍历链表,指针尾随{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放q}
}/***  销毁用户个人信息列表* */
void destroy_user_person_list(UserPersonList *head)
{UserPersonList *p = head, *q = NULL; // p指向头节点,q指向p的前一个节点while(p)  // 遍历链表,指针尾随{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放q}
}/*** 保存用户列表到文件* */
void save_user_file(UserList *head)
{FILE  *fp; // 文件指针fp = fopen("login_user.dat", "wb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}UserList *p = head; // p指向头节点while(p) // 遍历链表{fwrite(&(p->data), sizeof(User), 1, fp); // 写入文件,每次写入一个用户信息p = p->next; // p指向下一个节点}printf("保存成功!\n");fclose(fp); // 关闭文件
}/***  保存用户个人信息列表到文件* */
void save_user_person_file(UserPersonList *head)
{FILE  *fp; // 文件指针fp = fopen("person_info.dat", "wb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}UserPersonList *p = head; // p指向头节点while(p) // 遍历链表{fwrite(&(p->data), sizeof(UserPerson), 1, fp); // 写入文件,每次写入一个用户信息p = p->next; // p指向下一个节点}printf("保存成功!\n");fclose(fp); // 关闭文件
}/*** 从文件加载用户列表* */
void load_user_file(UserList **head)
{FILE *fp; // 文件指针fp = fopen("login_user.dat", "rb"); // 以二进制方式打开文件if(!fp) // 文件打开失败{perror("文件打开失败");return;}User user; // 用户信息while(fread(&user, sizeof (User), 1, fp) == 1 ) // 读取文件,每次读取一个用户信息{init_user_list(head, user); // 读取用户列表}fclose(fp); // 关闭文件
}/*** 从文件加载用户个人信息列表* */
void load_user_person_file(UserPersonList **head)
{FILE *fp; // 文件指针fp = fopen("person_info.dat", "rb"); // 以二进制方式打开文件if(!fp){perror("文件打开失败");return;}UserPerson userPerson1; // 用户信息while(fread(&userPerson1, sizeof (UserPerson), 1, fp) == 1 ) // 读取文件,每次读取一个用户信息{init_user_Person_list( head,&userPerson1); // 读取用户列表}fclose(fp); // 关闭文件
}/*** 程序欢迎界面* */
void login_welcome()
{system("clear"); // 清屏printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃                                                      ┃\n");printf("┃            欢迎进入卡丁车管理系统有系统              ┃\n");printf("┃                                                      ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("按任意键继续...\n");getchar();
}/*** 登录主界面* */
UserList* login(UserList **head)
{printf("登录页面\n");UserList* p = NULL; // p指向头节点char ch;while(1){system("clear"); // 清屏printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃ 1.登录               2.注册                3.退出    ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':p = user(*head);if( p ){printf("登录成功!\n");return p;}else{printf("密码错误,登录失败!\n");}break;case '2':enroll_user(head);break;case '3':{return NULL;}break;case '4':print_user_list(*head);break;default:printf("输入错误,请重新输入!\n");break;}while (getchar() != '\n');printf("按任意键继续...\n");getchar();}
}/*** 打印用户列表* */
void print_user_list(UserList *head)
{UserList *p = head;while(p){printf("用户名:%s\n", p->data.username);printf("密码:%s\n", p->data.password);printf("权限:%c\n", p->data.permission);p = p->next;}
}

登录后页面

home_face.h

//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_HOME_FACE_H
#define GO_KARTS_HOME_FACE_H#include <stdio.h>
#include "login.h"
#include "user.h"
#include "admin.h"
#include "repair.h"/*** 显示管理员主页面*/
void admin_home(UserPersonList* head_person,KartNode** head, UserList* head_user);/*** 显示用户主页面*/
void user_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List);/*** 显示维修员主页面*/
void repair_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List);/*** 卡丁车信息界面* */
void karts_info(KartNode** head);/*** 权限管理页面* */
void user_info(UserList* head);/*** 卡丁车预约界面* */
void katrs_book(UserPerson* head_person,KartNode* head_kart);/*** 个人信息管理界面* */
void user_person(UserPerson* userPerson, UserList* user_List);/*** 卡丁车报修界面* */
void karts_repair(KartNode* head_kart);/*** 修改密码* */
void change_password(UserList* user);#endif //GO_KARTS_HOME_FACE_H

home_face.c

//
// Created by SGCNB666 on 2024/12/31.
//#include "home_face.h"/*** 显示管理员主界面* */
void admin_home(UserPersonList* head_person,KartNode** head_kart, UserList* head_user)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("管理员主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃     1.退出       2.卡丁车信息管理       3.权限管理     4.删除用户      ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':save_user_person_file(head_person);save_user_file(head_user);return;break;case '2':karts_info( head_kart);break;case '3':user_info(head_user);break;case '4':delete_User(&head_user, &head_person);break;default:printf("输入错误,请重新输入!\n");break;}while (getchar() != '\n');printf("按任意键继续...\n");getchar();}}/*** 显示用户主页面*/
void user_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List)
{while (getchar() != '\n');UserPersonList *p = head_person;KartNode *p_kart = head_kart;while(p){if(strcmp(p->data.name,user_List->data.username)==0){break;}p = p->next;}UserPerson *userPerson = &(p->data);while(1){system("clear"); // 清屏char ch;while (getchar()!= '\n');printf("用户主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃      1.退出               2.卡丁车预约管理              3.个人信息管理           ┃\n");printf("┃              4.卡丁车报修                  5.卡丁车信息查询                      ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':user_kart_booknot_save(head_person,head_kart);return;break;case '2':katrs_book(&p->data,p_kart);break;case '3':user_person(&p->data,user_List);break;case '4':user_kart_repair(&p->data,p_kart);break;case '5':print_Kart_list(p_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar()!= '\n');getchar();}}/*** 显示维修员主页面*/
void repair_home(UserPersonList* head_person,KartNode* head_kart,UserList *user_List)
{while (getchar() != '\n');UserPersonList *p = head_person;KartNode *p_kart = head_kart;while(p){if(strcmp(p->data.name,user_List->data.username)==0){break;}p = p->next;}UserPerson *userPerson = &(p->data);while (1){system("clear"); // 清屏char ch;printf("维修员主页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃      1.退出               2.卡丁车报修管理             3.个人信息管理            ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':user_kart_booknot_save(head_person,head_kart);return;break;case '2':karts_repair(head_kart);break;case '3':user_person(&p->data,user_List);break;default:printf("输入错误,请重新输入!\n");break;}}}
/*** 卡丁车信息界面* */
void karts_info(KartNode** head)
{load_Kart_file(head);while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("卡丁车信息管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃    1.保存退出          2.增加卡丁车信息         3.删除卡丁车信息       ┃\n");printf("┃            4.修改卡丁车信息             5.查询卡丁车信息               ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);switch (ch){case '1':save_Kart_file(*head);return;break;case '2':enroll_Kart(head);break;case '3':delete_Kart(head);break;case '4':modify_Kart(*head);break;case '5':print_Kart_list(*head);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');getchar();}
}/*** 权限管理页面* */
void user_info(UserList* head)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("权限身份管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃     1.保存退出                          2.修改用户权限身份标识         ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_user_file(head);return;break;case '2':revise_User_perm(head);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 卡丁车预约界面* */
void katrs_book(UserPerson* userPerson,KartNode* head_kart)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("预约管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃     1.退出           2.卡丁车预约             3.卡丁车预约取消         ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':return;break;case '2':user_kart_booknot(userPerson,head_kart);break;case '3':user_kart_booknot_cancel(userPerson,head_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 个人信息管理界面* */
void user_person(UserPerson* userPerson, UserList* user_List)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("个人信管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃       1.退出       2.查看个人信息      3.修改个人信息     4.修改密码   ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_user_file(user_List);return;break;case '2':if(user_List->data.permission == 'R'){print_repair_info(userPerson);}else{print_user_info(userPerson);}break;case '3':revise_user_info(userPerson);break;case '4':change_password(user_List);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 卡丁车报修界面* */
void karts_repair(KartNode* head_kart)
{while(1){system("clear"); // 清屏char ch;while (getchar() != '\n');printf("卡丁车报修管理页面\n");printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃      1.退出      2.查看待报修卡丁车      3.上报维修完成或无法维修进行报废处理       ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");printf("请选择:");scanf("%c", &ch);while (getchar() != '\n');switch (ch){case '1':save_Kart_file(head_kart);return;break;case '2':repair_karts_info(head_kart);break;case '3':report_repair_info(head_kart);break;default:printf("输入错误,请重新输入!\n");break;}printf("按任意键继续...\n");while (getchar() != '\n');}
}/*** 修改密码* */
void change_password(UserList* user)
{printf("请输入新密码:");scanf("%s",user->data.password);return;
}

管理员功能页面

admin.h

//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_ADMIN_H
#define GO_KARTS_ADMIN_H
#include <stdio.h>
#include <stdlib.h>
#include "login.h"// 赛车结构体
typedef struct Kart
{int kart_id;     // 赛车编号char repair_not; // 是否需要维修char kart_name[20];  // 赛车名称char kart_type[20];  // 赛车类型char kart_color[20];  // 赛车颜色char book_not;  // 是否被预定char user_name[20];  // 预定用户
}Kart;// 卡丁车链表
typedef struct KartNode
{Kart data;struct KartNode *next;
}KartNode;/*** 添加卡丁车信息* */
void enroll_Kart(KartNode **head);
/*** 添加卡丁车节点* */
void init_Kart_List(KartNode **head, Kart data);/*** 销毁卡丁车列表* */
void destroy_Kart_list(KartNode *head);/*** 保存卡丁车列表到文件* */
void save_Kart_file(KartNode *head);/*** 从文件加载卡丁车列表* */
void load_Kart_file(KartNode **head);/*** 查询卡丁车列表* */
void print_Kart_list(KartNode *head);/*** 删除卡丁车* */
void delete_Kart(KartNode **head);/*** 修改卡丁车信息* */
void modify_Kart(KartNode *head);/*** 修改用户权限身份* */
void revise_User_perm(UserList *head);/*** 删除用户* */
void delete_User(UserList **head, UserPersonList **head_person);/*** 删除用户信息* */
void delete_User_Person(UserList *head, UserPersonList **head_person);#endif //GO_KARTS_ADMIN_H

admin.c

//
// Created by SGCNB666 on 2024/12/31.
//#include "admin.h"/*** 添加卡丁车信息* */
void enroll_Kart(KartNode **head)
{int id; // 生成卡丁车编号KartNode *p = *head; // p指向头节点if(!p) // 链表为空{id = 1001;}else{while(p){id = p->data.kart_id + 1; // 生成卡丁车编号p = p->next; // p指向下一个节点}}Kart new_kart;new_kart.kart_id = id; // 生成卡丁车编号new_kart.repair_not = '0'; // 初始化是否维修,默认不需要维修new_kart.book_not = '0'; // 初始化是否预约,默认不需要预约new_kart.user_name[0] = '\0'; // 初始化预约人为空printf("添加编号为%d的车辆信息\n", id);printf("请输入卡丁车名称:");scanf("%s", new_kart.kart_name); // 输入卡丁车名称printf("请输入卡丁车类型:");scanf("%s", new_kart.kart_type); // 输入卡丁车类型printf("请输入卡丁车颜色:");scanf("%s", new_kart.kart_color); // 输入卡丁车颜色init_Kart_List(head, new_kart);
}/*** 添加卡丁车节点* */
void init_Kart_List(KartNode **head, Kart data)
{KartNode *pNew = (KartNode *)malloc(sizeof(KartNode)); // 分配内存if(!pNew) // 分配内存失败{perror("内存分配失败\n");return;}KartNode *p = *head; // p指向头节点if(*head != NULL) // 链表不为空{while(p->next) // 找到链表的尾节点{p = p->next; // p指向下一个节点}p->next  = pNew; // 尾节点指向新节点pNew->data = data; // 新节点数据赋值pNew->next = NULL; // 新节点指向空return;}pNew->next = NULL; // 新节点指向空pNew->data = data; // 新节点数据赋值*head = pNew; // 头节点指向新节点return;
}/*** 销毁卡丁车列表* */
void destroy_Kart_list(KartNode *head)
{KartNode *p = head, *q = NULL; // p指向头节点,q指向尾节点while(p) // 遍历链表{q = p; // q指向pp = p->next; // p指向下一个节点free(q); // 释放内存}
}/*** 保存卡丁车列表到文件* */
void save_Kart_file(KartNode *head)
{FILE *fp = fopen("karts_info.dat", "wb"); // 以二进制方式打开文件if(!fp) // 打开文件失败{perror("文件打开失败!");return;}KartNode *p = head; // p指向头节点while(p) // 遍历链表{fwrite( &p->data, sizeof (Kart), 1, fp); // 写入文件p = p->next;}printf("保存成功!\n");fclose(fp); // 关闭文件return;
}/*** 从文件加载卡丁车列表* */
void load_Kart_file(KartNode **head)
{FILE *fp = fopen("karts_info.dat", "rb"); // 以二进制方式打开文件if(!fp) // 打开文件失败{perror("文件打开失败!");return;}Kart data; // 卡丁车信息while(fread(&data, sizeof (Kart), 1, fp))   // 读取文件{init_Kart_List(head, data); // 添加卡丁车节点}fclose(fp); // 关闭文件
}/*** 查询卡丁车列表* */
void print_Kart_list(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p){printf("卡丁车列表为空!\n");return;}printf("卡丁车编号\t卡丁车名称\t卡丁车类型\t卡丁车颜色\t是否维修或报废\t是否预约\t预约人\n");while(p) // 遍历链表{printf("%d\t\t", p->data.kart_id);printf("%s\t\t", p->data.kart_name);printf("%s\t\t", p->data.kart_type);printf("%s\t\t", p->data.kart_color);if(p->data.repair_not == '0'){printf("%c(无损坏)\t", p->data.repair_not);}else if(p->data.repair_not == '1'){printf("%c(报修中)\t", p->data.repair_not);}else{printf("%c(已报废)\t", p->data.repair_not);}printf("%c\t\t", p->data.book_not);printf("%s\t\t\n", p->data.user_name);p = p->next; // p指向下一个节点}
}/*** 删除卡丁车* */
void delete_Kart(KartNode **head)
{KartNode *p = *head; // p指向头节点if(!p) // 链表为空{printf("卡丁车列表为空!\n");}int id;printf("请输入要删除的卡丁车编号:");scanf("%d", &id); // 输入卡丁车编号KartNode *q = NULL; // q置空while(p) // 遍历链表,指针尾随{ if(id == p->data.kart_id){if(p == *head) // 要删除的是头节点{*head = p->next; // 头节点后移free(p); // 释放内存return;}else{q->next = p->next; // 前一个节点指向后一个节点free(p); // 释放内存return;}}q = p; // q指向pp = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}/*** 修改卡丁车信息* */
void modify_Kart(KartNode *head)
{KartNode *p = head, *q = NULL; // p指向头节点,q指向尾节点if(!p) // 链表为空{printf("卡丁车列表为空!\n");}int id; // 卡丁车编号printf("请输入要修改的卡丁车编号:");scanf("%d", &id); // 输入卡丁车编号while(p) // 遍历链表{if(id == p->data.kart_id) // 找到了要修改的卡丁车{while(1) // 循环修改卡丁车信息{printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃      1.全部修改                  2.是否维修               3.卡丁车名称           ┃\n");printf("┃      4.卡丁车类型             5.卡丁车颜色             6.预约用户名               ┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");while(getchar() != '\n'); // 清空缓冲区printf("请选择:\n");char ch;scanf("%c", &ch); // 输入选择while(getchar() != '\n'); // 清空缓冲区switch(ch){case '1':printf("请输入卡丁车名称:");scanf("%s", p->data.kart_name);printf("请输入卡丁车类型:");scanf("%s", p->data.kart_type);printf("请输入卡丁车颜色:");scanf("%s", p->data.kart_color);while(getchar() != '\n');printf("请输入是否维修:");scanf("%c", &p->data.repair_not);while(getchar() != '\n');printf("请输入预约用户名:");scanf("%s", p->data.user_name);p->data.book_not = '1';while(getchar() != '\n');return;break;case '2':printf("请输入是否维修:");scanf("%c", &p->data.repair_not);while(getchar() != '\n');return;break;case '3':printf("请输入卡丁车名称:");scanf("%s", p->data.kart_name);while(getchar() != '\n');return;break;case '4':printf("请输入卡丁车类型:");scanf("%s", p->data.kart_type);while(getchar() != '\n');return;break;case '5':printf("请输入卡丁车颜色:");scanf("%s", p->data.kart_color);while(getchar() != '\n');return;break;case '6':printf("请输入预约用户名:");scanf("%s", p->data.user_name);p->data.book_not = '1';while(getchar() != '\n');return;break;default:printf("不存在该选项,请重新输入!\n");}printf("按回车健继续...");getchar();}}q = p;  // q指向pp = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}/*** 修改用户权限身份* */
void revise_User_perm(UserList *head)
{UserList *p = head; // p指向头节点if(!p) // 链表为空{printf("用户列表为空!\n");return;}char username[20]; // 用户名printf("请输入要修改权限的用户名:");scanf("%s", username); // 输入用户名while(getchar() != '\n');if(strcmp(username, "admin") == 0) // 要修改的是admin用户{printf("admin用户是管理员,不能修改权限!\n");return;}while(p) // 遍历链表{if(strcmp(username, p->data.username) == 0) // 找到了要修改的用户{printf("开始修改用户权限:('A'是普通用户,'R'是维修员)\n");scanf("%c", &p->data.permission);printf("修改成功!\n");printf("%s, %s, %c\n", p->data.username, p->data.password, p->data.permission);return;}p = p->next; // p指向下一个节点}printf("用户不存在!\n");return;
}/*** 删除用户* */
void delete_User(UserList **head, UserPersonList **head_person)
{printf("请输入想要删除的用户名:\n");char username[20];scanf("%s", username);while(getchar()!= '\n');UserList *p = *head;if(strcmp(username, "admin") == 0)  // 要删除的是admin用户{printf("admin用户是管理员,不能删除!\n");return;}if(!p) // 链表为空{printf("用户列表为空!\n");return;}if(strcmp(username, p->data.username) == 0) // 要删除的是头节点{delete_User_Person(*head, head_person); // 删除用户信息*head = p->next; // 头节点后移free(p); // 释放内存return;}UserList *q = NULL;while(p) // 遍历链表{if(strcmp(username, p->data.username) == 0)  // 找到了要删除的用户{ delete_User_Person(*head, head_person); // 删除用户信息q->next = p->next;  // 前一个节点指向后一个节点free(p); // 释放内存return;}q = p; // q指向pp = p->next; // p指向下一个节点}printf("该用户不存在!\n");return;
}/*** 删除用户信息* */
void delete_User_Person(UserList *user, UserPersonList **head_person)
{UserList *p_user = user; // p_user指向头节点UserPersonList *p_person = *head_person; // p_person指向头节点if(strcmp(p_user->data.username,p_person->data.name) == 0) // 要删除的是头节点{*head_person = p_person->next; // 头节点后移free(p_person); // 释放内存return;}UserPersonList *q_person = NULL; // q_person指向尾节点while(p_person) // 遍历链表{if(strcmp(p_user->data.username,p_person->data.name) == 0) // 找到了要删除的用户{q_person->next = p_person->next; // 前一个节点指向后一个节点free(p_person); // 释放内存return;}q_person = p_person; // q_person指向p_personp_person = p_person->next; // p_person指向下一个节点}printf("该用户不存在!\n");return;
}

用户功能页面

user.h

//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_USER_H
#define GO_KARTS_USER_H#include "admin.h"
#include "login.h"/*** 卡丁车预约* */
void user_kart_booknot(UserPerson *userPerson,KartNode *kart);/*** 卡丁车查询* */
void user_kart_booknot_query(KartNode *kart);/*** 卡丁车预约取消* */
void user_kart_booknot_cancel(UserPerson *userPerson,KartNode *kart);/*** 卡丁车预约信息保存* */
void user_kart_booknot_save(UserPersonList *head,KartNode *kart);/*** 卡丁车预约信息加载* */
void user_kart_booknot_load(UserPersonList **head);/*** 卡丁车报修* */
void user_kart_repair(UserPerson *userPerson,KartNode *kart);/*** 个人信息查询* */
void print_user_info(UserPerson *userPerson);/*** 个人信息修改* */
void revise_user_info(UserPerson *userPerson);#endif //GO_KARTS_USER_H

user.c

//
// Created by SGCNB666 on 2024/12/31.
//#include "user.h"/*** 卡丁车预约* */
void user_kart_booknot(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点while(p) // 遍历链表{if(!strcmp(userPerson->name,p->data.user_name)) // 判断是否预约过{printf("您已经预约了卡丁车!\n");return;}p = p->next; // p指向下一个节点}p = kart; // p重新指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输入要预约的卡丁车编号:");int num; // 输入的编号scanf("%d", &num); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(p->data.kart_id == num) // 找到了{p->data.book_not = '1'; // 预约成功userPerson->kart_booknot = num; // 修改用户个人信息strcpy(p->data.user_name ,userPerson->name); // 修改车辆信息printf("预约成功!\n");return;}p = p->next;}printf("查询不到该编号的卡丁车!\n");return;
}/*** 卡丁车预约查询* */
void user_kart_booknot_query(KartNode *kart)
{KartNode *p = kart;   // p指向头节点print_Kart_list(kart);  // 打印卡丁车列表
}/*** 卡丁车预约取消* */
void user_kart_booknot_cancel(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输取消预约的卡丁车编号:");int num; // 输入的编号scanf("%d", &num);while(getchar() != '\n'); // 清空缓冲区while(p) // 遍历链表{ if(p->data.kart_id == num) // 找到了{p->data.book_not = '0'; // 取消预约成功userPerson->kart_booknot = 0; // 修改用户个人信息strcpy(p->data.user_name ,""); // 修改车辆信息printf("取消预约成功!\n"); return;}p = p->next; // p指向下一个节点}printf("查询不到该编号的卡丁车!\n");return;
}/*** 卡丁车预约信息保存* */
void user_kart_booknot_save(UserPersonList *head,KartNode *kart)
{save_user_person_file(head); // 保存用户个人信息列表到文件save_Kart_file(kart); // 保存卡丁车列表到文件
}/*** 卡丁车预约信息加载* */
void user_kart_booknot_load(UserPersonList **head)
{load_user_person_file(head); // 加载用户个人信息列表
}/*** 卡丁车报修* */
void user_kart_repair(UserPerson *userPerson,KartNode *kart)
{KartNode *p = kart; // p指向头节点print_Kart_list(p); // 打印卡丁车列表printf("请输入要报修的卡丁车编号:");int num; // 输入的编号scanf("%d", &num); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(p->data.kart_id == num) // 找到了{p->data.repair_not = '1'; // 报修成功printf("报修成功!\n");return;}p = p->next;  // p指向下一个节点}printf("查询不到该编号的卡丁车!\n");return;
}/*** 个人信息查询* */
void print_user_info(UserPerson *userPerson)
{printf("个人信息如下:\n");printf("用户名:%s\n", userPerson->name);printf("手机号:%s\n", userPerson->phone);printf("预约卡丁车编号:%d\n", userPerson->kart_booknot);return;
}/*** 个人信息修改* */
void revise_user_info(UserPerson *userPerson)
{printf("请输入新的手机号:");scanf("%s", userPerson->phone); // 输入新的手机号while(getchar()!= '\n');return;
}

维修员功能实现

repair.h

//
// Created by SGCNB666 on 2024/12/31.
//#ifndef GO_KARTS_REPAIR_H
#define GO_KARTS_REPAIR_H#include "admin.h"
#include "user.h"
#include "login.h"/*** 显示维修员信息* */
void print_repair_info(UserPerson *userPerson);/*** 显示待维修的车辆信息* */
void repair_karts_info(KartNode *head);/*** 上报维修情况* */
void report_repair_info(KartNode *head);#endif //GO_KARTS_REPAIR_H

repair.c

//
// Created by SGCNB666 on 2024/12/31.
//#include "repair.h"/*** 显示维修员信息* */
void print_repair_info(UserPerson *userPerson)
{printf("个人信息如下:\n");printf("用户名:%s\n", userPerson->name);printf("手机号:%s\n", userPerson->phone);return;
}/*** 显示待维修的车辆信息* */
void repair_karts_info(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p) // 如果链表为空{printf("卡丁车列表为空!\n");return;}while(p) // 遍历链表{if (p->data.repair_not == '1') // 如果需要维修{printf("编号:%d\t\t", p->data.kart_id);printf("名称:%s\t\t", p->data.kart_name);printf("类型:%s\t\t", p->data.kart_type);printf("颜色:%s\t\n", p->data.kart_color);}p = p->next; // p指向下一个节点}
}/*** 上报维修情况* */
void report_repair_info(KartNode *head)
{KartNode *p = head; // p指向头节点if(!p) // 如果链表为空{printf("卡丁车列表为空!\n");return;}printf("请输入你想上报的卡丁车编号:");int id; // 输入的编号scanf("%d", &id); // 输入编号while(getchar() != '\n');while(p) // 遍历链表{if(id == p->data.kart_id) // 找到了{while(getchar()!= '\n');printf("请输入维修情况(1:报废无法维修,2:维修完成):");char ch;scanf("%c", &ch); // 输入维修情况if(ch == '1'){p->data.repair_not = '3';printf("维修完成!\n");}else if(ch == '2'){p->data.repair_not = '0';printf("维修完成!\n");}else{printf("不存在该选项!\n");}return;}p = p->next; // p指向下一个节点}printf("卡丁车编号不存在!\n");return;
}

主函数main.c

/*************************************************************************> File Name:    main.c> Author:       sgc> Description:  卡丁车管理系统> Created Time: 2024年12月30日 星期一 17时53分14秒************************************************************************/#include <stdio.h>
#include "login.h"
#include "home_face.h"
#include "admin.h"int main(int argc,char *argv[])
{UserList *head_user = NULL;KartNode *head_kart = NULL;UserPersonList *head_person = NULL;load_user_file(&head_user); // 加载用户列表login_welcome(); // 显示欢迎界面UserList *p = NULL;p = login(&head_user); // 登录主界面if(!p) // 判断是否是正常登录{save_user_file(head_user);return 0;}save_user_file(head_user); // 保存用户列表到文件// 显示管理员主界面if(p->data.permission == 'U') // 管理员{load_user_person_file(&head_person); // 加载用户个人信息列表save_user_person_file(head_person); // 保存用户个人信息列表到文件admin_home( head_person,&head_kart,head_user); // 管理员主界面}else if(p->data.permission == 'A') // 普通用户{load_user_person_file(&head_person); // 加载用户个人信息列表add_user_person(&head_person, p); // 添加用户个人信息save_user_person_file(head_person); // 保存用户个人信息列表到文件load_Kart_file(&head_kart); // 加载卡丁车列表user_home(head_person,head_kart,p); // 用户主界面}else if(p->data.permission == 'R') // 维修员{load_user_person_file(&head_person); // 加载用户个人信息列表add_user_person(&head_person, p); // 添加用户个人信息save_user_person_file(head_person); // 保存用户个人信息列表到文件load_Kart_file(&head_kart); // 加载卡丁车列表repair_home(head_person,head_kart,p); // 维修员主界面}else // 其他{printf("权限错误!请联系管理员进行修改!\n");}destroy_user_list(head_user); // 销毁用户列表destroy_user_person_list(head_person); // 销毁用户个人信息列表destroy_Kart_list(head_kart); // 销毁卡丁车列表return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/500672.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【unity错误】Unity 6 LTS 打开就报错Assertion failed on expressionxxx?

unity6发布已经有一段时间了&#xff0c;如果目前你已经使用了unity6进行项目开发&#xff0c;可能打开会发现如下报错 Assertion failed on expression: ‘!(o->TestHideFlag(Object::kDontSaveInEditor) && (options & kAllowDontSaveObjectsToBePersistent) …

集线器,交换机,路由器,mac地址和ip地址知识记录总结

一篇很不错的视频简介 基本功能 从使用方面来说&#xff0c;都是为了网络传输的标识&#xff0c;和机器确定访问对象 集线器、交换机和路由器 常听到路由器和集线器&#xff0c;下面是区别&#xff1a; 集线器 集线器&#xff1a;一个简单的物理扩展接口数量的物理硬件。…

【ArcGISPro/GeoScenePro】检查并处理高程数据

数据 https://arcgis.com/sharing/rest/content/items/535efce0e3a04c8790ed7cc7ea96d02d/data 数字高程模型 (DEM) 是一种栅格,可显示地面或地形的高程。 数字表面模型 (DSM) 是另一种高程栅格,可显示表面的高度,例如建筑物或树冠的顶部。 您需要准备 DEM 和 DSM 以供分析…

《计算机组成及汇编语言原理》阅读笔记:p177-p177

《计算机组成及汇编语言原理》学习第 13 天&#xff0c;p177-p177 总结&#xff0c;总计 1 页。 一、技术总结 1.real mode A programming model where the program has access to the entire capability of the machine, bypassing security and memory management. Useful…

珞珈一号夜光遥感数据地理配准,栅格数据地理配准

目录 一、夜光数据下载&#xff1a; 二、夜光遥感数据地理配准 三、计算夜光数据值 四、辐射定标 五、以表格显示分区统计 五、结果验证 夜光数据位置和路网位置不匹配&#xff0c;虽然都是WGS84坐标系&#xff0c;不匹配&#xff01;&#xff01;&#xff01;不要看到就直接…

python学习笔记—12—

1. 布尔类型 (1) 定义 (2) 比较运算符 (3) 代码演示 1. 手动定义 bool_1 True bool_2 False print(f"bool_1的内容是&#xff1a;{bool_1}, 类型是&#xff1a;{type(bool_1)}") print(f"bool_2的内容是&#xff1a;{bool_2}, 类型是&#xff1a;{type(bool…

Redis 使用redisTemplate获取某个规则下的key的全量数据(示例Set结构)

如下是redis中存储的数据结构 我想取key以favorites:结尾的所有数据 Redis 的 SCAN 命令用于迭代数据库中的键&#xff0c;支持通过模式过滤结果。模式规则基于 Redis 的通配符匹配语法&#xff0c;类似于文件名匹配规则&#xff1a; *&#xff1a;匹配零个或多个字符。?&…

CertiK《Hack3d:2024年度安全报告》(附报告全文链接)

CertiK《Hack3d&#xff1a;2024年度安全报告》现已发布&#xff0c;本次报告深入分析了2024年Web3.0领域的安全状况。2024年损失总额超过23亿美元&#xff0c;同比增幅高达31.61%&#xff1b;其中&#xff0c;12月的损失金额最少。过去一年&#xff0c;网络钓鱼攻击和私钥泄露…

AI知识库与用户行为分析:优化用户体验的深度洞察

在当今数字化时代&#xff0c;用户体验&#xff08;UX&#xff09;已成为衡量产品成功与否的关键指标之一。AI知识库作为智能客服系统的重要组成部分&#xff0c;不仅为用户提供快速、准确的信息检索服务&#xff0c;还通过用户行为分析&#xff0c;为产品优化提供了深度洞察。…

Vue3 + ElementPlus动态合并数据相同的单元格(超级详细版)

最近的新项目有个需求需要合并单元列表。ElementPlus 的 Table 提供了合并行或列的方法&#xff0c;可以参考一下https://element-plus.org/zh-CN/component/table.html 但项目中&#xff0c;后台数据返回格式和指定合并是动态且没有规律的&#xff0c;Element 的示例过于简单&…

CSS进阶和SASS

目录 一、CSS进阶 1.1、CSS变量 1.2、CSS属性值的计算过程 1.3、做杯咖啡 1.4、下划线动画 1.5、CSS中的混合模式(Blending) 二、SASS 2.1、Sass的颜色函数 2.2、Sass的扩展(extend)和占位符(%)、混合(Mixin) 2.3、Sass的数学函数 2.4、Sass的模块化开发 2.5、Sass…

概率论与数理统计

概率论占比更多&#xff0c;三分之二左右 数理统计会少一些 事件之间的概率 ab互斥&#xff0c;不是ab独立 古典概型吃高中基础&#xff0c;考的不会很多 条件概率公式&#xff0c;要记 公式不要全记&#xff0c;很多有名称的公式是通过基础公式转换而来的 目的在于解决一…

javaEE-多线程进阶-JUC的常见类

juc:指的是java.util.concurrent包&#xff0c;该包中加载了一些有关的多线程有关的类。 目录 一、Callable接口 FutureTask类 参考代码&#xff1a; 二、ReentrantLock 可重入锁 ReentrantLock和synchronized的区别&#xff1a; 1.ReentantLock还有一个方法&#xff1a…

智慧工地系统:建筑施工智能化管理的全新模式

智慧工地概述 智慧工地是将互联网的理念和和物联网的技术引入建筑工地&#xff0c;依托物联网、互联网、大数据、5G技术&#xff0c;建立云端数据平台&#xff0c;形成大数据的业务体系&#xff0c;打通一线操作与远程监管的链条&#xff0c;实现劳务、安全、环境、材料等各个…

FastAPI 统一接口响应(Json)模板的使用示例

目录 FastAPI 统一接口响应&#xff08;Json&#xff09;模板的使用示例 实际案例 实现方法 1. 创建统一响应格式的中间件 2. 将中间件添加到 FastAPI 应用中 3. 解释代码 4. 扩展和定制 5. 测试 FastAPI 统一接口响应&#xff08;Json&#xff09;模板的使用示例 实际…

Linux平台下实现的小程序-进度条

目录 1.换行、回车概念 2.缓冲区 2.1缓冲区 2.2强制刷新 3.进度条程序 Makefile文件 ProgressBar.h ProgressBar.c Main.c 执行结果 1.换行、回车概念 /n&#xff1a;换行回车&#xff08;\r&#xff1a;回车&#xff09; 2.缓冲区 如下图在vim编辑器中的命令模式下…

C++ 基础思维导图(一)

目录 1、C基础 IO流 namespace 引用、const inline、函数参数 重载 2、类和对象 类举例 3、 内存管理 new/delete 对象内存分布 内存泄漏 4、继承 继承权限 继承中的构造与析构 菱形继承 1、C基础 IO流 #include <iostream> #include <iomanip> //…

Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析

文章目录 PreApache CommonsApache Commons ProperLogging &#xff08;Apache Commons Logging &#xff09; JCL 集成logbackPOM依赖配置文件 logback.xml使用 源码分析jcl-over-slf4j 的工作原理1. LogFactory 的实现2. SLF4JLogFactory 和 Log 的实例化过程3. SLF4JLog 和 …

中小企业如何进行数字化转型?

​在这个日新月异的数字时代&#xff0c;企业数字化转型已成为不可逆转的潮流与战略选择。大数据、云计算、人工智能、物联网等前沿科技正重塑着各行各业的面貌。面对激烈的市场竞争和不断变化的客户需求&#xff0c;中小企业作为国民经济的重要组成部分&#xff0c;数字化转型…

闪存知识科普-基本储存单元结构

概述&#xff1a; 闪存&#xff0c;即FlashMemory。其基本储存单元&#xff08;Memory Cell&#xff09;如下图所示。看起来有点像N沟道&#xff08;N-Channel&#xff09;MOS管&#xff0c;但比MOS管多一个悬浮闸&#xff08;Floating Gate&#xff09;。悬浮闸内可以储存电荷…