|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
设计一个ofo共享单车借车系统,该系统主要是利用单车的这些信息,通过其中的任意一个信息,找出我们所需要的查找的单车的所有信息,采用基数排序法对一组具有结构特点的单车号进行排序,利用二分查找法对排序好的借车记录按单车号实现快速查找,并按其他关键字的查找可以采用最简单的顺序查找方法进行。
以下是我完成的代码,但是不能继续完成了,程序可以运行,但是功能不能实现,求助各位大佬
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h> // 调用isdigit函数检查注册账号是否为存数字账号
#define N 50 //宏定义
#define M 100 //宏定义,用于用户信息结构体数组
typedef struct userinfo
{
char Accont[N]; //账号
char Password[N];//密码
char ID[N]; //学号
char People_name[N];//用户姓名
}USER;
struct BikeInfo {
int bikeID;// 编号
char color[20];//颜色
char state[20];//状态
time_t borrowTime;//借车时间
time_t returnTime;//还车时间
struct BikeInfo* next;
} BIKE;
void MainMenu();//登录注册主菜单界面
void Sign_up_Menu();//注册菜单界面
void Log_in_Menu();//登录菜单界面
void BMainMenu();//B端主菜单界面
void CMainMenu();//C端主菜单界面
void Register_system();//用户登记注册菜单函数
void Log_in();//系统用户登录函数
void Sign_in();//新用户注册
//void Load(BIKE bike[], int *nptr);//把文本文件中用户信息加载到内存中
//void Save(BIKE bike[], int n);//把数据保存到文本文件中
void search_bike_Num();//按单车号进行查询
void search_bike_RentTime();//按借车时间进行查询
void search_bike_RebackTime();//按还车时间进行查询
void search_bike_User();//按使用者进行查询
void Rent_bike();//借车
void Reback_bike();//还车
void X_MaHuateng();//充值查询
void MaHuateng();//充值
struct BikeInfo* binarySearch(struct BikeInfo* head, int targetID);// 二分查找自行车信息
void bubbleSort(struct BikeInfo* head);// 使用冒泡排序对链表进行排序
void readDataFromFile(struct BikeInfo** head);//读取文件
void Creat_Bike(struct BikeInfo** bikeInfoList, int* nptr);// 添加单车信息
void saveBikeInfoToFile(struct BikeInfo* head);//保存文件
void freeBikeInfoList(struct BikeInfo* head) ;//释放内存
void addBikeInfo(struct BikeInfo** head, int bikeID, const char* color, const char* state);//添加单车信息
void printBikeInfoList(struct BikeInfo* head);//打印单车信息
void searchByBikeID(struct BikeInfo* head);// 按单车号查询自行车信息
int sign = 0;// 区分用户标识符, 1: 系统管理员, 2:普通用户
char ACCOUNT[N]; // 用于保存普通用户登录后的账号
struct BikeInfo* head = NULL;
int main()
{
int n;
int numBikes = 0;
USER user[M]; //定义结构体数组保存用户信息
struct BikeInfo* bikeInfoList = NULL;
struct BikeInfo* head = NULL;
system("color 2F") ;//界面颜色
Register_system();//登录
//Load(bike, &n); // 把信息加载到内存中
readDataFromFile(&head);
readDataFromFile(&bikeInfoList);
if(sign==1)
{
int select;
FILE* fp;
while(1)
{
BMainMenu();
printf("请输入菜单选项:\n");
scanf("%d", &select);
switch(select)
{
case 0://退出系统
printf("\n成功退出系统!期待你的下次使用O(∩_ ∩)O ,祝你生活愉快!\n");
exit(0);
case 1://按单车号进行查询
searchByBikeID(bikeInfoList);
case 2://按借车时间进行查询
break;
case 3://按还车时间进行查询
break;
case 4://按使用者进行查询
break;
case 5://添加单车信息
Creat_Bike(&bikeInfoList, &numBikes);
printBikeInfoList(bikeInfoList);
scanf("%*c%*c");
break;
default:
printf("\n输入错误!无该菜单,输入任意键返回 *系统管理员功能菜单界面* ...\n");
scanf("%*c%*c");
break;
}
freeBikeInfoList(bikeInfoList);
}
}
if(sign==2)
{
int select;
FILE* fp;
while(1)
{
BMainMenu();
printf("请输入菜单选项:\n");
scanf("%d", &select);
switch(select)
{
case 0://退出系统
printf("\n成功退出系统!期待你的下次使用O(∩_ ∩)O ,祝你生活愉快!\n");
exit(0);
case 1://租车
Rent_bike();
break;
case 2://还车
Reback_bike();
break;
case 3://充值
MaHuateng();
break;
case 4://余额查询
X_MaHuateng();
break;
default:
printf("\n输入错误!无该菜单,输入任意键返回 *ofo共享单车借车系统界面* ...\n");
scanf("%*c%*c");
break;
}
}
}
}
//登录注册主菜单界面
void MainMenu()
{
system("cls");
printf("-----------------------------------\n");
printf("| |\n");
printf("|欢迎使用ofo共享单车借车系统 |\n");
printf("|1:用户登录 |\n");
printf("|2:用户注册 |\n");
printf("|0:退出系统 |\n");
printf("| |\n");
printf("-----------------------------------\n");
}
//注册菜单界面
void Sign_up_Menu()
{
system("cls");
printf("-----------------------------------\n");
printf("| |\n");
printf("| 请选择你需要的服务 |\n");
printf("| 1:注册账号 |\n");
printf("| 2:返回*用户登录注册界面* |\n");
printf("| 0:退出 |\n");
printf("| |\n");
printf("-----------------------------------\n");
}
//登录菜单界面
void Log_in_Menu()
{
system("cls");
printf("-----------------------------------\n");
printf("| |\n");
printf("| 请选择你需要的服务 |\n");
printf("| 1:登录账号 |\n");
printf("| 2:返回*用户登录注册界面* |\n");
printf("| 0:退出 |\n");
printf("| |\n");
printf("-----------------------------------\n");
}
//B端主菜单界面
void BMainMenu()
{
system("cls");
printf("-----------------------------------\n");
printf("| |\n");
printf("| 请选择你需要的服务 |\n");
printf("| 1:按单车号查询 |\n");
printf("| 2:按借车时间查询 |\n");
printf("| 3:按还车时间查询 |\n");
printf("| 4:按使用者查询 |\n");
printf("| 5:添加单车信息 |\n");
printf("| 0:退出 |\n");
printf("| |\n");
printf("-----------------------------------\n");
}
//C端主菜单界面
void CMainMenu()
{
system("cls");
printf("-----------------------------------\n");
printf("| |\n");
printf("| 请选择你需要的服务 |\n");
printf("| 1:租车 |\n");
printf("| 2:还车 |\n");
printf("| 3:充值 |\n");
printf("| 4:余额查询 |\n");
printf("| 0:退出 |\n");
printf("| |\n");
printf("-----------------------------------\n");
}
//用户登记注册菜单函数
void Register_system()
{
int select;
MainMenu();
scanf("%d", &select);
switch(select)
{
case 0: //退出系统
printf("\n成功退出系统!期待你的下次使用O(∩_ ∩)O ,祝你生活愉快!\n");
exit(0);
case 1: //登录账户
Log_in();
return;
case 2://注册账号
Sign_in();
return;
default: //重新输入选项
printf("\n输入错误,输入任意键返回 *系统用户登录注册界面* ...\n");
scanf("%*c%*c");
system("cls");
Register_system();
return;
}
}
//系统用户登录函数
void Log_in()
{
int select;
char Accont[N], Password[N];
char Accont1[N], Password1[N], ID1[N], People_name1[N];
FILE *fp;
if((fp = fopen("userinfo.dat", "a")) == NULL) //创建 userinfo.dat 文本文件
{
printf("can not open this file\n");
exit(0);
}
fclose(fp);
Log_in_Menu(); // 系统用户登录界面
scanf("%d", &select);
switch(select)
{
case 1: //登录账号密码
if((fp = fopen("userinfo.dat", "r")) == NULL)
{
printf("can not open this file\n");
exit(0);
}
printf("请输入账号:\n");
scanf("%s", Accont);
printf("请输入密码:\n");
scanf("%s", Password);
while(!feof(fp))
{
fscanf(fp, "%s %s", Accont1, Password1, ID1, People_name1);
if(strcmp(Accont, "1") == 0 && strcmp(Password, "1") == 0 ) // 账户及密码识别
{
sign = 1; //系统管理员标识符
fclose(fp);
printf("账号登录成功!!尊敬无敌帅气的管理员,欢迎你使用\n *欢 迎 使 用 ofo 共 享 单 车 借 车 系 统* \n");
printf("\n输入任意键前往 *系统管理员功能菜单界面* ...\n");
scanf("%*c%*c");
return;
}
if(strcmp(Accont, Accont1) == 0 && strcmp(Password, Password1) == 0) // 普通用户账号及密码识别
{
strcpy(ACCOUNT, Accont);
sign = 2; //普通用户标识符
fclose(fp);
printf("账号登录成功!!欢迎你使用 *欢 迎 使 用 ofo 共 享 单 车 借 车 系 统*\n");
printf("\n输入任意键前往 *系统用户功能菜单界面* ...\n");
scanf("%*c%*c");
return;
}
}
if(sign == 0)
{
printf("账号密码错误!! 请重新输入......\n");
printf("如若忘记账号密码,你叫我一声爹,爹给你找回密码\n");
char die[50],die2[50];
scanf("%s", die);
if (strcmp(die, die2) == 0)
{
printf("儿子乖,来10-3-102-5来找你爹吧");
}
else
{
printf("密码已无法找回");
}
printf("\n输入任意键返回 *系统用户登录界面* ...\n");
scanf("%*c%*c");
Log_in();
return;
}
case 2: //返回上界面
printf("\n输入任意键返回 *系统用户登录注册界面* ...\n");
scanf("%*c%*c");
system("cls");
Register_system();
return ;
case 0: //退出系统
printf("\n成功退出系统!\n");
exit(0);
default: //重新输入
printf("\n输入错误!无该菜单,输入任意键返回 *系统用户登录界面* ...\n");
scanf("%*c%*c");
Log_in();
return;
}
}
//新用户注册函数
void Sign_in()
{
int select;
char Accont[N], Password1[N], Password2[N], ID[N], People_name[N];
FILE *fp;
Sign_up_Menu(); // 新用户注册功能菜单
if((fp = fopen("userinfo.dat", "a")) == NULL) //创建 userinfo.dat 文本文件
{
printf("can not open this file\n");
exit(0);
}
fclose(fp);
scanf("%d", &select);
switch(select)
{
case 1: // 注册账号密码 , 并检验注册账号是否符合规定,是否被注册 。
while(1)
{
FILE *fp;
int i;
char Accont1[N], password1[N], ID[N], People_name[N];
int sign1 = 0; // 检查账号是否为数字账号,0:是 1:否
system("cls");
Sign_up_Menu();
printf("1\n");
printf("请输入注册账号(九位数数字):\n");
scanf("%s", Accont);
if((fp = fopen("userinfo.dat", "r")) == NULL)
{
printf("can not open this file\n");
exit(0);
}
for(i = 0; Accont[i] != '\0'; i++) // 检查是否为九位账号
{
if(isdigit(Accont[i]) == 0) // 检查账号是否为数字账号
{
sign1 = 1; break;
}
}
if(i >= 10 || sign1 == 1 || i < 9)
{
sign1 = 1;
printf("未按要求注册账号,请重新注册! \n");
printf("\n输入任意键返回 *系统用户注册界面* ...\n");
scanf("%*c%*c");
Sign_in();
return;
}
while(!feof(fp)) // 检查账号是否被注册
{
fscanf(fp, "%s %s %s %s", Accont1, password1, ID, People_name);
if(strcmp(Accont, Accont1) == 0)
{
fclose(fp);
printf("该账号已被注册,请重新注册!\n");
printf("\n输入任意键返回 *系统用户注册界面* ...\n");
scanf("%*c%*c");
sign1 = 1;
Sign_in();
return;
}
}
if(i == 9 && sign1 == 0)
{
printf("注册账号符合要求。");
break;
}
}
if((fp = fopen("userinfo.dat", "a")) == NULL)
{
printf("can not open this file\n");
exit(0);
}
printf("请输入你的身份证号:\n");
scanf("%s", ID);
printf("请输入你的姓名:\n");
scanf("%s", People_name);
printf("请输入账号密码:\n");
scanf("%s", Password1);
printf("请再次输入密码:\n");
scanf("%s", Password2);
if(strcmp(Password1, Password2) == 0)
{
fprintf(fp, "\n%s %s %s %s\n", Accont, Password1, ID, People_name);
fclose(fp);
printf("****新用户创建成功( ̄▽ ̄)**** \n");
printf("\n输入任意键返回 *系统用户登录注册界面* ...\n");
scanf("%*c%*c");
system("cls");
Register_system();
return;
}else
{
printf("\n****两次输入密码不一致!!!! 请重新注册****\n");
printf("\n输入任意键返回 *系统用户注册界面* ...\n");
scanf("%*c%*c");
Sign_in();
return;
}
case 2: //返回上一界面
printf("\n输入任意键返回 *系统用户登录注册界面* ...\n");
scanf("%*c%*c");
system("cls");
Register_system();
return;
case 0: //退出系统
printf("\n成功退出系统!期待你的下次使用O(∩_ ∩)O,祝你生活愉快!\n");
exit(0);
default: //重新输入
printf("\n输入错误,无该菜单,输入任意键返回 *系统用户注册界面* ...\n");
scanf("%*c%*c");
system("cls");
Sign_in();
return;
}
}
//按借车时间进行查询
void search_bike_RentTime()
{
}
//按还车时间进行查询
void search_bike_RebackTime()
{
}
//按使用者进行查询
void search_bike_User()
{
}
//借车
void Rent_bike()
{
}
//还车
void Reback_bike()
{
}
//充值查询
void X_MaHuateng()
{
}
//充值
void MaHuateng()
{
}
//批量添加单车信息
/*void Creat_Bike(BIKE bike[], int *nptr)
{
int i = *nptr;
printf("请输入待添加单车信息, 输入 0 表示结束添加!\n");
printf("编号 ---- 颜色 ---- 状态 \n");
while(1)
{
printf("编号:");
scanf("%d", &bike[i].bikeID);
if(bike[i].bikeID== 0)
{
break;
}
printf("颜色:");
scanf("%s", &bike[i].color);
printf("状态:");
scanf("%d", &bike[i].state);
i++;
}
*nptr = i;
Save(bike, *nptr); // 把数据保存到文本文件中
printf("\n添加成功!!输入任意键返回 *系统管理员功能菜单界面*....... \n");
scanf("%*c%*c");
}
//把数据保存到文本文件中
void Save(BIKE bike[], int n)
{
int i;
FILE *fp;
if((fp = fopen("bikeinfo.dat", "a")) == NULL)
{
printf("can not open this file!!");
exit(0);
}
for(i = 0; i < n; i++)
{
fprintf(fp, "%d %s %d\n", bike[i].bikeID, bike[i].color, bike[i].state);
}
fclose(fp);
}
*/
// 添加自行车信息到链表
void addBikeInfo(struct BikeInfo** head, int bikeID, const char* color, const char* state) {
struct BikeInfo* newBike = (struct BikeInfo*)malloc(sizeof(struct BikeInfo));
newBike->bikeID = bikeID;
strcpy(newBike->color, color);
strcpy(newBike->state, state);
newBike->next = NULL;
if (*head == NULL) {
*head = newBike;
} else {
struct BikeInfo* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newBike;
}
}
// 释放自行车信息链表的内存
void freeBikeInfoList(struct BikeInfo* head) {
while (head != NULL) {
struct BikeInfo* temp = head;
head = head->next;
free(temp);
}
}
// 保存自行车信息到文件
void saveBikeInfoToFile(struct BikeInfo* head) {
FILE* file = fopen("bikeinfo.dat", "a");
if (file == NULL) {
printf("无法打开文件!\n");
return;
}
struct BikeInfo* current = head;
while (current != NULL) {
fprintf(file, "%d\t%s\t%s\n", current->bikeID, current->color, current->state);
current = current->next;
}
fclose(file);
}
void Creat_Bike(struct BikeInfo** bikeInfoList, int* nptr) {
int i = *nptr;
printf("请输入待添加单车信息, 输入 0 表示结束添加!\n");
printf("编号 ---- 颜色 ---- 状态 \n");
while (1) {
printf("编号:");
int bikeID;
scanf("%d", &bikeID);
if (bikeID == 0) {
break;
}
printf("颜色:");
char color[20];
scanf("%s", color);
printf("状态:");
char state[20];
scanf("%s", state);
addBikeInfo(bikeInfoList, bikeID, color, state);
i++;
}
*nptr = i;
saveBikeInfoToFile(*bikeInfoList);
printf("\n添加成功!!输入任意键返回 *系统管理员功能菜单界面*....... \n");
scanf("%*c%*c");
}
// 打印自行车信息链表
void printBikeInfoList(struct BikeInfo* head) {
printf("自行车信息链表:\n");
while (head != NULL) {
printf("编号:%d\n", head->bikeID);
printf("颜色:%s\n", head->color);
printf("状态:%s\n\n", head->state);
head = head->next;
}
}
// 使用冒泡排序对链表进行排序
void bubbleSort(struct BikeInfo* head)
{
int swapped;
struct BikeInfo* ptr1;
struct BikeInfo* lptr = NULL;
if (head == NULL) {
return;
}
do {
swapped = 0;
ptr1 = head;
while (ptr1->next != lptr) {
if (ptr1->bikeID > ptr1->next->bikeID) {
int tempID = ptr1->bikeID;
ptr1->bikeID = ptr1->next->bikeID;
ptr1->next->bikeID = tempID;
char tempColor[20];
strcpy(tempColor, ptr1->color);
strcpy(ptr1->color, ptr1->next->color);
strcpy(ptr1->next->color, tempColor);
char tempState[20];
strcpy(tempState, ptr1->state);
strcpy(ptr1->state, ptr1->next->state);
strcpy(ptr1->next->state, tempState);
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
} while (swapped);
}
// 二分查找自行车信息
struct BikeInfo* binarySearch(struct BikeInfo* head, int targetID)
{
struct BikeInfo* start = head;
struct BikeInfo* end = NULL;
while (start != end)
{
struct BikeInfo* mid = start;
int count = 0;
while (mid->next != end) {
mid = mid->next;
count++;
}
int midID = mid->bikeID;
if (midID == targetID) {
return mid;
} else if (midID < targetID) {
start = mid->next;
} else {
end = mid;
}
}
return NULL;
}
// 按单车号查询自行车信息
void searchByBikeID(struct BikeInfo* head)
{
int target;
bubbleSort(head);
printf("请输入要查询的单车号:");
scanf("%d", &target);
struct BikeInfo* result = binarySearch(head, target);
if (result != NULL)
{
printf("查询结果:\n");
printf("编号:%d\n", result->bikeID);
printf("颜色:%s\n", result->color);
printf("状态:%s\n", result->state);
}
else
{
printf("未找到编号为%d的自行车信息。\n", target);
}
}
void readDataFromFile(struct BikeInfo** head)
{
FILE* file = fopen("bikeinfo.dat", "r");
if (file == NULL)
{
printf("无法打开文件 bikeinfo.dat\n");
return;
}
struct BikeInfo* newNode;
struct BikeInfo* tail = NULL;
while (!feof(file))
{
newNode = (struct BikeInfo*)malloc(sizeof(struct BikeInfo));
if (fscanf(file, "%d %s %d", &newNode->bikeID, newNode->color, &newNode->state) == 3) {
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
tail->next = newNode;
}
tail = newNode;
} else {
free(newNode);
}
}
fclose(file);
}
[b] 在你的代码中,你声明了两个名为 head 的全局变量,一个用于管理用户信息,一个用于管理自行车信息,这会引起命名冲突和内存泄漏的问题。建议删除第二个 head 的声明,只保留一个全局变量用于管理用户信息。
此外,你在函数 Creat_Bike() 中调用了 saveBikeInfoToFile() 函数来保存自行车信息到文件,但是你没有实现这个函数。你需要添加这个函数的实现,该函数的功能是将自行车信息写入到文件 bikeinfo.dat 中。
另外,你通过调用 saveBikeInfoToFile() 函数来将自行车信息保存到文件中,但是没有调用 freeBikeInfoList() 函数来释放自行车信息链表的内存。建议在程序结束之前调用 freeBikeInfoList() 函数来释放内存。
最后,你在调用 binarySearch() 函数时,传入的参数是 head ,但是 head 参数的类型是 struct BikeInfo** ,而应该传入的是 struct BikeInfo* 类型的头结点。你在函数中有两个全局变量名为 head ,一个是用户信息的头结点,一个是自行车信息的头结点,你需要将自行车信息的头结点传入到 binarySearch() 函数中来进行查找。
以下是修改后的代码示例:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define N 50
#define M 100
typedef struct userinfo
{
char Accont[N];
char Password[N];
char ID[N];
char People_name[N];
}USER;
struct BikeInfo {
int bikeID;
char color[20];
char state[20];
time_t borrowTime;
time_t returnTime;
struct BikeInfo* next;
};
void MainMenu();
void Sign_up_Menu();
void Log_in_Menu();
void BMainMenu();
void CMainMenu();
void Register_system();
void Log_in();
void Sign_in();
void search_bike_Num();
void search_bike_RentTime();
void search_bike_RebackTime();
void search_bike_User();
void Rent_bike();
void Reback_bike();
void X_MaHuateng();
void MaHuateng();
void Creat_Bike(struct BikeInfo** bikeInfoList, int* nptr);
void saveBikeInfoToFile(struct BikeInfo* head);
void freeBikeInfoList(struct BikeInfo* head);
void addBikeInfo(struct BikeInfo** head, int bikeID, const char* color, const char* state);
void printBikeInfoList(struct BikeInfo* head);
void searchByBikeID(struct BikeInfo* head);
struct BikeInfo* binarySearch(struct BikeInfo* head, int targetID);
void bubbleSort(struct BikeInfo* head);
void readDataFromFile(struct BikeInfo** head);
int sign = 0;
char ACCOUNT[N];
struct BikeInfo* head = NULL;
int main()
{
int n;
int numBikes = 0;
USER user[M];
struct BikeInfo* bikeInfoList = NULL;
system("color 2F");
Register_system();
readDataFromFile(&head);
readDataFromFile(&bikeInfoList);
// ...
freeBikeInfoList(head);
freeBikeInfoList(bikeInfoList);
return 0;
}
void MainMenu()
{
// ...
}
void Sign_up_Menu()
{
// ...
}
void Log_in_Menu()
{
// ...
}
void BMainMenu()
{
// ...
}
void CMainMenu()
{
// ...
}
void Register_system()
{
// ...
}
void Log_in()
{
// ...
}
void Sign_in()
{
// ...
}
void search_bike_Num()
{
// ...
}
void search_bike_RentTime()
{
// ...
}
void search_bike_RebackTime()
{
// ...
}
void search_bike_User()
{
// ...
}
void Rent_bike()
{
// ...
}
void Reback_bike()
{
// ...
}
void X_MaHuateng()
{
// ...
}
void MaHuateng()
{
// ...
}
void Creat_Bike(struct BikeInfo** bikeInfoList, int* nptr)
{
// ...
}
void saveBikeInfoToFile(struct BikeInfo* head)
{
FILE* file = fopen("bikeinfo.dat", "a");
if (file == NULL) {
printf("无法打开文件!\n");
return;
}
struct BikeInfo* current = head;
while (current != NULL) {
fprintf(file, "%d\t%s\t%s\n", current->bikeID, current->color, current->state);
current = current->next;
}
fclose(file);
}
void freeBikeInfoList(struct BikeInfo* head)
{
while (head != NULL) {
struct BikeInfo* temp = head;
head = head->next;
free(temp);
}
}
void addBikeInfo(struct BikeInfo** head, int bikeID, const char* color, const char* state)
{
struct BikeInfo* newBike = (struct BikeInfo*)malloc(sizeof(struct BikeInfo));
newBike->bikeID = bikeID;
strcpy(newBike->color, color);
strcpy(newBike->state, state);
newBike->next = NULL;
if (*head == NULL) {
*head = newBike;
} else {
struct BikeInfo* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newBike;
}
}
void printBikeInfoList(struct BikeInfo* head)
{
// ...
}
void searchByBikeID(struct BikeInfo* head)
{
int target;
bubbleSort(head);
printf("请输入要查询的单车号:");
scanf("%d", &target);
struct BikeInfo* result = binarySearch(head, target);
if (result != NULL) {
printf("查询结果:\n");
printf("编号:%d\n", result->bikeID);
printf("颜色:%s\n", result->color);
printf("状态:%s\n", result->state);
} else {
printf("未找到编号为%d的自行车信息。\n", target);
}
}
struct BikeInfo* binarySearch(struct BikeInfo* head, int targetID)
{
struct BikeInfo* start = head;
struct BikeInfo* end = NULL;
while (start != end) {
struct BikeInfo* mid = start;
int count = 0;
while (mid->next != end) {
mid = mid->next;
count++;
}
int midID = mid->bikeID;
if (midID == targetID) {
return mid;
} else if (midID < targetID) {
start = mid->next;
} else {
end = mid;
}
}
return NULL;
}
void bubbleSort(struct BikeInfo* head)
{
int swapped;
struct BikeInfo* ptr1;
struct BikeInfo* lptr = NULL;
if (head == NULL) {
return;
}
do {
swapped = 0;
ptr1 = head;
while (ptr1->next != lptr) {
if (ptr1->bikeID > ptr1->next->bikeID) {
int tempID = ptr1->bikeID;
ptr1->bikeID = ptr1->next->bikeID;
ptr1->next->bikeID = tempID;
char tempColor[20];
strcpy(tempColor, ptr1->color);
strcpy(ptr1->color, ptr1->next->color);
strcpy(ptr1->next->color, tempColor);
char tempState[20];
strcpy(tempState, ptr1->state);
strcpy(ptr1->state, ptr1->next->state);
strcpy(ptr1->next->state, tempState);
swapped = 1;
}
ptr1 = ptr1->next;
}
lptr = ptr1;
} while (swapped);
}
void readDataFromFile(struct BikeInfo** head)
{
FILE* file = fopen("bikeinfo.dat", "r");
if (file == NULL) {
printf("无法打开文件 bikeinfo.dat\n");
return;
}
struct BikeInfo* newNode;
struct BikeInfo* tail = NULL;
while (!feof(file)) {
newNode = (struct BikeInfo*)malloc(sizeof(struct BikeInfo));
if (fscanf(file, "%d %s %s", &newNode->bikeID, newNode->color, newNode->state) == 3) {
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
tail->next = newNode;
}
tail = newNode;
} else {
free(newNode);
}
}
fclose(file);
}
[/b]
|
|