Jianbaiyi 发表于 2023-6-20 15:56:30

ofo共享单车借车系统

设计一个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; //账号
        char Password;//密码
        char ID; //学号
        char People_name;//用户姓名
}USER;

struct BikeInfo {
    int bikeID;// 编号
    char color;//颜色
    char state;//状态
    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; // 用于保存普通用户登录后的账号
struct BikeInfo* head = NULL;

int main()
{
        int n;
        int numBikes = 0;
    USER user; //定义结构体数组保存用户信息
    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, Password;
    char Accont1, Password1, ID1, People_name1;
    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,die2;
                                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, Password1, Password2, ID, People_name;
    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, password1, ID, People_name;
                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 != '\0'; i++) // 检查是否为九位账号
                {
                  if(isdigit(Accont) == 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.bikeID);
      if(bike.bikeID== 0)
      {
            break;
      }
      printf("颜色:");
      scanf("%s", &bike.color);
      printf("状态:");
      scanf("%d", &bike.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.bikeID, bike.color, bike.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;
      scanf("%s", color);
      printf("状态:");
      char state;
      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;
                strcpy(tempColor, ptr1->color);
                strcpy(ptr1->color, ptr1->next->color);
                strcpy(ptr1->next->color, tempColor);

                char tempState;
                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);
}

isdkz 发表于 2023-6-20 16:08:36

在你的代码中,你声明了两个名为 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;
      char Password;
      char ID;
      char People_name;
}USER;

struct BikeInfo {
    int bikeID;
    char color;
    char state;
    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;
struct BikeInfo* head = NULL;

int main()
{
    int n;
    int numBikes = 0;
    USER user;
    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;
                strcpy(tempColor, ptr1->color);
                strcpy(ptr1->color, ptr1->next->color);
                strcpy(ptr1->next->color, tempColor);

                char tempState;
                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);
}
页: [1]
查看完整版本: ofo共享单车借车系统