/*
链表操作函数修改原因:
原有操作函数第一个链表里面不保存数据,第一条数据保存在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;
}
12-06
2465
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-15
1375
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-30