记录一下(哈~)

/*
链表操作函数修改原因:
原有操作函数第一个链表里面不保存数据,第一条数据保存在next里,很不合理。
导致后面函数的链表操作很不方便,函数形参过多。
现有问题:
1、用户信息修改后退不出来,显示也不太友好。
2、图书管理选择完毕功能号执行完操作后,把功能号再打一遍,否则还要往前翻看功能号含义。

*/



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct book {
  int   num;
  char  ISBN[20];
  char  name[100];
  char  clname[20];
  char  author[20];
  char  company[50];
  char  date[20];
  int   price;
} Book;

typedef struct The_users
{
  int  id;
  char name[20];
  char pwd[20];
  char sex[5];
  char phone[12];
  char right;//普通用户为n,管理员为a
} users;
typedef struct Lnode {
  Book * book;
  struct Lnode *next;
} LNode, *LinkList; //LinkList 为指向结构体 LNode 的指针类型

typedef struct Unode {
  users * user;
  struct Unode *next;
} UNode, *ULinkList;


//变量定义
static LinkList  Linklist_head;//图书管理链表头
static ULinkList ULinkList_head;//用户管理链表头

void first(ULinkList L);//初始页面
void Create_File();
void regist(ULinkList L);//注册
void Login(ULinkList L);//登录
//int InitList(LinkList *L);  //初始化指针L
//int CreateList(LinkList L, LinkList q, Book *book); //初始化指针L的next指针p
//int UInitList(ULinkList *L);
//int UCreateList(ULinkList p, ULinkList q, users *user);
int InsertList(LinkList *L, Book *book);//简化链表操作,含初始化
int InsertUList(ULinkList *L, users *usr);//简化链表操作,含初始化
int admin_menu(ULinkList L);
void user_menu();
int manage(int i);//图书管理菜单
void LocateELem(LinkList L);//查找
int Listinsert(LinkList L); //添加
int ListDelete(LinkList L); //删除
int ListAlter(LinkList L); //修改
int ListOrder(LinkList L);//排序
int ListDefaultOrder(LinkList L);//默认排序
int GetNumber(LinkList L);//统计个数
int showbook(LinkList L);
int bijiao(char *str, char *str1); //模糊查询
void submanage(ULinkList L);//用户管理模块
void Finduser(ULinkList L);//查询用户
int Useradd(ULinkList L); //添加用户
int UserDelete(ULinkList L); //删除用户
int UserAlter(ULinkList L); //修改用户信息
int showusers(ULinkList L);//显示所有用户
int Userorder(ULinkList L);//按账号排序
//ULinkList assign();//用文件给链表里的用户数据赋值

int bijiao(char *str, char *str1)
{
  int i, j;
  int n = 0;
  for(i = 0; i < strlen(str1); i += 2)
  {
    for(j = 0; j < strlen(str); j += 2)
    {
      if(str1[i] == str[j] && str1[i + 1] == str[j + 1])
        n++;
    }
  }
  if(n == strlen(str) / 2) //除以二的原因是一个汉字占两个字节,但n计数原理是当相邻的两个字节都相等时,才自增一
    return 1;
  else
    return 0;
}
//向图书链表链尾插入数据,,当链表为空时初始化并记录表头,把原来的两个函数功能合并
int InsertList(LinkList *L, Book *book)
{
   LinkList    new_element;
   Book *data;
   if ((new_element = (LinkList)malloc(sizeof(LNode))) == NULL)
      return -1;
   if ((data = (Book *)malloc(sizeof(Book))) == NULL)
      return -2;
   *data=*book;
   new_element->book = data;
   new_element->next = NULL;
  if((*L) == NULL) //如果链表为空
  {
    *L=new_element;
    Linklist_head = new_element;
  }
  else
  {
    (*L)->next = new_element;
    *L=(*L)->next;
  }
  return 1;
}

//向用户链表插入数据,当链表为空时初始化并记录表头,把原来的两个函数功能合并
int InsertUList(ULinkList *L, users *usr)
{
  ULinkList    new_element;
  users *data;
  if((new_element = (ULinkList)malloc(sizeof(UNode))) == NULL)
      return -1;
  if ((data = (users *)malloc(sizeof(users))) == NULL)
      return -2;
  *data=*usr;

  new_element->user = data;
  new_element->next = NULL;

  if((*L) == NULL) //如果链表为空
  {
    *L=new_element;
    ULinkList_head = new_element;
  }
  else//否则后面插入
  {
    (*L)->next = new_element;
    *L=(*L)->next;
  }
  return 1;
}

/*
int InitList(LinkList *L)
{
  *L = (LinkList)malloc(1 * sizeof(LNode));
  (*L)->next = NULL;
  return 1;
}
int CreateList(LinkList p, LinkList q, Book *book)
{
  q = (LinkList)malloc(1 * sizeof(LNode)); //p->next初始化★
  q->book = book; //p->next数据域赋值
  q->next = NULL; //p->next指针域为空,等待后续建立连接★
  p->next = q; //p->next指针域与初始化后的指针建立连接
  return 1;
}
int UInitList(ULinkList *L)
{
  *L = (ULinkList)malloc(1 * sizeof(UNode));
  (*L)->next = NULL;
  return 1;
}
int UCreateList(ULinkList p, ULinkList q, users *user)
{
  q = (ULinkList)malloc(1 * sizeof(UNode)); //p->next初始化★
  q->user = user; //p->next数据域赋值
  q->next = NULL; //p->next指针域为空,等待后续建立连接★
  p->next = q; //p->next指针域与初始化后的指针建立连接
  return 1;
}
*/
int main()//---------------------------------主函数---------------------------------
{
  FILE *fp_reader;

  ULinkList L1 = NULL, p1 = NULL;
  users use[] = {
    {10000, "朱金华\0", "123456\0", "男\0", "15151410974\0", 'a'},
    {10001, "尤才军\0", "234567\0", "男\0", "13997729397\0", 'n'},
    {10002, "严守西", "345678", "男", "15149797460", 'n'},
    {10003, "何亮", "456789", "男", "13924585193", 'n'},
    {10004, "蒋通辉", "567900", "男", "13794828143", 'n'},
    {10005, "李瑶", "679011", "女", "15169779927", 'a'},
    {10006, "郑翡翠", "790122", "女", "13527063605", 'n'},
    {10007, "吴虹霖", "901233", "女", "13181508061", 'n'},
    {10008, "吴春喜", "1012344", "女", "13792262726", 'n'},
    {10009, "钱柳", "1123455", "女", "13155261929", 'n'},
  };
  system("color f1");
  fp_reader = fopen(".\\Usersdata.txt", "rb+");
  if(fp_reader == NULL) {
    for(int i=0;i<sizeof(use)/sizeof(users);i++)//sizeof(use)/sizeof(users)计算结构体数组长度
    {
    	InsertUList(&L1,use+i);
    }
    fp_reader = fopen(".\\Usersdata.txt", "wb");
    p1=ULinkList_head;
   while(p1 != NULL) {
      fwrite(p1->user, sizeof(users), 1, fp_reader); //改用二进制写入
      p1 = p1->next;
    }

    fclose(fp_reader);

  } else {

    users tmpuse;
    rewind(fp_reader);
    //因为结尾会多读一次,所以在循环外先读一次
    fread(&tmpuse, sizeof(users), 1, fp_reader);
    while(!feof(fp_reader)) {
      InsertUList(&L1,&tmpuse);
      fread(&tmpuse, sizeof(users), 1, fp_reader);
    }
    fclose(fp_reader);
  }

   p1=ULinkList_head;
   first(p1);
  return 0;
}
void first(ULinkList L)//
{
  int a;
  system("cls");
  printf("\n\n\n\t\t\t欢迎登陆本图书信息管理系统\n\n\n\n\n\n\n");
  printf("\n\n\n\t\t 按 任 意 键 进 入 系 统 ...");
  getchar();
  system("cls");
  printf("\n\n\n\t\t 请选择操作 1登录 2注册 3退出\n");
  printf("\n\t\t请选择您所需要的服务:");
  scanf("%d", &a);
  while(a != 1 && a != 2 && a != 3) {
    printf("\n\t不符合要求,请重新输入:");
    scanf("%d", &a);
  }
  if(a == 1) {
    Login(L);
  } else if(a == 2) {
    regist(L);
  } else {
    printf("退出成功!");
  }
  return;
}
void Login(ULinkList L)//登录
{
  int flag = 0, k = 0;
  char c;
  users a, b; //定义结构体The_users别名
  FILE *fp;
  printf("欢迎来到登录界面!\n");
  fp = fopen(".\\Usersdata.txt", "r");
  fread(&b, sizeof(struct The_users), 1, fp); //读入一个结构体字符块 写入b
  printf("请输入账号\n");
  scanf("%d", &a.id);
  rewind(fp);
  while (1)
  {
    if (a.id == b.id)       //如果有此用户名
    {
      flag = 1;
      break;
    }
    else
    {
      if (!feof(fp)) { //如果文件没有读完
        fread(&b, sizeof(struct The_users), 1, fp);
      } else
        break;
    }
  }
  if(flag == 0)
  {
    printf("此用户名不存在,请重新输入!\n");
    fclose(fp);
    return Login(L);
  }
  printf("请输入密码\n");
  scanf("%s", a.pwd);
  while(strcmp(a.pwd, b.pwd) != 0) {
    printf("密码不正确!请重新输入密码\n");
    scanf("%s", a.pwd);
  }
  if (strcmp(a.pwd, b.pwd) == 0)          /*如果密码匹配*/
  {
    fclose(fp);
    printf("登录成功,欢迎使用!\n");
    if(b.right == 'a') {
      printf("是否修改个人信息?(是:请输入1)\n请输入:");
      scanf("%d", &k);
      if(k == 1) {
        fp = fopen(".\\Usersdata.txt", "r+");
        printf("原信息如下:\n");
        printf("%d %s %s %s %s %c\n", b.id, b.name, b.pwd, b.sex, b.phone, b.right);
        printf("是否修改姓名?(是:y/否:n)\n请输入:");
        getchar();
        scanf("%c", &c);
        if(c == 'y') {
          printf("请输入姓名:");
          scanf("%s", b.name);
        }
        printf("是否修改性别?(是:y/否:n)\n请输入:");
        getchar();
        scanf("%c", &c);
        if(c == 'y') {
          printf("请输入性别:");
          scanf("%s", b.sex);
        }
        printf("是否修改密码?(是:y/否:n)\n请输入:");
        getchar();
        scanf("%c", &c);
        if(c == 'y') {
          printf("请输入密码:");
          scanf("%s", b.pwd);
        }
        printf("是否修改电话号码?(是:y/否:n)\n请输入:");
        getchar();
        scanf("%c", &c);
        if(c == 'y') {
          printf("请输入电话号码:");
          scanf("%s", b.phone);
        }
        fwrite(&b, sizeof(users), 1, fp);
        printf("当前个人信息内容如下:\n");
        printf("%d %s %s %s %s %c\n", b.id, b.name, b.pwd, b.sex, b.phone, b.right);
        fclose(fp);
      }
      admin_menu(L);
    }
    else if(b.right == 'n') {
      printf("是否修改个人信息?(是:请输入1)\n请输入:");
      scanf("%d", &k);
      if(k == 1) {
        fp = fopen(".\\Usersdata.txt", "r+");
        printf("原信息如下:\n");
        printf("%d %s %s %s %s %c\n", b.id, b.name, b.pwd, b.sex, b.phone, b.right);
        printf("是否修改姓名?(是:y/否:n)\n请输入:");
        getchar();
        scanf("%c", &c);
        if(c == 'y') {
          printf("请输入姓名:");
          scanf("%s", b.name);
        }
        printf("是否修改性别?(是:y/否:n)\n请输入:");
        getchar();
        scanf("%c", &c);
        if(c == 'y') {
          printf("请输入性别:");
          scanf("%s", b.sex);
        }
        printf("是否修改密码?(是:y/否:n)\n请输入:");
        getchar();
        scanf("%c", &c);
        if(c == 'y') {
          printf("请输入密码:");
          scanf("%s", b.pwd);
        }
        printf("是否修改电话号码?(是:y/否:n)\n请输入:");
        getchar();
        scanf("%c", &c);
        if(c == 'y') {
          printf("请输入电话号码:");
          scanf("%s", b.phone);
        }
        fwrite(&b, sizeof(users), 1, fp);
        printf("当前个人信息内容如下:\n");
        printf("%d %s %s %s %s %c\n", b.id, b.name, b.pwd, b.sex, b.phone, b.right);
        fclose(fp);
      }
      user_menu();
    }
    return;
  }

}
void user_menu() {
  int a;
  printf("\t\t********************User_MENU*********************\n");//主菜单
  printf("\t\t    1.图书查询模块\n");
  printf("\t\t    0.退出\n");
  printf("\t\t**************************************************\n");
  do
  {
    printf("\n\t请选择您所需要的服务:");
    scanf("%d", &a);
  }
  while(a < 0 || a > 1);
  if(a == 0) {
    printf("\n\t退出成功,谢谢使用图书信息管理系统!");
    return ;
  }
  else {
    manage(0);
  }
}
int admin_menu(ULinkList L)
{
  ULinkList p;
  int a;
  printf("\t\t********************Admin_MENU*********************\n");//主菜单
  printf("\t\t    1.图书管理模块\n");
  printf("\t\t    2.用户管理模块\n");
  printf("\t\t    0.退出\n");
  printf("\t\t***************************************************\n");
  do
  {
    printf("\n\t请选择您所需要的服务:");
    scanf("%d", &a);
  } while(a < 0 || a > 2);
  if(a == 0) {
    FILE *fp;
    p = L;
    fp = fopen(".\\Usersdata.txt", "wb+");//不能用a,否则重复添加
    while(p != NULL) {
      fwrite(p->user, sizeof(users), 1, fp); //改用二进制写入
      p = p->next;
    }
    // fwrite(p,sizeof(users),sizeof(users)/sizeof(users),fp);
    fclose(fp);
    return 0;
  }
  else if(a == 1) {
    manage(1);
  } else {
    submanage(L);
  }
  return 0;
}
/*创建储存用户账号密码的文件*/
void Create_File()
{
  FILE *fp;
  if ((fp = fopen(".\\Usersdata.txt", "r")) == NULL) /*如果此文件不存在*/
  {
    if ((fp = fopen(".\\Usersdata.txt", "w+")) == NULL)
    {
      printf("无法建立文件!\n");
      exit(0);
    }
  }
}
void regist(ULinkList L)//注册
{
  users a, b;
  FILE *fp;
  char temp[20];
  printf("欢迎来到注册界面!\n");
  fp = fopen(".\\Usersdata.txt", "r");
  fread(&b, sizeof(struct The_users), 1, fp);
  printf("请输入账号\n");
  scanf("%d", &a.id);
  while (1)
  {
    if (a.id != b.id)
    {
      if (!feof(fp))    /*如果未到文件尾*/
      {
        fread(&b, sizeof(struct The_users), 1, fp);
      }
      else
        break;
    } else
    {
      printf("该账号,已存在!请重新注册!\n");
      fclose(fp);
      return regist(L);
    }
  }
  printf("请输入姓名:\n");
  scanf("%s", a.name);
  printf("请输入性别(女/男):\n");
  scanf("%s", a.sex);
  while(strcmp(a.sex, "男") != 0 && strcmp(a.sex, "女") != 0) {
    printf("性别输入错误!请重新输入!\n");
    scanf("%s", a.sex);
  }
  printf("请输入电话号码:\n");
  scanf("%s", a.phone);
  printf("请输入密码\n");
  scanf("%s", a.pwd);
  printf("请确认密码\n");
  scanf("%s", temp);
  a.right = 'n';
  while(strcmp(a.pwd, temp) != 0) {
    printf("两次密码不匹配!请重新输入!\n");
    scanf("%s", a.pwd);
    printf("请确认密码\n");
    scanf("%s", temp);
  }
  fp = fopen(".\\Usersdata.txt", "ab");
  fwrite(&a, sizeof(struct The_users), 1, fp);
  printf("账号注册成功,请登录!\n");
  fclose(fp);
  Login(L);
}
int manage(int i) {
  FILE *fp_book;
  LinkList L = NULL, p = NULL;
  Book book[] = {
    {1, "9787302257646", "程序设计基础", "计算机类", "高克宁", "清华大学出版社", "2009年", 25},
    {2, "9787536692930", "活着", "文学类", "余华", "作家出版社", "2012年12月", 25},
    {3, "9787544235016", "百年孤独", "文学类", "加西亚·马尔克斯", "上海译文出版社", "2018年2月", 58},
    {4, "9787536693968", "三体", "科幻类", "刘慈欣", "重庆出版社", "2008年1月", 35},
    {5, "9787536692664", "1984", "政治类", "乔治·奥威尔", "作家出版社", "2014年10月", 28},
    {6, "9787020004981", "红楼梦", "古典类", "曹雪芹", "人民文学出版社", "2017年1月", 68},
    {7, "9787532724599", "简爱", "爱情类", "夏洛蒂·勃朗特 ", "北京燕山出版社 ", "2019年1月", 28},
    {8, "9787020004240", "水浒传", "武侠类", "施耐庵", "人民文学出版社", "2017年1月", 68},
    {9, "9787020105161", "权力的游戏", "史诗类", "乔治·R·R·马丁", "江苏凤凰文艺出版社", "2018年12月", 126},
    {10, "9787532771302", "小王子", "儿童类", "圣埃克苏佩里", "上海译文出版社", "2017年6月", 22},
  };
  int length;
  system("color f1");
  fp_book = fopen(".\\Bookdata.txt", "rb+");
  if(fp_book == NULL) {

    for(int i=0;i<sizeof(book)/sizeof(Book);i++)//sizeof(book)/sizeof(Book)计算结构体数组长度
    {
    	InsertList(&L,book+i);
    }
    fp_book = fopen(".\\Bookdata.txt", "wb");
    p=Linklist_head;
    while(p != NULL) {
      fwrite(p->book, sizeof(Book), 1, fp_book); //改用二进制写入
      p = p->next;
    }
    fclose(fp_book);
  } else {
    Book tmpbook;
    rewind(fp_book);
    //因为结尾会多读一次,所以在循环外先读一次
    fread(&tmpbook, sizeof(Book), 1, fp_book);
    while(!feof(fp_book)) {
      InsertList(&L,&tmpbook);
      fread(&tmpbook, sizeof(Book), 1, fp_book);
    }
    fclose(fp_book);
  }



  if(i == 0) {
    printf("\t欢迎来到图书查询模块!\n");
    printf("\t------------------------------------\n");
    printf("\t0. 退出学图书信息管理系统\n");
    printf("\t1. 查找图书\n");
    printf("\t2. 查看所有图书\n");
    while(1)
    {
      int choose;
      printf("\n\t请输入你要选择的功能前的序号:");
      scanf("%d", &choose);
      while(choose != 0 && choose != 1 && choose != 2) {
        printf("不符合要求,请重新输入:");
        scanf("%d", &choose);
      }
      if(choose == 1)
       {
       	p=Linklist_head;
       	LocateELem(p);
       }
      else if(choose == 2) {
       showbook(Linklist_head);
      }
      else {
        printf("\n\t退出成功,谢谢使用图书信息管理系统!");
        return 0;

      }
    }
  }
  else {
    printf("\t欢迎来到图书管理模块!\n");
    printf("\t------------------------------------\n");
    printf("\t0. 退出学图书信息管理系统\n");
    printf("\t1. 查找图书\n");
    printf("\t2. 添加图书\n");
    printf("\t3. 删除图书\n");
    printf("\t4. 修改图书\n");
    printf("\t5. 按图书价格排序\n");
    printf("\t6. 统计图书数量\n");
    printf("\t7. 查看所有图书\n");
    while(1)
    {
      int choose;
      printf("\n\t请输入你要选择的功能前的序号:");
      scanf("%d", &choose);
      if(choose == 0) {
        printf("\n\t退出成功,谢谢使用图书信息管理系统!");
        fp_book = fopen(".\\Bookdata.txt", "wb+");//不能用a,否则添加重复
        p=Linklist_head;
        while(p != NULL) {
          fwrite(p->book, sizeof(Book), 1, fp_book); //改用二进制写入
          p = p->next;
        }
        fclose(fp_book);
        return 0;
      }

      switch(choose)
      {
      case 1://"1. 查找图书\n");
        LocateELem(Linklist_head);
        break;
      case 2://"2. 添加图书\n");
        Listinsert(Linklist_head);
        break;
      case 3://3. 删除图书\n");
        ListDelete(Linklist_head);
        break;
      case 4://4. 修改图书\n");
        ListAlter(Linklist_head);
        break;
      case 5://5. 按图书价格排序\n");
        ListOrder(Linklist_head);
        p=Linklist_head;
        ListDefaultOrder(p);//默认按序号排序
        break;
      case 6://6. 统计图书数量\n");
        length = GetNumber(Linklist_head);
        printf("\n\t共有%d本图书\n", length);
        break;
      case 7:
        showbook(Linklist_head);
      }
    }
  }
}
void LocateELem(LinkList L)
{
  int choose = 0, flag = 0; //flag=1说明选择方式正确;flag=-1说明查找到图书
  char ISBN[20], name[100], clname[20], author[20], company[50];
  LinkList p = L; //初始化,p指向首元结点
  printf("\n\t请选择查找图书的方式:\n");
  printf("\t1.按ISBN查找:\n");
  printf("\t2.按书名查找:\n");
  printf("\t3.按类型查找:\n");
  printf("\t4.按作者查找:\n");
  printf("\t5.按出版社查找:\n");
  printf("\t请输入:");
  scanf("%d", &choose);
  while(flag != 1) {
    switch(choose) {
    case 1:
      printf("\t请输入要查找图书的ISBN:");
      scanf("%s", ISBN);
      while(p != NULL)
      {
        if(strcmp(ISBN, p->book->ISBN) == 0) {
          printf("%d %s %s %s %s %s %s %d\n", p->book->num, p->book->ISBN, p->book->name, p->book->clname, p->book->author, p->book->company, p->book->date, p->book->price);
          flag = -1;
          break;
        }
        p = p->next;
      }
      if(flag != -1)
        printf("\n\t不存在该图书\n");
      flag = 1;
      break;
    case 2:
      printf("\t请输入要查找图书的名字:");
      scanf("%s", name);
      while(p != NULL)
      {
        if(bijiao(name, p->book->name) == 1) {
          printf("%d %s %s %s %s %s %s %d\n", p->book->num, p->book->ISBN, p->book->name, p->book->clname, p->book->author, p->book->company, p->book->date, p->book->price);
          flag = -1;
        }
        p = p->next;
      }
      if(flag != -1)
        printf("\n\t不存在该图书\n");
      flag = 1;
      break;
    case 3:
      printf("\t请输入要查找图书的类型:");
      scanf("%s", clname);
      while(p != NULL)
      {
        if(bijiao(clname, p->book->clname) == 1) {
          printf("%d %s %s %s %s %s %s %d\n", p->book->num, p->book->ISBN, p->book->name, p->book->clname, p->book->author, p->book->company, p->book->date, p->book->price);
          flag = -1;
        }
        p = p->next;
      }
      if(flag != -1)
        printf("\n\t不存在该图书\n");
      flag = 1;
      break;
    case 4:
      printf("\t请输入要查找图书的作者:");
      scanf("%s", author);
      while(p != NULL)
      {
        if(bijiao(author, p->book->author) == 1) {
          printf("%d %s %s %s %s %s %s %d\n", p->book->num, p->book->ISBN, p->book->name, p->book->clname, p->book->author, p->book->company, p->book->date, p->book->price);
          flag = -1;
        }
        p = p->next;
      }
      if(flag != -1)
        printf("\n\t不存在该图书\n");
      flag = 1;
      break;
    case 5:
      printf("\t请输入要查找图书的出版社:");
      scanf("%s", company);
      while(p != NULL)
      {
        if(bijiao(company, p->book->company) == 1) {
          printf("%d %s %s %s %s %s %s %d\n", p->book->num, p->book->ISBN, p->book->name, p->book->clname, p->book->author, p->book->company, p->book->date, p->book->price);
          flag = -1;
        }
        p = p->next;
      }
      if(flag != -1)
        printf("\n\t不存在该图书\n");
      flag = 1;
      break;
      /*default:
      printf("\n\t请重新输入:");
      scanf("%d",&choose);
      break;*/
    }

  }
}

int Listinsert(LinkList L) //添加图书
{
  LinkList p,q;
  Book *book = (Book *)malloc(1 * sizeof(Book));
  p = L;
  q = (LinkList)malloc(1 * sizeof(LNode)); //插入结点
  while(p->next != NULL)
  {
    p = p->next;
  }
  printf("\t请输入要添加的图书信息:\n");
  printf("\t请输入图书的ISBN:");
  scanf("%s", book->ISBN);
  printf("\t请输入图书的名字:");
  scanf("%s", book->name);
  printf("\t请输入图书的类型:");
  scanf("%s", book->clname);
  printf("\t请输入图书的作者:");
  scanf("%s", book->author);
  printf("\t请输入图书的出版社:");
  scanf("%s", book->company);
  printf("\t请输入图书出版日期:");
  scanf("%s", book->date);
  printf("\t请输入图书的价格:");
  scanf("%d", &(book->price));
  book->num = (p->book->num) + 1;
  q->book = book;
  q->next = NULL;
  p->next = q;
  printf("\n\t添加成功\n");
  return 1;
}

int ListDelete(LinkList L) //删除图书
{
  int flag = 0;
  char ISBN[20];
  LinkList p;
  LinkList q = (LinkList)malloc(1 * sizeof(LNode)); //保存被释放的结点
  LinkList temp = (LinkList)malloc(1 * sizeof(LNode));
  p = L;
  printf("\t请输入你要删除的图书的ISBN:");
  scanf("%s", ISBN);
  while(p->next != NULL)
  {
    if(strcmp(ISBN, p->next->book->ISBN) == 0) {
      q = p->next;
      temp = p->next;
      flag = 1;
      break;
    }
    p = p->next;
  }
  if(flag != 1)
  {
    printf("\n\t找不到此图书\n");
    return 0;
  } else {
    if(temp->next != NULL) {
      temp->next->book->num = temp->book->num;
      temp = temp->next;
    }
    while(temp->next != NULL) {
      temp->next->book->num = (temp->book->num) + 1;
      temp = temp->next;
    }
    if(q->next != NULL) {
      p->next = q->next;
      free(q);
    } else {
      p->next = NULL;
    }
    printf("\n\t删除成功\n");
    return 1;
  }
}

int ListAlter(LinkList L) //修改图书
{
  int choose, price, flag = 0;
  LinkList p;
  char ISBN[20], name[100], clname[20], author[20], company[50], date[20];
  p = L;
  printf("\t请输入你要修改的图书的ISBN:");
  scanf("%s", ISBN);
  while(p->next != NULL)
  {
    if(strcmp(ISBN, p->next->book->ISBN) == 0) {
      p = p->next;
      flag = 1;
      break;
    }
    p = p->next;
  }
  if(flag == 1) {
    while(1)
    {
      printf("\t0. 退出修改\n");
      printf("\t1. 修改ISBN\n");
      printf("\t2. 修改名字\n");
      printf("\t3. 修改类型\n");
      printf("\t4. 修改作者\n");
      printf("\t5. 修改出版社\n");
      printf("\t6. 修改出版日期\n");
      printf("\t7. 修改价格\n");
      printf("\n\t请输入你要选择的功能前的序号:");
      scanf("%d", &choose);
      if(choose == 0)   break;
      switch(choose)
      {
      case 1://"1. 修改ISBN");
        printf("\t请输入图书的ISBN:");
        scanf("%s", ISBN);
        strcpy(p->book->ISBN, ISBN);
        break;
      case 2://"2. 修改名字");
        printf("\t请输入图书的名字:");
        scanf("%s", name);
        strcpy(p->book->name, name);
        break;
      case 3://3. 修改类型");
        printf("\t请输入图书的类型:");
        scanf("%s", clname);
        strcpy(p->book->clname, clname);
        break;
      case 4:
        printf("\t请输入图书的作者:");
        scanf("%s", author);
        strcpy(p->book->author, author);
        break;
      case 5:
        printf("\t请输入图书的出版社:");
        scanf("%s", company);
        strcpy(p->book->company, company);
        break;
      case 6:
        printf("\t请输入图书的出版日期:");
        scanf("%s", date);
        strcpy(p->book->date, date);
        break;
      case 7://修改价格
        printf("\t请输入图书的价格:");
        scanf("%d", &price);
        p->book->price = price;
        break;
      }
    }//while
    printf("\n\t修改成功\n");
  } else {
    printf("\t找不到此图书\n");
    return 0;
  }
  return 1;
}

int ListOrder(LinkList L)//按价格排序
{
  LinkList E = (LinkList)malloc(1 * sizeof(LNode));
  LinkList p = (LinkList)malloc(1 * sizeof(LNode));
  LinkList q = (LinkList)malloc(1 * sizeof(LNode));
  Book *temp = (Book *)malloc(1 * sizeof(Book));
  E = L;
  LinkList pp;
  pp=L;
 // L = L->next;
  while(pp != NULL)
  {
    p = pp;
    q = pp->next;
    while(q != NULL)
    {
      if(p->book->price > q->book->price)
      {
        temp = p->book;
        p->book = q->book;
        q->book = temp;
      }
      q = q->next;
    }
    pp = pp->next;
  }
  pp = E;
  printf("\n\t序号\t\tISBN\t\t名字\t\t\t价格\n");
  while(pp != NULL)
  {
    printf("\t %d \t %-13s \t %-22s \t %d\n", pp->book->num, pp->book->ISBN, pp->book->name, pp->book->price);
    pp = pp->next;
  }
  pp = E;
  return 1;
}
int ListDefaultOrder(LinkList L)//按默认序号排序
{
  LinkList E = (LinkList)malloc(1 * sizeof(LNode));
  LinkList p = (LinkList)malloc(1 * sizeof(LNode));
  LinkList q = (LinkList)malloc(1 * sizeof(LNode));
  Book *temp = (Book *)malloc(1 * sizeof(Book));
  E = L;
  //L = L->next;
  while(L!= NULL)
  {
    p = L;
    q = L->next;
    while(q != NULL)
    {
      if(p->book->num > q->book->num)
      {
        temp = p->book;
        p->book = q->book;
        q->book = temp;
      }
      q = q->next;
    }
    L = L->next;
  }
  L = E;
  return 1;
}

int GetNumber(LinkList L)//统计图书数量
{
  LinkList p ;//= (LinkList)malloc(1 * sizeof(LNode));
  p = L;
  while(p->next != NULL)
  {
    p = p->next;
  }
  return p->book->num;
}

int showbook(LinkList L)
{
 LinkList p=L ;//= (LinkList)malloc(1 * sizeof(LNode));
  p = L;
  printf("----------------------------------------------------------------------------------------------\n");
  printf("序号\tISBN\t\t 名字\t\t类型\t  作者\t\t\t出版社\t\t出版日期\t价格\n");
  while(p != NULL)
  {
    printf(" %d\t %-13s \t %-15s%-9s%-18s%-22s%-16s%d\n", p->book->num, p->book->ISBN, p->book->name, p->book->clname, p->book->author, p->book->company, p->book->date, p->book->price);
    p = p->next;
  }
 // free(p);
  printf("----------------------------------------------------------------------------------------------\n");
  return 1;
}


/*ULinkList assign()                 //用文件给链表里的用户数据赋值
{
	ULinkList head,prep;
	ULinkList p;
	head = prep = (ULinkList)malloc(sizeof(UNode));
	p = (ULinkList)malloc(sizeof(UNode));
	prep->next=p;
	prep=p;
	FILE *fp;
	if((fp = fopen(".\\bin\\Debug\\Usersdata.txt","w+")) !=NULL)
	{
		fseek(fp,0l,SEEK_SET);
		while(!feof(fp))
		{
			p = (ULinkList)malloc(sizeof(UNode));
			fscanf(fp,"%d%s%s%s%s%c",&(p->user->id),p->user->name,p->user->pwd,p->user->sex,p->user->phone,&(p->user->right));
			prep=p;
			free(p);
			prep->next=NULL;
		}
	}
	else
	{
		printf("The file was not open");
		exit(-1);
	 }
	 fclose(fp);
	  return head;
	}*/
void submanage(ULinkList L) {
  //ULinkList p;
  //p = (ULinkList)malloc(sizeof(UNode));
  //p = L->next;
  //p=L;
  //  head=assign();
  printf("\t欢迎来到用户管理模块!\n");
  printf("\t------------------------------------\n");
  printf("\t0. 回到管理员菜单\n");
  printf("\t1. 查找用户\n");
  printf("\t2. 添加用户\n");
  printf("\t3. 删除用户\n");
  printf("\t4. 修改用户信息\n");
  printf("\t5. 查看所有用户\n");
  printf("\t6. 按id大小排序\n");
  while(1)
  {
    int choose;
    printf("\n\t请输入你要选择的功能前的序号:");
    scanf("%d", &choose);
    if(choose == 0) {
      admin_menu(L);
    }
    switch(choose)
    {
    case 1://"1. 查找用户\n");
      Finduser(L);
      break;
    case 2://"2. 添加用户,按id排序!
      Useradd(L);
      break;
    case 3://3. 删除用户\n");
      UserDelete(L);
      break;
    case 4://4. 修改用户信息\n");
      UserAlter(L);
      break;
    case 5://5. 查看所有用户\n");
      showusers(L);
    case 6://6. 排序\n");
      Userorder (L);
    }
  }
}
void Finduser(ULinkList L)
{
  int choose = 0, flag = 0; //flag=1说明选择方式正确;flag=-1说明查找到用户
  char name[20], sex[5], right;
  ULinkList p = L->next; //初始化,p指向首元结点
  printf("\n\t请选择查找用户的方式:\n");
  printf("\t1.按姓名查找:\n");
  printf("\t2.按性别查找:\n");
  printf("\t3.按用户类型查找:\n");
  printf("\t请输入:");
  scanf("%d", &choose);
  while(flag != 1) {
    switch(choose) {
    case 1:
      printf("\t请输入要查找的用户姓名:");
      scanf("%s", name);
      while(p != NULL)
      {
        if(bijiao(name, p->user->name) == 1) {
          printf("id:%d 名字:%s 密码:%s %s 电话:%s 权限:%c\n", p->user->id, p->user->name, p->user->pwd, p->user->sex, p->user->phone, p->user->right);
          flag = -1;
        }
        p = p->next;
      }
      if(flag != -1)
        printf("\n\t不存在该用户\n");
      flag = 1;
      break;
    case 2:
      printf("\t请输入要查找的用户性别:");
      scanf("%s", sex);
      while(p != NULL)
      {
        if(strcmp(sex, p->user->sex) == 0) {
          printf("id:%d 名字:%s 密码:%s %s 电话:%s 权限:%c\n", p->user->id, p->user->name, p->user->pwd, p->user->sex, p->user->phone, p->user->right);
          flag = -1;
        }

        p = p->next;
      }
      if(flag != -1)
        printf("\n\t不存在该用户\n");
      flag = 1;
      break;
    case 3:
      printf("\t请输入要查找的用户类型(a:管理员,n:普通用户):");
      scanf("%c", &right);
      while(p != NULL)
      {
        if(right == 'a') {
          printf("id:%d 名字:%s 密码:%s %s 电话:%s 权限:%c\n", p->user->id, p->user->name, p->user->pwd, p->user->sex, p->user->phone, p->user->right);
          flag = -1;
        }
        p = p->next;
      }
      if(flag != -1)
        printf("\n\t不存在该用户\n");
      flag = 1;
      break;
    default:
      printf("\n\t请重新输入:");
      scanf("%d", &choose);
      break;
    }
  }
}
int Useradd(ULinkList L) //添加用户
{
  ULinkList    p,new_element;
  users *data;
  if((new_element = (ULinkList)malloc(sizeof(UNode))) == NULL)
      return -1;
  if ((data = (users *)malloc(sizeof(users))) == NULL)
      return -2;

  p = L;
  while(p->next != NULL)//到链表尾
  {
    p = p->next;
  }
  printf("\t请输入要添加的用户信息:\n");
  printf("\t请输入用户的id:");
  scanf("%d", &data->id);
  printf("\t请输入用户的名字:");
  scanf("%s", data->name);
  printf("\t请输入用户的密码:");
  scanf("%s", data->pwd);
  printf("\t请输入用户的性别:");
  scanf("%s", data->sex);
  printf("\t请输入用户的电话:");
  scanf("%s", data->phone);
  printf("\t请输入用户的权限:");
  scanf("%c", &(data->right));
  new_element->user = data;
  new_element->next = NULL;
  p->next = new_element;
  printf("\n\t添加成功\n");
  return 1;
}


int UserDelete(ULinkList L) //删除用户
{
  ULinkList p;
  int flag = 0;
  int id;
  ULinkList q = (ULinkList)malloc(1 * sizeof(UNode)); //保存被释放的结点
  ULinkList temp = (ULinkList)malloc(1 * sizeof(UNode));
  p = L;
  printf("\t请输入你要删除的用户id:");
  scanf("%d", &id);
  while(p->next != NULL)
  {
    if(id == p->next->user->id) {
      q = p->next;
      temp = p->next;
      flag = 1;
      break;
    }
    p = p->next;
  }
  if(flag != 1)
  {
    printf("\n\t找不到此用户\n");
    return 0;
  } else {
    if(temp->next != NULL) {
    //  temp->next->user->id = temp->user->id;
      temp = temp->next;
    }
    while(temp->next != NULL) {
      temp = temp->next;
    }
    if(q->next != NULL) {
      p->next = q->next;
      free(q);
    } else {
      p->next = NULL;
    }
    printf("\n\t删除成功\n");
    return 1;
  }
}

int UserAlter(ULinkList L) //修改用户信息
{
  ULinkList p;
  int choose, flag = 0, id;
  char name[20], pwd[20], sex[5], phone[12], right;
  p = L;
  printf("\t请输入你要修改的用户的账号:");
  scanf("%d", &id);
  while(p->next != NULL)
  {
    if(id == p->next->user->id) {
      p = p->next;
      flag = 1;
      break;
    }
    p = p->next;
  }
  if(flag == 1) {
    while(1)
    {
      printf("\t0. 退出修改\n");
      printf("\t1. 修改密码\n");
      printf("\t2. 修改名字\n");
      printf("\t3. 修改性别\n");
      printf("\t4. 修改电话\n");
      printf("\t5. 修改权限\n");
      printf("\n\t请输入你要选择的功能前的序号:");
      scanf("%d", &choose);
      if(choose == 0)   break;
      switch(choose)
      {
      case 1:
        printf("\t请输入用户的密码:");
        scanf("%s", pwd);
        strcpy(p->user->pwd, pwd);
        break;
      case 2:
        printf("\t请输入用户的名字:");
        scanf("%s", name);
        strcpy(p->user->name, name);
        break;
      case 3:
        printf("\t请输入用户的性别:");
        scanf("%s", sex);
        strcpy(p->user->sex, sex);
        break;
      case 4:
        printf("\t请输入用户的电话:");
        scanf("%s", phone);
        strcpy(p->user->phone, phone);
        break;
      case 5:
        printf("\t请输入用户的权限:");
        scanf("%c", &right);
        p->user->right = right;
        break;
      }
    }//while
    printf("\n\t修改成功\n");
  } else {
    printf("\t找不到此用户\n");
    return 0;
  }
  return 1;
}

int Userorder(ULinkList L)//按账号排序
{
  ULinkList E = (ULinkList)malloc(1 * sizeof(UNode));
  ULinkList p = (ULinkList)malloc(1 * sizeof(UNode));
  ULinkList q = (ULinkList)malloc(1 * sizeof(UNode));
  users *temp = (users *)malloc(1 * sizeof(users));
  E = L;
  L = L->next;
  while(L->next != NULL)
  {
    p = L;
    q = L->next;
    while(q != NULL)
    {
      if(p->user->id > q->user->id)
      {
        temp = p->user;
        p->user = q->user;
        q->user = temp;
      }
      q = q->next;
    }
    L = L->next;
  }
  L = E;
  return 1;
}
int showusers(ULinkList L)
{
  //ULinkList p = (ULinkList)malloc(1 * sizeof(UNode));
  //p = L->next;

  ULinkList p=L;
  printf("--------------------------------------------------------------------------------------------\n");
  printf("账号\t  名字\t   性别   电话\t\t权限\n");
  while(p != NULL)
  {
    printf("%-10d%-10s%-4s%-15s %c\n", p->user->id, p->user->name, p->user->sex, p->user->phone, p->user->right);
    p = p->next;
  }
  //free(p);
  printf("--------------------------------------------------------------------------------------------\n");
  return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值