图书管理系统(包含全部加分点,超清晰思路)(仅供参考,请勿抄袭!!!)

标题概述:

该图书管理系统代码注释清晰,结构清楚,有一定容错性与用户性,也对一些操作进行了算法优化(指针查找时间复杂度(O(1))、二分法查找书号时间复杂度O(log n),感觉很适合有一定C语言基础的大一小白学习。(也是庆祝我大一圆满结束)

标题内容概要:

本文内容包括:源代码、实验报告(内含代码解说)、各个模块讲解
正文:

标题PS:由于本文末尾附带的实验报告对代码的结构与创作思路讲解的比较全面,以及文章末尾的源代码注释比较清晰,所以本文正文内容旨在简述模块思路。

标题模块讲解:

过段时间再更新,感兴趣的小伙伴可以评论或者私信我催更,我会更的快一点。不急的话不用催,过段时间有时间了会更。

标题含注释的源代码:

在这里插入代码片
```#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define MAXLEN 20
#include<conio.h>
//#include<curses.h>
//#include <termios.h>
#include <unistd.h>
#define N 200
struct YH//用户信息链表
{
    char name[20];//用户名
    char key[20];//密码
    int kind;//1.普通读者 2.图书管理员 3.系统管理员
    struct YH *next;
};

struct DZ//读者信息链表
{
    char id[100];//读者号
    char name[20];//读者名
    char home[40];//单位
    long long lx;//联系方式
    int kj;//可借书数
    int yj;//已借书数
    struct DZ *next;
};

struct TS//图书结构体
{
    int flag;//序号
    char num[20];//书号
    char name[40];//书名
    char writer[20];//作者
    char club[20];//出版社
    int  kj;//藏书数
    int  yj;//借出数
    int  p1;//书名
    int  p2;//作者
    int  p3;//出版社
}books[N];
//*****************************************图书检索结构体*********************************************
struct bookname//书名索引
{
    char name[40];
    int p1;//书名链头指针
    int len;
}booknames[N];
struct bookwriter//作者索引
{
    char writer[20];
    int p2;//作者链头指针
    int len;
}bookwriters[N];
struct bookclub//出版社索引
{
    char club[20];
    int p3;//出版社链头指针
    int len;
}bookclubs[N];
struct JH//借还书结构体
{
    char readernum[20];//读者号
    char num[100];//书号
    char lenddate[100];//借书日期
    char backdate[100];//还书日期
    char note[200];//备注
    struct JH *next;//建立链表
};
//*****************************************登录系统***************************************************//
int login();

//*****************************************菜单*******************************************************//
void menumain();//主菜单
void menuuser();//用户管理菜单
void menureader();//读者管理菜单
void menubook();//图书管理菜单
void menubooksearch();//图书查询子系统
void menubookstream();//图书流通子菜单

//*****************************************用户管理子系统*******************************************************//
void user();//用户子系统主函数
void user_input(struct YH *head);//输入用户信息进入文件
struct YH *user_get(struct YH *head);//从用户文件中读出数据储存在链表中,返回头指针
void user_storage(struct YH *head);//将链表信息储存到文件中
void user_change(struct YH *head);//修改用户信息
void user_delete(struct YH *head);//删除用户信息
void user_display(struct YH *head);//显示用户信息
void user_passwdchange(struct YH *head);//用户改密
//*****************************************读者管理系统***********************************************//
void reader(int men);//读者管理子系统
struct DZ *reader_get(struct DZ *head);//从文件中读出数据构建链表,返回链表头指针
void reader_storage(struct DZ *head);//将链表中文件写入读者文件中
void reader_input(struct DZ *head);//输入
void reader_change(struct DZ *head);//修改
void reader_delete(struct DZ *head);//删除
void reader_display(struct DZ *head);//显示
void reader_search(struct DZ *head);//查询
//*****************************************图书管理系统*******************************************
void book(int men);//图书子系统
void book_get();//从文件中读取到一维数组里 主文件
void bookname_get();//从文件中读取到一维数组里 书名
void bookwriter_get();//从文件中读取到一维数组里 作者
void bookclub_get();//从文件中读取到一维数组里 出版社
void book_storage();//储存回文件里 主文件
void bookname_storage();//储存回文件里 书名
void bookwriter_storage();//储存回文件里 作者
void bookclub_storage();//储存回文件里 出版社
void booknum_storage();//储存回文件里 书号
void make_num_list();//用插入法制作按书号排序的一维数组
void insert();//插入函数
void book_input();//输入
void book_change();//修改
void book_delete();//删除
void book_search();//查询
void book_total();//汇总
//****************************************图书查询子系统************************************************
void boo_search_num();//书号查询
void boo_search_name();//书名查询
void boo_search_writer();//作者查询
void boo_search_club();//出版社查询
//****************************************图书流通系统**************************************************
void bookstream();//流通主函数
struct JH *bookstream_get();//流通获取链表
void bookstream_storage();//流通储存
void book_borrow();//借书
void book_giveback();//还书
//*****************************************工具函数*******************************************************//
void cls();//清屏函数
void secretword(char key[]);//密码加密函数
void getMaskedPassword();//密码加密函数1
void setEcho();//密码加密函数2
//***********************************************************
int main()
{
    int type = login();//先登录再显示主菜单
	int n;//n为主菜单选项
	menumain();
	printf("您需要处理的业务为:");
	while(scanf("%d",&n)&&n!=5)
    {
        switch(n)
        {
            case 1: user(type);break;
            case 2: reader(type);break;
            case 3: book(type);break;
            case 4: bookstream(type);break;
            default:printf("操作失败\n");
        }
        menumain();
        printf("您需要处理的业务为:");
    }
	return 0;
}


//*****************************************菜单*******************************************************//
void menumain()
{
        printf("***************************************************\n");
    	printf("\t1.用户管理\n");
    	printf("\t2.读者管理\n");
    	printf("\t3.图书管理\n");
    	printf("\t4.图书流通管理\n");
    	printf("\t5.退出系统\n");
    	printf("***************************************************\n");
}

void menuuser()
{
        printf("***************************************************\n");
    	printf("\t1.用户信息输入\n");
    	printf("\t2.用户信息修改\n");
    	printf("\t3.用户信息删除\n");
    	printf("\t4.用户信息显示\n");
    	printf("\t5.用户密码修改\n");
    	printf("\t6.返回主菜单\n");
    	printf("***************************************************\n");

}

void menureader()
{
    printf("***************************************************\n");
    printf("\t1.读者信息输入\n");
    printf("\t2.读者信息修改\n");
    printf("\t3.读者信息删除\n");
    printf("\t4.读者信息查询\n");
    printf("\t5.读者信息显示\n");
    printf("\t6.返回主菜单\n");
    printf("***************************************************\n");
}
void menubook()
{
    printf("***************************************************\n");
    printf("\t1.图书信息输入\n");
    printf("\t2.图书信息修改\n");
    printf("\t3.图书信息查询\n");
    printf("\t4.汇总统计\n");
    printf("\t5.返回主菜单\n");
    printf("***************************************************\n");
}
void menubooksearch()
{
    printf("***************************************************\n");
    printf("\t1.按书号查询\n");
    printf("\t2.按书名查询\n");
    printf("\t3.按作者查询\n");
    printf("\t4.按出版社查询\n");
    printf("\t5.返回主菜单\n");
    printf("***************************************************\n");
}
void menubookstream()
{
    printf("***************************************************\n");
    printf("\t1.借书处理\n");
    printf("\t2.还书处理\n");
    printf("\t3.返回主菜单\n");
    printf("***************************************************\n");
}
//*****************************************登录系统***************************************************//
int login()
{
    printf("请输入用户名:");
    struct YH *head=NULL,*t=NULL;
    head=user_get(head);
    char NAME[100];
    scanf("%s",NAME);
    t=head;
    while(t!=NULL){
        if(strcmp(t->name,NAME)==0)
        {
            printf("请输入密码:");

            int i=4;
            while(i--)
            {
                char password[64];
                //if(i==3)
                //printf("请输入是否加密(y/n)\n");
                //getMaskedPassword(password, sizeof(password));
                //scanf("%s",password);
                secretword(password);
                if(strcmp(password,t->key)==0)
                {
                    cls();
                    printf("登陆成功!您的身份是");
                    switch(t->kind)
                    {
                    case 1:
                        printf("普通用户!\n");
                        break;
                    case 2:
                        printf("图书管理员!\n");
                        break;
                    case 3:
                        printf("系统管理员!\n");
                        break;
                    }
                    return t->kind;
                }
                else{
                    if(i!=3)
                    {
                        printf("密码错误,您还有%d次机会!\n",i);
                    }
                }
            }
            printf("输入密码次数过多!,请重新打开系统。");
            exit(0);
        }
        t=t->next;
    }
    printf("未找到该用户!\n");
    exit(0);
}


//*****************************************用户管理子系统*******************************************************//
void user(int men)//用户管理子系统功能大全
{
    cls();
    while(1){
        struct YH *head=NULL;
        head=user_get(head);//从用户文件中读出数据得到的链表
        menuuser();
        int temp;
        scanf("%d",&temp);
        cls();
        if(temp==1 && men==3)
            user_input(head);
        else if(temp==2 && men==3)
            user_change(head);
        else if(temp==3 && men==3)
            user_delete(head);
        else if(temp==4 && men==3)
            user_display(head);
        else if(temp==5)
            user_passwdchange(head);
        else if(temp==6)
            break;
        else{
            printf("不能使用!");
            printf("输入r返回子程序:");
            char r='0';
            do{
                scanf(" %c",&r);
            }while(r!='r'&&r!='R');
            cls();
            continue;
        }
        cls();
    }
}

struct YH *user_get(struct YH *head)//从用户文件中读出数据储存在链表中,返回头指针
{
    FILE *fp=fopen("user.txt","rt");
    if(fp==NULL){
        printf("user.txt文件打开失败!\n");
        exit(1);
    }
    struct YH *p,*t;
    char line[1024];
    while(1){
        char *ret=fgets(line,sizeof(line),fp);
        if(ret==NULL){
            break;
        }
        p=(struct YH *)malloc(sizeof(struct YH));
        sscanf(line,"%s%s%d",p->name,p->key,&p->kind);
        p->next=NULL;
        if(head==NULL)
            head=p;
        else{
            t=head;
            if(strcmp(p->name,t->name)<0){
                p->next=head;
                head=p;
            }else{
                while(t!=NULL){
                    if(t->next==NULL || strcmp(t->next->name,p->name)>0){
                        p->next=t->next;
                        t->next=p;
                        break;
                    }
                    t=t->next;
                }
            }
        }
    }
    return head;//返回头指针
}

void user_input(struct YH *head)//输入用户信息进入文件
{
    struct YH *t,*p;
    printf("请输入要输入用户的数量:");
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        p=(struct YH *)malloc(sizeof(struct YH));
        printf("请输入用户%d的用户名:",i);
        scanf("%s",p->name);
        p->next=NULL;
        if(head==NULL)
            head=p;
        else{
            t=head;
            if(strcmp(p->name,t->name)<0){
                printf("请输入用户%d的密码:",i);
                scanf("%s",p->key);
                printf("请输入用户%d的用户种类(1.普通读者 2.图书管理员 3.系统管理员):",i);
                scanf("%d",&p->kind);
                p->next=head;
                head=p;
            }else{
                while(t!=NULL){
                    if(strcmp(t->name,p->name)==0){
                        printf("该用户已经存在!\n");
                        break;
                    }
                    if(t->next==NULL || strcmp(t->next->name,p->name)>0){
                        printf("请输入用户%d的密码:",i);
                        scanf("%s",p->key);
                        printf("请输入用户%d的用户种类(1.普通读者 2.图书管理员 3.系统管理员):",i);
                        scanf("%d",&p->kind);
                        p->next=t->next;
                        t->next=p;
                        printf("输入成功!");
                        break;
                    }
                    t=t->next;
                }
            }
        }
    }
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
    user_storage(head);
}

void user_storage(struct YH *head)//将链表信息储存到文件中
{
    FILE *fp=fopen("user.txt","wt");
    if(fp==NULL){
        printf("user.txt文件打开失败!\n");
        exit(1);
    }
    char line[500];
    struct YH *t=head;
    while(t!=NULL){
        sprintf(line,"%s\t\t%s\t\t%d\n",t->name,t->key,t->kind);
        fputs(line,fp);
        t=t->next;
    }
    fclose(fp);
}

void user_change(struct YH *head)//修改用户信息
{
    struct YH *t=head;
    printf("请输入要修改用户的用户名:");
    char NAME[100];
    scanf("%s",NAME);
    int cnt=0;
    while(t!=NULL){
        if(strcmp(t->name,NAME)==0){
            printf("请输入要修改的内容(1.用户名;2.密码;3.用户类型):");
            int temp;
            scanf("%d",&temp);
            if(temp==1){
                printf("请输入修改后的用户名:");
                scanf("%s",t->name);
            }
            if(temp==2){
                printf("请输入修改后的密码:");
                scanf("%s",t->key);
            }
            if(temp==3){
                printf("请输入修改后的用户类型(1.普通用户;2.图书管理员;3.系统管理员):");
                scanf("%d",&t->kind);
            }
            cnt=1;
            printf("修改成功!");
        }
        t=t->next;
    }
    if(cnt==0)
        printf("该用户不存在!");
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
    user_storage(head);
}

void user_delete(struct YH *head)//删除
{
    struct YH *t=head,*q;
    char NAME[100];
    printf("请输入要删除用户的用户名:");
    scanf("%s",NAME);
    if(strcmp(t->name,NAME)==0){
        head=t->next;
        free(t);
    }
    while(t!=NULL && strcmp(t->name,NAME)!=0){
        q=t;
        t=t->next;
    }
    if(t!=NULL){
        q->next=t->next;
        free(t);
    }
    printf("删除成功!");
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
    user_storage(head);
}

void user_display(struct YH *head)//显示
{
    struct YH *t=head;
    printf("用户名\t\t密码\t\t用户类型(1.普通用户;2.图书管理员;3.系统管理员;)\n");
    while(t!=NULL){
        printf("%s\t\t%s\t\t\t%d\n",t->name,t->key,t->kind);
        t=t->next;
    }
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
}

void user_passwdchange(struct YH *head)//改密
{
    struct YH *t=head;
    printf("请输入您的用户名:");
    char NAME[100];
    scanf("%s",NAME);
    while(t!=NULL){
        if(strcmp(t->name,NAME)==0){
            printf("请输入修改后的密码:");
            scanf("%s",t->key);
            printf("修改成功!");
            printf("输入r返回子程序:");
            char r='0';
            do{
                scanf(" %c",&r);
            }while(r!='r'&&r!='R');
            cls();
        }
        t=t->next;
    }
    user_storage(head);
}

//*****************************************读者管理系统***********************************************//
void reader(int men)//读者管理子系统
{
    cls();
    while(1){
        menureader();
        struct DZ *head=NULL;
        head=reader_get(head);
        int temp;
        scanf("%d",&temp);
        cls();
        if(temp==1&&men==2)
            reader_input(head);
        else if(temp==2&&men==2)
            reader_change(head);
        else if(temp==3&&men==2)
            reader_delete(head);
        else if(temp==4&&men==2)
            reader_search(head);
        else if(temp==5&&men==2)
            reader_display(head);
        else if(temp==6)
            break;
        else{
            printf("不能使用!");
            printf("输入r返回子程序:");
            char r='0';
            do{
                scanf(" %c",&r);
            }while(r!='r'&&r!='R');
            cls();
            continue;
        }
    }
}
struct DZ *reader_get(struct DZ *head)//从文件中读出数据构建链表,返回链表头指针
{
    FILE *fp=fopen("reader.txt","rt");
    if(fp==NULL){
        printf("reader.txt文件打开失败!\n");
        exit(1);
    }
    struct DZ *p,*t;
    char line[1024];
    while(1){
        char *ret=fgets(line,sizeof(line),fp);
        if(ret==NULL){
            break;
        }
        p=(struct DZ *)malloc(sizeof(struct DZ));
        sscanf(line,"%s%s%s%lld%d%d",p->id,p->name,p->home,&p->lx,&p->kj,&p->yj);
        p->next=NULL;
        if(head==NULL)
            head=p;
        else{
            t=head;
            if(p->id<t->id){
                p->next=head;
                head=p;
            }else
            {
                while(t!=NULL){
                    if(t->next==NULL || t->next->name>p->name){
                        p->next=t->next;
                        t->next=p;
                        break;
                    }
                    t=t->next;
                }
            }
        }
    }
    return head;
}
void reader_storage(struct DZ *head)//将链表中文件写入读者文件中
{
    FILE *fp=fopen("reader.txt","wt");
    if(fp==NULL){
        printf("reader.txt文件打开失败!\n");
        exit(1);
    }
    char line[500];
    struct DZ *t=head;
    while(t!=NULL){
        sprintf(line,"%s\t\t%s\t\t%s\t\t%lld\t\t%d\t%d\n",t->id,t->name,t->home,t->lx,t->kj,t->yj);
        fputs(line,fp);
        t=t->next;
    }
    fclose(fp);
}
void reader_input(struct DZ *head)//输入
{
    struct DZ *t,*p;
    printf("请输入要输入读者的数量:");
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        p=(struct DZ *)malloc(sizeof(struct DZ));

        struct YH *yhead,*op;//连接用户代码块
        yhead=user_get(yhead);
        int flag1=0;

        A:;//要是没有对应的用户名就重新输入!!!
        printf("请输入读者%d的读者号:",i);
        scanf("%s",p->id);
        printf("正在读者文件中查找是否已经存在对应账号\n");
        struct DZ *k=head;//查找输入的读者号是否与已经存在的读者重复
        while(k!=NULL)
        {
            if(strcmp(k->id,p->id)==0)
            {
                printf("读者文件中已经存在对应账号,请重新输入!!!\n");
                goto A;
            }
            k=k->next;
        }
        printf("恭喜你,读者文件中无该账号!\n");
        printf("正在用户文件中查找是否有对应账号\n");

        //在user文件查找用户名与读者名是否一致
        op=yhead;//防止查询过程中迭代指针op被消耗
        while(op!=NULL)
        {
            if(strcmp(p->id,op->name)==0)
            {
                flag1=1;
                printf("已找到该用户!\n");
                break;
            }
            op=op->next;
        }
        if(flag1==0)
        {
            printf("未找到该用户!\n");
            goto A;
        }
        printf("请输入读者%d的读者名:",i);
        scanf("%s",p->name);
        printf("请输入读者%d的单位:",i);
        scanf("%s",p->home);
        printf("请输入读者%d的联系方式:",i);
        scanf("%lld",&p->lx);
        printf("请输入读者%d的可借书数:",i);
        scanf("%d",&p->kj);
        printf("请输入读者%d的已借书数:",i);
        scanf("%d",&p->yj);
        p->next=NULL;
        if(head==NULL)
            head=p;
        else{
            t=head;
            if(strcmp(p->name,t->name)<0){
                p->next=head;
                head=p;
            }else{
                while(t!=NULL){
                    if(strcmp(t->name,p->name)==0){
                        printf("该读者已经存在!\n");
                        break;
                    }
                    if(t->next==NULL || strcmp(t->next->name,p->name)>0){
                        p->next=t->next;
                        t->next=p;
                        break;
                    }
                    t=t->next;
                }
            }
        }
    }
    printf("输入成功!");
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
    reader_storage(head);
}
void reader_change(struct DZ *head)//修改
{
    struct DZ *t=head;
    printf("请输入要修改读者的读者名:");
    char NAME[100];
    scanf("%s",NAME);
    while(t!=NULL){
        if(strcmp(t->name,NAME)==0){

            printf("请输入要修改的内容(1.读者号;2.读者名;3.单位;4.联系方式;5.可借书数;6.已借书数);\n");
            int temp;scanf("%d",&temp);
            if(temp==1){
                printf("警告!!!读者号与用户名相同,修改读者号的同时用户名也会一同修改!!!\n");
                printf("是否继续修改读者号?(y/n)\n");
                char c;
                scanf(" %c",&c);
                if(c=='y'||c=='Y')
                {
                    struct YH *yhead,*op;//连接用户代码块
                    yhead=user_get(yhead);
                    op=yhead;
                    //在user文件查找用户名与读者名是否一致
                    while(op!=NULL)//找到那个用户op
                    {
                        if(strcmp(t->id,op->name)==0)
                        {
                            //printf("已找到该用户!\n");
                            break;
                        }
                        op=op->next;
                    }
                    cls();
                    C:
                    printf("请输入修改后的读者号:\n");
                    scanf("%s",t->id);
                    if(strcmp(t->id,op->name)==0)//不能重复(检查的读者文件中也会检查到,但是这样提醒一下更好)
                    {
                        printf("输入的读者号与原来的一样,请重新输入!!!\n");
                        goto C;
                    }
                    struct YH *oq=yhead;//oq是第二次查找使用的迭代指针
                    int flag2=0;
                    while(oq!=NULL)//用户文件中查重
                    {
                        if(strcmp(t->id,oq->name)==0)
                        {
                            printf("已经有这个用户名了,请重新输入!!!\n");
                            goto C;
                        }
                        oq=oq->next;
                    }
                    //所有读者都来自用户,所以没必要再对读者文件进行检查
                    strcpy(op->name,t->id);//正式修改
                    user_storage(yhead);//用户储存
                }
                else
                {
                    cls();
                    goto B;
                }
            }
            if(temp==2){
                printf("请输入修改后的读者名:");
                scanf("%s",t->name);
            }
            if(temp==3){
                printf("请输入修改后的单位:");
                scanf("%s",t->home);
            }
            if(temp==4){
                printf("请输入修改后的联系方式:");
                scanf("%lld",&t->lx);
            }
            if(temp==5){
                printf("请输入修改后的可借书数:");
                scanf("%d",&t->kj);
            }
            if(temp==6){
                printf("请输入修改后的已借书数:");
                scanf("%d",&t->yj);
            }
            cls();
            printf("修改成功!\n是否继续修改?(y/n)");
            char cnt;
            scanf(" %c",&cnt);
            if(cnt=='y'){
                cls();
                continue;
            }
            cls();
        }
        t=t->next;
    }
    B:
    reader_storage(head);
}
void reader_delete(struct DZ *head)//删除
{
    struct DZ *t=head,*q;
    char NAME[100];
    printf("请输入要删除读者的读者名:");
    scanf("%s",NAME);
    if(strcmp(t->name,NAME)==0){
        head=t->next;
        free(t);
    }
    while(t!=NULL && strcmp(t->name,NAME)!=0){
        q=t;
        t=t->next;
    }
    if(t!=NULL){
        q->next=t->next;
        free(t);
    }
    printf("删除成功!");
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
    reader_storage(head);
}
void reader_search(struct DZ *head)//查询
{
    struct DZ *t=head;
    printf("请输入要查询读者的读者:");
    char NAME[100];
    scanf("%s",NAME);
    while(t!=NULL){
        if(strcmp(t->name,NAME)==0){
            printf("该用户信息为:\n");
            printf("读 者 号:%s\n",t->id);
            printf("单    位:%s\n",t->home);
            printf("联系方式:%lld\n",t->lx);
            printf("可借书数:%d\n",t->kj);
            printf("已借书数:%d\n",t->yj);
        }
        t=t->next;
    }
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
}
void reader_display(struct DZ *head)//显示
{
    struct DZ *t=head;
    printf("读者号\t\t读者名\t\t单位\t\t联系方式\t\t可借书数\t\t已借书数\n");
    while(t!=NULL){
        printf("%s\t\t%s\t\t%s\t\t%lld\t\t%5d\t\t%5d\n",t->id,t->name,t->home,t->lx,t->kj,t->yj);
        t=t->next;
    }
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
}
//*****************************************图书子系统*****************************************************//
int len=0;
int lenname=0;//下标
int lenwriter=0;//下标
int lenclub=0;//下标
struct TS searchnum[N];//建立主索引表 N=2000
int l=1;//索引表当前长度
void book(int men)//用户管理子系统功能大全
{
    cls();
    while(1){



        book_get();
        bookname_get();
        bookwriter_get();
        bookclub_get();

        menubook();


        int temp;
        scanf("%d",&temp);
        cls();
        if(temp==1 && men==2)
            book_input();
        else if(temp==2 && men==2)
            book_change();
        else if(temp==3)
            book_search();//进入图书查询子系统
        else if(temp==4)
            book_total();//还没写
        else if(temp==5)
            break;
        else{
            printf("不能使用!\n");
            continue;
        }
        make_num_list();
        booknum_storage();
        cls();
    }
}
//**********************************************从文件中分别读取四个图书文件**********************************************

void book_get()//读取book.txt并存到一维数组books中
{
    FILE *fp=fopen("book.txt","r");
    if(fp==NULL){
        printf("book.txt文件打开失败!\n");
        exit(1);
    }
    char line[1024];
    int t=1;
    while(1){
        char *ret=fgets(line,sizeof(line),fp);
        if(ret==NULL){
            break;
        }
        len=t;
        sscanf(line,"%d%s%s%s%s%d%d%d%d%d",&books[t].flag,books[t].num,books[t].name,books[t].writer,books[t].club,&books[t].kj,&books[t].yj,&books[t].p1,&books[t].p2,&books[t].p3);
        t++;
        //printf("%d\n",books[t-1].num);

    }
    fclose(fp);
}

void bookname_get()
{
    FILE *fp=fopen("bookname.txt","r");
    if(fp==NULL){
        printf("bookname.txt文件打开失败!\n");
        exit(1);
    }
    char line[1024];
    int t=1;
    while(1){
        char *ret=fgets(line,sizeof(line),fp);
        if(ret==NULL){
            break;
        }
        lenname=t;
        sscanf(line,"%s%d%d",booknames[t].name,&booknames[t].p1,&booknames[t].len);
        t++;

    }
    fclose(fp);
}

void bookwriter_get()
{
    FILE *fp=fopen("bookwriter.txt","r");
    if(fp==NULL){
        printf("bookwriter.txt文件打开失败!\n");
        exit(1);
    }
    char line[1024];
    int t=1;
    while(1){
        char *ret=fgets(line,sizeof(line),fp);
        if(ret==NULL){
            break;
        }
        lenwriter=t;
        sscanf(line,"%s%d%d",bookwriters[t].writer,&bookwriters[t].p2,&bookwriters[t].len);
        t++;

    }
    fclose(fp);
}

void bookclub_get()
{
    //printf("hello club------\n");
    FILE *fp=fopen("bookclub.txt","r");
    if(fp==NULL){
        printf("bookclub.txt文件打开失败!\n");
        exit(1);
    }
    char line[1024];
    int t=1;
    while(1){
        char *ret=fgets(line,sizeof(line),fp);
        if(ret==NULL){
            break;
        }
        lenclub=t;
        sscanf(line,"%s%d%d",bookclubs[lenclub].club,&bookclubs[lenclub].p3,&bookclubs[lenclub].len);
        t++;

    }
    fclose(fp);
}
//************************************************分别将四个一维数组储存到文件中****************************
void book_storage()
{
    FILE *fp=fopen("book.txt","wt");
    if(fp==NULL){
        printf("book.txt文件打开失败!\n");
        exit(1);
    }
    char line[600];
    int i;
    for(i=1;i<=len;i++){
        sprintf(line,"%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",books[i].flag,books[i].num,books[i].name,books[i].writer,books[i].club,books[i].kj,books[i].yj,books[i].p1,books[i].p2,books[i].p3);
        fputs(line,fp);
    }
    fclose(fp);
}
void bookname_storage()
{
    FILE *fp=fopen("bookname.txt","wt");
    if(fp==NULL){
        printf("bookname.txt文件打开失败!\n");
        exit(1);
    }
    char line[600];
    int i;
    for(i=1;i<=lenname;i++){
        sprintf(line,"%s\t\t%d\t\t%d\n",booknames[i].name,booknames[i].p1,booknames[i].len);
        fputs(line,fp);
    }
    fclose(fp);
}
void bookwriter_storage()
{
    FILE *fp=fopen("bookwriter.txt","wt");
    if(fp==NULL){
        printf("bookwriter.txt文件打开失败!\n");
        exit(1);
    }
    char line[600];
    int i;
    for(i=1;i<=lenwriter;i++){
        sprintf(line,"%s\t\t%d\t\t%d\n",bookwriters[i].writer,bookwriters[i].p2,bookwriters[i].len);
        fputs(line,fp);
    }
    fclose(fp);
}
void bookclub_storage()
{
    FILE *fp=fopen("bookclub.txt","wt");
    if(fp==NULL){
        printf("bookclub.txt文件打开失败!\n");
        exit(1);
    }
    char line[600];
    int i;
    for(i=1;i<=lenclub;i++){
        sprintf(line,"%s\t\t%d\t\t%d\n",bookclubs[i].club,bookclubs[i].p3,bookclubs[i].len);
        fputs(line,fp);
    }
    fclose(fp);
}
void booknum_storage()
{
    FILE *fp=fopen("booknum.txt","w");
    if(fp==NULL){
        printf("booknum.txt文件打开失败!\n");
        exit(1);
    }
    char line[1024];
    int i;
    for(i=1;i<=l;i++){
        sprintf(line,"%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",searchnum[i].flag,searchnum[i].num,searchnum[i].name,searchnum[i].writer,searchnum[i].club,searchnum[i].kj,searchnum[i].yj,searchnum[i].p1,searchnum[i].p2,searchnum[i].p3);
        fputs(line,fp);
        //printf("%s\n",line);
    }
    fclose(fp);
}
//**************************************************************************************
void book_input()//输入
{
    printf("请输入要输入图书的数量:");
    int n;
    scanf("%d",&n);
    int i;
    for(i=1;i<=n;i++){
        books[len+i].flag=len+i;
        char num[100];
        D:
        printf("请输入图书%d的书号:",i);
        scanf("%s",num);
        int j;//查重
        for(j=1;j<=len+i-1;j++)
        {
            if(strcmp(num,books[j].num)==0)
            {
                printf("改书号已经存在,请重新输入\n");
                goto D;
            }
        }
        strcpy(books[len+i].num,num);
        printf("请输入图书%d的书名:",i);
        scanf("%s",books[len+i].name);
        printf("请输入图书%d的作者:",i);
        scanf("%s",books[len+i].writer);
        printf("请输入图书%d的出版社:",i);
        scanf("%s",books[len+i].club);
        printf("请输入图书馆%d的藏书量:",i);
        scanf("%d",&books[len+i].kj);
        printf("请输入读者%d的借出书数:",i);
        scanf("%d",&books[len+i].yj);
        books[len+i].p1=0;
        books[len+i].p2=0;
        books[len+i].p3=0;
        int f1=0,f2=0,f3=0;
        for(j=1;j<=lenname+i-1;j++)
        {
            if(strcmp(books[len+i].name,booknames[j].name)==0)//长度增加并记录链头指针的长度
            {
                booknames[j].len++;
                booknames[j].p1=len+i;
                f1=1;
                break;
            }
        }
        if(f1==0)//没有这个书名就创建
        {
            strcpy(booknames[lenname+1].name,books[len+i].name);
            booknames[lenname+1].p1=len+i;
            booknames[lenname+1].len=1;
            lenname++;
        }
        for(j=1;j<=lenwriter+i-1;j++)
        {
            if(strcmp(books[len+i].writer,bookwriters[j].writer)==0)//长度增加并记录链头指针的长度
            {
                bookwriters[j].len++;
                bookwriters[j].p2=len+i;
                f2=1;
                break;
            }
        }
        if(f2==0)
        {
            strcpy(bookwriters[lenwriter+1].writer,books[len+i].writer);
            bookwriters[lenwriter+1].p2=len+i;
            bookwriters[lenwriter+1].len=1;
            lenwriter++;
        }
        for(j=1;j<=lenclub+i-1;j++)
        {
            if(strcmp(books[len+i].club,bookclubs[j].club)==0)//长度增加并记录链头指针的长度
            {
                bookclubs[j].len++;
                bookclubs[j].p3=len+i;
                f3=1;
                break;
            }
        }
        if(f3==0)
        {
            strcpy(bookclubs[lenclub+1].club,books[len+i].club);
            bookclubs[lenclub+1].p3=len+i;
            bookclubs[lenclub+1].len=1;
            lenclub++;
        }
        //遍历更改主文件指针
        for(j=len+i-1;j>=1;j--)//跑p1
        {
            if(strcmp(books[len+i].name,books[j].name)==0)
            {
                books[len+i].p1=j;
                break;
            }
        }
        for(j=len+i-1;j>=1;j--)//跑p2
        {
            if(strcmp(books[len+i].writer,books[j].writer)==0)
            {
                books[len+i].p2=j;
                break;
            }
        }
        for(j=len+i-1;j>=1;j--)//跑p3
        {
            if(strcmp(books[len+i].club,books[j].club)==0)
            {
                books[len+i].p3=j;
                break;
            }
        }
    }
    len+=n;//更改长度
    //分别存到文件里
    book_storage();
    bookname_storage();
    bookwriter_storage();
    bookclub_storage();
    printf("输入成功!");
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf("%c",&r);
    }while(r!='r'&&r!='R');
    cls();
}


void book_change()//修改
{

    while(1)
    {
        printf("请输入要修改图书的信息类型:(1.书的序号;2.书的书号;)\n");
        int tl;
        scanf("%d",&tl);
        if(tl==1)
        {
            int FLAG;
            while(1)
            {
                printf("请输入要修改图书的序号:\n");

                scanf("%d",&FLAG);
                if(FLAG>len)
                {
                    printf("没有这本书,请重新输入\n");
                    continue;
                }
                break;
            }
            while(1)
            {
                printf("请输入要修改的内容(1.藏书量;2.借出数;\n");
                int temp;scanf("%d",&temp);

                if(temp==1){
                    while(1)
                    {
                        printf("请输入修改后的藏书量:");
                        scanf("%d",&books[FLAG].kj);
                        if(books[FLAG].kj<0)
                        {
                            printf("藏书量不能小于0,请重新输入\n");
                            continue;
                        }
                        break;
                    }
                }
                if(temp==2){
                    while(1){
                    printf("请输入修改后的借出数:");
                    scanf("%d",&books[FLAG].yj);
                    if(books[FLAG].yj<0)
                    {
                        printf("借书数不能小于0,请重新输入\n");
                        continue;
                    }
                    break;
                    }
                }
                else
                {
                    printf("操作失败,请重新操作\n");
                    continue;
                }
                break;
            }

        }

        else if(tl==2)
        {
            int i,j;
            while(1)
            {
                printf("请输入要修改图书的书号:\n");
                char NUM[100];
                scanf("%s",NUM);

                j=0;
                for(i=1;i<=len;i++)
                {
                    if(strcmp(books[i].num,NUM)==0){
                        j=i;
                        break;
                    }
                }
                if(j==0)
                {
                    printf("没有这本书,请重新输入\n");
                    continue;
                }
                break;
            }

            while(1)
            {
                printf("请输入要修改的内容(1.藏书量;2.借出数;\n");
                int temp;scanf("%d",&temp);

                if(temp==1){
                    while(1)
                    {
                        printf("请输入修改后的藏书量:");
                        scanf("%d",&books[j].kj);
                        if(books[j].kj<0)
                        {
                            printf("藏书量不能小于0,请重新输入\n");
                            continue;
                        }
                        break;
                    }
                }
                if(temp==2){
                    while(1){
                    printf("请输入修改后的借出数:");
                    scanf("%d",&books[j].yj);
                    if(books[j].yj<0)
                    {
                        printf("借书数不能小于0,请重新输入\n");
                        continue;
                    }
                    break;
                    }
                }
                else
                {
                    printf("操作失败,请重新操作\n");
                    continue;
                }
                break;
            }
        }
        else
        {
            printf("没有这种类型,请重新操作\n");
            continue;
        }

        book_storage();
        printf("修改成功!\n是否继续修改?(y/n)");
        char cnt;
        scanf(" %c",&cnt);
        if(cnt=='y'||cnt=='Y'){
            cls();
            continue;
        }
        else if(cnt=='n'||cnt=='N')
        {
            break;
        }
        cls();
    }
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
}

/*
void book_delete(struct TS *head)//删除
{
    struct TS *t=head,*q;
    char NAME[1000];
    printf("请输入要删除的图书读者名:");
    scanf("%s",NAME);
    if(strcmp(t->name,NAME)==0){
        head=t->next;
        free(t);
    }
    while(t!=NULL && strcmp(t->name,NAME)!=0){
        q=t;
        t=t->next;
    }
    if(t!=NULL){
        q->next=t->next;
        free(t);
    }
    printf("删除成功!");
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
    book_storage(head);
}
*/


void insert(int i)//插入法O(n^2)
{
    int flag=0;
    if(i==1)
    {
        searchnum[1]=books[1];
        flag=1;
        l=1;
    }
    else
    {
        int j;
        for(j=1;j<=l;j++)//l 是原有长度
        {
            if(strcmp(books[i].num,searchnum[j].num)<0)//找到位置
            {
                int k;
                for(k=l;k>=j;k--)//从后往前移动位置
                {
                    searchnum[k+1]=searchnum[k];
                }
                searchnum[j]=books[i];
                flag=1;
                l++;
                break;
            }
        }
    }
    if(flag==0)//数组不为空且插入的数组是最大的
    {
        l++;
        searchnum[l]=books[i];
    }

}
void make_num_list()
{
    int i=1;
    for(i=1;i<=len;i++)
    {
        insert(i);
    }
}

void book_search()//查询
{
    cls();
    while(1)
    {
        menubooksearch();
        int tl;
        scanf("%d",&tl);
        cls();
        if(tl==1)
        {
            boo_search_num();
        }
        else if(tl==2)
        {
            boo_search_name();
        }
        else if(tl==3)
        {
            boo_search_writer();
        }
        else if(tl==4)
        {
            boo_search_club();
        }
        else if(tl==5)
        {
            break;
        }
        else
        {
            printf("无法操作\n");
        }
        cls();
    }
}

void boo_search_num()//按书号查询
{
    printf("请输入要查询图书的书号:");
    char NUM[100];
    scanf("%s",NUM);
    int l,r;//应用二分法查询
    l=1;r=len;
    int flag=0;
    while(l<r)
    {
        int mid;
        mid=(l+r)>>1;
        if(strcmp(searchnum[mid].num,NUM)==0){
            printf("序号\t\t书号\t\t书名\t\t作者\t\t出版社\t\t藏书数\t\t借出数\n");
            printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",searchnum[mid].flag,searchnum[mid].num,searchnum[mid].name,searchnum[mid].writer,searchnum[mid].club,searchnum[mid].kj,searchnum[mid].yj);
            flag=1;
            break;
        }
        else if(strcmp(searchnum[mid].num,NUM)<0)
        {
            l=mid;
        }
        else if(strcmp(searchnum[mid].num,NUM)>0)
        {
            r=mid;
        }
        if(l==r-1)
        {
            if(strcmp(searchnum[l].num,NUM)==0){
            flag=1;
            printf("序号\t\t书号\t\t书名\t\t作者\t\t出版社\t\t藏书数\t\t借出数\n");
            printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",searchnum[l].flag,searchnum[l].num,searchnum[l].name,searchnum[l].writer,searchnum[l].club,searchnum[l].kj,searchnum[l].yj);
            break;
            }
            else if(strcmp(searchnum[r].num,NUM)==0){
                flag=1;
                printf("序号\t\t书号\t\t书名\t\t作者\t\t出版社\t\t藏书数\t\t借出数\n");
                printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",searchnum[r].flag,searchnum[r].num,searchnum[r].name,searchnum[r].writer,searchnum[r].club,searchnum[r].kj,searchnum[r].yj);
                break;
            }
            else
            {
                break;
            }
        }
    }
    if(flag==0)
    {
        printf("您查询的书号不存在!!!\n");
    }
    else
    {
        printf("查询成功,");
    }

    printf("输入r返回子程序:");
    char rl='0';
    do{
        scanf(" %c",&rl);
    }while(rl!='r'&&rl!='R');
    cls();
}

void boo_search_name()//按书名查询
{
    int i,j;
    for(i=1;i<=lenname;i++)
    {
        printf("%s\t\t%d\t\t%d\n",booknames[i].name,booknames[i].p1,booknames[i].len);
    }
    printf("请输入要查询图书的书名:");
    char NAME[100];
    scanf("%s",NAME);
    int flag=0;
    for(i=1;i<=lenname;i++)
    {
        if(strcmp(NAME,booknames[i].name)==0)
        {
            flag=1;
            printf("序号\t\t书号\t\t书名\t\t作者\t\t出版社\t\t藏书数\t\t借出数\n");
            printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",books[booknames[i].p1].flag,books[booknames[i].p1].num,books[booknames[i].p1].name,books[booknames[i].p1].writer,books[booknames[i].p1].club,books[booknames[i].p1].kj,books[booknames[i].p1].yj);
            int t;
            t=books[booknames[i].p1].p1;//通过指针往回查找
            while(t!=0)
            {
                printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",books[t].flag,books[t].num,books[t].name,books[t].writer,books[t].club,books[t].kj,books[t].yj);
                t=books[t].p1;
            }
            break;
        }
    }
    if(flag==0)
    {
        printf("您查询的书名不存在!!!\n");
    }
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
}

void boo_search_writer()//按作者查询
{
    int i,j;
    for(i=1;i<=lenwriter;i++)
    {
        printf("%s\t\t%d\t\t%d\n",bookwriters[i].writer,bookwriters[i].p2,bookwriters[i].len);
    }
    printf("请输入要查询图书的作者:");
    char NAME[100];
    scanf("%s",NAME);//这个时候NAME是作者
    int flag=0;
    for(i=1;i<=lenwriter;i++)
    {
        if(strcmp(NAME,bookwriters[i].writer)==0)
        {
            flag=1;
            printf("序号\t\t书号\t\t书名\t\t作者\t\t出版社\t\t藏书数\t\t借出数\n");
            printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",books[bookwriters[i].p2].flag,books[bookwriters[i].p2].num,books[bookwriters[i].p2].name,books[bookwriters[i].p2].writer,books[bookwriters[i].p2].club,books[bookwriters[i].p2].kj,books[bookwriters[i].p2].yj);
            int t;
            t=books[bookwriters[i].p2].p2;
            while(t!=0)
            {
                printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",books[t].flag,books[t].num,books[t].name,books[t].writer,books[t].club,books[t].kj,books[t].yj);
                t=books[t].p2;
            }
            break;
        }
    }
    if(flag==0)
    {
        printf("您查询的书名不存在!!!\n");
    }
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
}
void boo_search_club()//按作者查询
{
    int i,j;
    for(i=1;i<=lenclub;i++)
    {
        printf("%s\t\t%d\t\t%d\n",bookclubs[i].club,bookclubs[i].p3,bookclubs[i].len);
    }
    printf("请输入要查询图书的出版社:");
    char NAME[100];
    scanf("%s",NAME);//这个时候NAME是出版社
    int flag=0;
    for(i=1;i<=lenclub;i++)
    {
        if(strcmp(NAME,bookclubs[i].club)==0)
        {
            flag=1;
            printf("序号\t\t书号\t\t书名\t\t作者\t\t出版社\t\t藏书数\t\t借出数\n");
            printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",books[bookclubs[i].p3].flag,books[bookclubs[i].p3].num,books[bookclubs[i].p3].name,books[bookclubs[i].p3].writer,books[bookclubs[i].p3].club,books[bookclubs[i].p3].kj,books[bookclubs[i].p3].yj);
            int t;
            t=books[bookclubs[i].p3].p3;
            while(t!=0)
            {
                printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",books[t].flag,books[t].num,books[t].name,books[t].writer,books[t].club,books[t].kj,books[t].yj);
                t=books[t].p3;
            }
            break;
        }
    }
    if(flag==0)
    {
        printf("您查询的书名不存在!!!\n");
    }
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
}
//**********************************************************
void book_total()
{
    cls();
    int i,j;
    //所有图书的数量(n*1)
    //图书馆的总藏书量(n*i)
    int total=0;
    for(i=1;i<=len;i++)
    {
        total+=(books[i].kj+books[i].yj);
    }

    if(len<0||total<0||len>total)
    {
        printf("错误,查询失败\n");
        exit(12);
    }

    printf("当前总书目为 %d \n",len);
    printf("当前总藏书为 %d \n",total);
    i=1;
    for(j=2;j<=len;j++)
    {
        if(books[j].yj>books[i].yj)
        {
            i=j;
        }
    }

    printf("最受欢迎的图书信息是:\n");
    printf("序号\t\t书号\t\t书名\t\t作者\t\t出版社\t\t藏书数\t\t借出数\n");
    printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",books[i].flag,books[i].num,books[i].name,books[i].writer,books[i].club,books[i].kj,books[i].yj);
    printf("汇总完成!\n");
    printf("输入r返回子程序:");
    char r='0';
    do{
        scanf(" %c",&r);
    }while(r!='r'&&r!='R');
    cls();
}
//*****************************************图书流通子系统**************************************************
int lenjh=0;
void bookstream(int men)//用户管理子系统功能大全
{
    cls();
    while(1){


        book_get();//一维数组books

        struct JH *jhead=NULL;
        jhead=bookstream_get(jhead);

        make_num_list();
        menubookstream();


        int temp;
        scanf("%d",&temp);
        cls();
        if(temp==1 && men==2)
            book_borrow(jhead);//借出
        else if(temp==2 && men==2)
            book_giveback(jhead);//还书
        else if(temp==3)
            break;
        else{
            printf("不能使用!\n");
            break;
        }
        //bookstream_storage();
        printf("what?/n");
        cls();
    }
}
struct JH *bookstream_get(struct JH *head)//从文件中读出数据构建链表,返回链表头指针
{
    FILE *fp=fopen("bookstream.txt","rt");
    if(fp==NULL){
        printf("bookstream.txt文件打开失败!\n");
        exit(1);
    }
    struct JH *p,*t;
    char line[1024];
    while(1){
        char *ret=fgets(line,sizeof(line),fp);
        if(ret==NULL){
            break;
        }
        lenjh++;
        p=(struct JH *)malloc(sizeof(struct JH));
        sscanf(line,"%s%s%s%s%s",p->readernum,p->num,p->lenddate,p->backdate,p->note);
        //printf("%s",line);
        p->next=NULL;
        if(head==NULL)
            head=p;
        else{
            t=head;
            if(strcmp(p->lenddate,t->lenddate)<0){
                p->next=head;
                head=p;
            }else
            {
                while(t!=NULL){
                    if(t->next==NULL || strcmp(t->next->lenddate,p->lenddate)>0){
                        p->next=t->next;
                        t->next=p;
                        break;
                    }
                    t=t->next;
                }
            }
        }
    }
    return head;

}
void bookstream_storage(struct JH *head)//将链表中文件写入读者文件中
{
    FILE *fp=fopen("bookstream.txt","wt");
    if(fp==NULL){
        printf("bookstream.txt文件打开失败!\n");
        exit(1);
    }

    char line[1024];
    struct JH *t=head;

     //printf("读者号\t\t书号\t\t借出时间\t\t归还时间\t\t备注\n");
    while(t!=NULL){
        //printf("%s\n",t->note);
        sprintf(line,"%s\t\t%s\t\t%s\t\t%s\t\t%s\n",t->readernum,t->num,t->lenddate,t->backdate,t->note);
        fputs(line,fp);
        t=t->next;
    }
    fclose(fp);
}
void book_borrow(struct JH *head)
{

    while(1){
    printf("请输入读者号:");
    char readernum[100];
    scanf("%s",readernum);

    struct DZ *rhead=NULL;//检查是否为合法读者
    rhead=reader_get(rhead);
    struct DZ *k=rhead;
    int flag=0;
    while(k!=NULL)
    {
        if(strcmp(k->id,readernum)==0)
        {
            flag=1;
            printf("已经找到该读者\n");
            break;
        }
        k=k->next;
    }
    if(flag==0)
    {
        printf("非法读者\n");
        break;
    }
    if(k->kj==0)//检查读者能不能再借书
    {
        printf("该读者借书数量已经超出限额!!!\n");
        break;
    }

    printf("请输入所借书的书号:");
    char NUM[100];
    scanf("%s",NUM);
    int l,r;//应用二分法查询
    l=1;r=len;
    int ans=0;
    int flag1=0;
    while(l<r)
    {
        int mid;
        mid=(l+r)>>1;
        if(strcmp(searchnum[mid].num,NUM)==0){
            flag1=1;
            ans=mid;
            break;
        }
        else if(strcmp(searchnum[mid].num,NUM)<0)
        {
            l=mid;
        }
        else if(strcmp(searchnum[mid].num,NUM)>0)
        {
            r=mid;
        }
        if(l==r-1)
        {
            if(strcmp(searchnum[l].num,NUM)==0){
            flag1=1;
            ans=l;
            break;
            }
            else if(strcmp(searchnum[r].num,NUM)==0){
                flag1=1;
                ans=r;
                break;
            }
            else
            {
                break;
            }
        }
    }
    if(flag1==0)
    {
        printf("您查询的书号不存在!!!\n");
        printf("输入r返回子程序:");
        char ro='0';
        do{
            scanf("%c",&ro);
        }while(ro!='r'&&ro!='R');
            break;
        break;
    }
    printf("书号合法!!!\n");

    if(searchnum[ans].kj==0)//检查书有没有全部借出去
    {
        printf("该图书已经全部借出!!!\n");
        printf("输入r返回子程序:");
        char ro='0';
        do{
            scanf("%c",&ro);
        }while(ro!='r'&&ro!='R');
        break;

        break;
    }

    ///先写储存代码,防止出错
    struct JH *t,*p;
    p=(struct JH *)malloc(sizeof(struct JH));


    strcpy(p->readernum,readernum);
    strcpy(p->num,NUM);
    printf("请输入借书时间:\n");
    char lendtime[200];
    scanf("%s",lendtime);
    strcpy(p->lenddate,lendtime);
    //printf("请输入还书时间:\n");
    char backtime[200];
    //scanf("%s",backtime);
    strcpy(backtime,"2099/12/31");
    strcpy(p->backdate,backtime);
    printf("请输入备注:\n");
    scanf("%s",p->note);//标注借还信息
    p->next=NULL;
    if (head==NULL)
    head=p ;
    else
    {
        t=head;
        if(strcmp(p->lenddate,t->lenddate)<0){
                p->next=head;
                head=p;
            }else{
                while(t!=NULL)
                    if(t->next==NULL || strcmp(t->next->lenddate,p->lenddate)>=0){
                        p->next=t->next;
                        t->next=p;

                        break;
                    }
                    t=t->next;
                }
    }




    lenjh++;
    k->kj--;
    k->yj++;
    int i,j;
    for(i=1;i<=len;i++)
    {
        if(strcmp(books[i].num,NUM)==0)
        {
            books[i].kj--;
            books[i].yj++;
            break;
        }
    }
    book_storage();
    booknum_storage();
    reader_storage(rhead);
    bookstream_storage(head);
    printf("借书成功!!!");
    printf("输入r返回子程序:");
    char ro='0';
    do{
        scanf("%c",&ro);
    }while(ro!='r'&&ro!='R');

    cls();
    break;
    }
    //printf("end\n");

}
void  book_giveback(struct JH *head)
{
    while(1){
    printf("请输入读者号:");
    char readernum[100];
    scanf("%s",readernum);

    struct DZ *rhead=NULL;//检查是否为合法读者
    rhead=reader_get(rhead);
    struct DZ *k=rhead;
    int flag=0;
    while(k!=NULL)
    {
        if(strcmp(k->id,readernum)==0)
        {
            flag=1;
            printf("已经找到该读者\n");
            break;
        }
        k=k->next;
    }
    if(flag==0)
    {
        printf("非法读者\n");
        break;
    }

    printf("请输入所借书的书号:");
    char NUM[100];
    scanf("%s",NUM);
    struct JH *y=head;
    struct JH *z=y;
    int flag3=0;
    while(y!=NULL)
    {
        if(strcmp(NUM,y->num)==0)
        {
            printf("已经在借还书文件中找到该书号\n");
            flag3=1;
            z=y;
            break;
        }
        y=y->next;
    }

    if(flag3==0)
    {
         printf("没有在借还书文件中找到该书号\n");
         char ro='0';
        do{
            scanf("%c",&ro);
        }while(ro!='r'&&ro!='R');
            break;
        break;

    }
    int l,r;//应用二分法查询
    l=1;r=len;
    int ans=0;
    int flag1=0;
    while(l<r)
    {
        int mid;
        mid=(l+r)>>1;
        if(strcmp(searchnum[mid].num,NUM)==0){
            flag1=1;
            ans=mid;
            break;
        }
        else if(strcmp(searchnum[mid].num,NUM)<0)
        {
            l=mid;
        }
        else if(strcmp(searchnum[mid].num,NUM)>0)
        {
            r=mid;
        }
        if(l==r-1)
        {
            if(strcmp(searchnum[l].num,NUM)==0){
            flag1=1;
            ans=l;
            break;
            }
            else if(strcmp(searchnum[r].num,NUM)==0){
                flag1=1;
                ans=r;
                break;
            }
            else
            {
                break;
            }
        }
    }
    if(flag1==0)
    {
        printf("您查询的书号不存在!!!\n");
        printf("输入r返回子程序:");
        char ro='0';
        do{
            scanf("%c",&ro);
        }while(ro!='r'&&ro!='R');
            break;
        break;
    }
    printf("书号合法!!!\n");


    ///还书流程
    printf("请输入还书时间:\n");
    char back_time[200];
    scanf("%s",back_time);
    if(strcmp(back_time,y->lenddate)<0)
    {
        printf("还书时间不能比借书时间早!!!\n");
        printf("输入r返回子程序:");
        char ro='0';
        do{
            scanf("%c",&ro);
        }while(ro!='r'&&ro!='R');
            break;
        break;
    }

    strcpy(z->backdate,back_time);

    printf("请输入备注:\n");
    scanf("%s",z->note);//标注借还信息


    k->kj++;
    k->yj--;
    int i,j;
    for(i=1;i<=len;i++)
    {
        if(strcmp(books[i].num,NUM)==0)
        {
            books[i].kj++;
            books[i].yj--;
            break;
        }
    }
    book_storage();
    booknum_storage();
    reader_storage(rhead);
    bookstream_storage(head);
    printf("还书成功!!!");
    printf("输入r返回子程序:");
    char ro='0';
    do{
        scanf("%c",&ro);
    }while(ro!='r'&&ro!='R');

    cls();
    break;
    }
}
//*****************************************工具函数*******************************************************/
void cls()//清屏函数
{
    printf("\033[H\033[J");
}
//**************************************密码加密函数********************************
void secretword(char key[])//密码加密函数
{
    unsigned char c;
    int i=0;
    while((c=getch())!='\r'){
        if(i<20&&isprint(c)){
            key[i]=c;
            i++;
            putchar('*');
        }
        else if(i>0&&c=='\b'){
            i--;
            putchar('\b');
        }
    }
    printf("\n");
    key[i]='\0';

}

/*76
void setEcho(int state) {
    struct termios tty;
    tcgetattr(STDIN_FILENO, &tty);

    if (state == 0) {
        tty.c_lflag &= ~ECHO;
    } else {
        tty.c_lflag |= ECHO;
    }

    tcsetattr(STDIN_FILENO, TCSANOW, &tty);
}

void getMaskedPassword(char *password, size_t length) {
    char ch;
    int index = 0;

    setEcho(0); // 关闭回显

    //printf("请输入密码:");

    while ((ch = getchar()) != '\n' && index < length - 1) {
        putchar('*'); // 打印 '*' 代替实际字符
        password[index++] = ch;
    }

    password[index] = '\0'; // 添加字符串终止符

    setEcho(1); // 恢复回显

    // 清除输入缓冲区中的剩余字符(如果有的话)
    while (getchar() != '\n');
}

下面是实验报告:要是需要这段代码过考的同学一定要仔细阅读实验报告!!!

实验讲义链接:实验讲义(要求)
实验报告word链接:个人实验报告(有删改)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值