数据结构课程设计--图书管理系统



//主函数模块

#include "library.h"
int main()
{
    FILE *fp_book,*fp_reader;              /*创建文件型指针*/
    Denglu();
    if((fp_book=fopen("Book","rb"))==NULL||(fp_reader=fopen("Reader.txt","rb"))==NULL)
    {
        Chushihua();//开始内容都没有进行初始化
    }
    else Load();//加载
    Menu_select(); /*调用主菜单*/
    return 0;
}

//开始模块
#include"library.h"
void Denglu() /*登录界面*/
{
    system("cls");
    printf("*****************************************************\n");
    printf("**                      │                         **\n");
    printf("**│            --------------------            │ **\n");
    printf("**│                                            │ **\n");
    printf("**│            │     欢迎使用     │          │ **\n");
    printf("**│                                            │ **\n");
    printf("**│            │ 学生图书管理系统 │          │ **\n");
    printf("**│            --------------------            │ **\n");
    printf("**                      │                         **\n");
    printf("*****************************************************\n");
    printf("\n\n\n\t\t 按任意键进入系统...");
    getch();
    system("cls");
}
int Menu() /*主菜单*/
{
    int dm;
    printf("\n\t\t图书管理系统主菜单:\n");
    printf("=================================================\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");
    printf("*\t8----显示所有图书      \n");
    printf("=================================================\n");
    printf("请选择相应操作的代码:");
    while(true)
    {
        scanf("%d",&dm); //dm输入的数字
        if(dm<0||dm>8)
        printf("\n错误!请重新输入:");
        else break;
    }
    return dm;
}
void Menu_select()/*判断主菜单选择功能函数*/
{
    for(;;)
    {
        switch(Menu()) /*功能选择*/
        {
        case 0:
            system("cls");
            Save();
            printf("\n\n\t文件保存成功!\n");
            printf("\n\n\t欢迎下次使用本系统!\n");
            getch();
            exit(0);
        case 1:
            Insert_New_Book();
            break;
        case 2:
            add_reader();
            break;
        case 3:
            Borrow_Book();
            break;
        case 4:
            Return_Book();
            break;
        case 5:
            Find_Book();
            break;
        case 6:
            Delete_Book();
            break;
        case 7:
            BubbleSort();
            break;
        case 8:
            Print_allbook();
            break;

        default:
            system("cls");
            printf("\n错误!请重新输入:");
            break;
        }
    }
}
/**************************************************************************************************************
* 功能描述: 图书初始化
* 输入参数: 图书信息
* 输出参数: 无
* 返回值  : 0
* 其它说明:图书信息包括图书编号、图书分类号、图书名称、图书出版社、图书出版时间、图书作者、图书价格、图书数量。
****************************************************************************************************************/
void Chushihua() /*初始化*/
{
    BK *p0;
    printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n");
    p0=(BK*)malloc(sizeof(BK));
    h_book = (BK*)malloc(sizeof(BK));
    printf("\n请输入图书信息:\n");
    printf("图书编号:");             /*输入图书编号(唯一)*/
    scanf("%s",p0->book_num);
    printf("图书名称:");             /*输入图书名称*/
    scanf("%s",p0->book_name);
    printf("图书作者:");             /*输入图书作者*/
    scanf("%s",p0->book_writer);
    printf("图书分类号:");           /*输入图书分类号*/
    scanf("%s",p0->book_fl);
    printf("图书出版单位:");         /*输入图书出版单位*/
    scanf("%s",p0->book_publisher);
    printf("图书出版时间:");         /*输入图书出版时间*/
    scanf("%s",p0->book_time);
    printf("图书价格:");             /*输入图书价格*/
    scanf("%s",p0->book_price);
    printf("图书数量:");             /*输入图书数量*/
    scanf("%d",&p0->book_count);
    p0->book_xiancun=p0->book_count;     /*开始时图书现有量和库存量相等*/
    p0->next=NULL;
    h_book->next = p0;
    printf("\n图书信息初始化完毕!按任意键继续下一步操作..\n");
    getch();
    system("cls");
}


//选择模块



/****** 功能描述: 进入主菜单
  0保存退出系统、
  1添加图书、
  2读者信息登记、
  3借书登记、
  4还书管理、
  5查询图书信息,
  6删除图书、
  7显示所有图书。
************/
#include "library.h"

BK *h_book;//指向图书信息的指针----定义的是一个书库
RD *h_reader;//指向读者信息的指针----定义的是一个读者库

/*************** 0保存退出*********************************/

void Save() /*保存信息*/
{
    Save_Reader();
    Save_Book();
}
void Save_Reader()   /*保存读者信息*/
{
    FILE *fp_reader;//定义指向读者的文件指针
    RD *p;
    p=h_reader;
   if((fp_reader=fopen("Reader.txt","wb"))==NULL)   //创建文件,进行保存
    {
        printf("\n文件保存失败!\n请重新启动本系统...\n");
        exit(0);
    }
    while(p!=NULL)//将链表中的信息写入文件中
    {
        if(fwrite(p,sizeof(RD),1,fp_reader)!=1)  //未写入成功
        printf("\n写入文件失败!\n请重新启动本系统!\n");
        p=p->next;
    }
    fclose(fp_reader);
}


void Save_Book() /*图书信息写入文件*/
{
    FILE *fp = fopen("Book","wb");
    BK *cur = h_book;
    while(cur->next!= NULL)
    {
        fwrite(cur->next,sizeof(BK),1,fp);
        cur=cur->next;
    }
    fclose(fp);
}

void Load() //加载信息(向外读)
{
    Load_Reader();
    Load_Book();
}
void Load_Reader()   /*加载读者信息*/
{
    RD *p1,*p2,*p3;//定义读者类型的指针
    FILE *fp;           //创建文件型指针
    fp=fopen("Reader.txt","rb");       //打开文件

    p1=(RD *)malloc(sizeof(RD));
    fread(p1,sizeof(RD),1,fp);        //把书库内容放入p1
    h_reader=p3=p2=p1;

    while(!feof(fp))   //读出信息,重新链入链表,判断指针是否到达文件尾部
    {
        p1=(RD *)malloc(sizeof(RD));
        fread(p1,sizeof(RD),1,fp);//读出信息放入链表p1

        p2->next=p1; //装入新读取的
        p3=p2;//每次装入最新读取的
        p2=p1;//记录本次这次读取的
    }
    p3->next=NULL;
    fclose(fp); //关闭文件
}
void Load_Book() /*加载图书信息*/
{
    if(h_book == NULL)//如果开始的头指针上没有放入信息,则开辟新空间
    h_book = (BK*)malloc(sizeof(BK));
    FILE *fp = fopen("Book","rb");
    BK *cur = h_book;//定义book类型的指针并指向书库
    BK *temp;
    while(!feof(fp))
    {
        cur->next = (BK*)malloc(sizeof(BK));
        temp = cur;
        fread(cur->next,sizeof(BK),1,fp);//向文件里面写数据
        cur = cur->next;
    }
    temp->next = NULL;
    fclose(fp);

}
/*********** 1添加图书(图书编号、图书分类号、图书名称、图书出版社、图书出版时间、图书作者、图书价格、图书数量)************/

void Insert_New_Book()/*新书入库*/
{
    if(h_book == NULL)
    h_book = (BK*)malloc(sizeof(BK));
    BK *p,*p0,*p1;
    p=p1=h_book;
    int n;
    printf("\n新书入库模块...\n");
    printf("\n请输入新书信息..\n包括书号.书名.数量..\n");
    p0=(BK *)malloc(sizeof(BK));
    printf("图书编号:");
    scanf("%s",p0->book_num);
    while(p1->next!=NULL && strcmp(p0->book_num,p1->book_num)!=0) //检查图书之前有没有,有的就把指针指向图书的位置,没有就在指针循环到指针尾跳出循环
        p1=p1->next;

    if(strcmp(p0->book_num,p1->book_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/
    {
        printf("\n此编号图书已存在!!可直接入库!\n");
        printf("图书数量:");
        scanf("%d",&n);
        p1->book_count+=n;
        p1->book_xiancun+=n;
    }
    else/*若不存在,则需要输入其他的信息,然后在尾部进行插入操作*/
    {
        printf("图书名称:");
        scanf("%s",p0->book_name);
        printf("图书作者:");
        scanf("%s",p0->book_writer);
        printf("图书分类号:");
        scanf("%s",p0->book_fl);
        printf("图书出版单位:");
        scanf("%s",p0->book_publisher);
        printf("图书出版时间:");
        scanf("%s",p0->book_time);
        printf("图书价格:");
        scanf("%s",p0->book_price);
        printf("图书数量:");
        scanf("%d",&n);//库存数量
        while(p->next)//指到指针尾好添加书
        {
            p=p->next;
        }
        if(h_book->next==NULL)
            h_book->next=p0;      /*此处分两种情况,链表中没有数据,head直接指向p0处*/
        else
            p->next=p0;/*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/

        p0->next=NULL;
        p0->book_xiancun=n;
        p0->book_count=n;
    }
    printf("\n新书入库完毕!按任意键继续下一步操作..\n");
    getch();
    system("cls");
}
/***************2添加读者(借书证号、姓名)***********************/

void add_reader()//添加读者
{
    if(h_reader == NULL)
    {
        h_reader = (RD*)malloc(sizeof(RD));
        h_reader->next = NULL;
    }
    RD *p0,*p;
    int i;
    printf("\n读者初始化开始,请输入读者信息..\n包括书证号.姓名..\n");
    p0=(RD*)malloc(sizeof(RD));     //申请新的读者类型的结点存储空间


    printf("\n请输入读者的信息:\n");
    printf("读者借书证号:");
    scanf("%s",p0->reader_num);
    p = h_reader;


     while(p->next!=NULL && strcmp(p0->reader_num,p->reader_num)!=0) //检查图书之前有没有,有的就把指针指向图书的位置,没有就在指针循环到指针尾跳出循环
        p=p->next;

     if(strcmp(p0->reader_num,p->reader_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/
    {
        printf("\n此读者编号已存在!!\n");
        goto end;
    }
    else
    {
    printf("读者姓名:");
    scanf("%s",p0->reader_name);
    p0->right=0;//添加新的数据开始时一本书也没借
    for(i=0; i<Max; i++)
    {
       //将后面的复制到前面去
        strcpy(p0->borrow[i].borrow_book_num,"0"); //所借图书数量直接置为0(即没有借书)
        strcpy(p0->borrow[i].limit_date,"0");//借书日期设置为0
    }
    p0->next=NULL;

    p->next = p0;
    printf("\n读者信息初始化完毕!按任意键继续下一步操作..\n");

    }
    end:
     getch();
    system("cls");
}

/****************** 功能描述: 3借书模块(读者借书证号、借书编号)************************/

 void Borrow_Book() /*借书模块*/
{
    BK *p0;//定义图书类型的指针
    RD *p1;//定义读者类型的指针
    char bo_num[10],rea_num[10],lim_date[8];//图书编号,读者编号,还书日期
    int i;
    p0=h_book;
    p1=h_reader;
    printf("\n借书模块...\n");
    printf("\n请输入借书的读者借书证号:");
    scanf("%s",rea_num);
    while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0)
        p1=p1->next;//找到对应的读者信息


    if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0)
    {
        printf("\n此读者编号不存在!按任意键返回..\n");
        goto END;
    }
    printf("\n请输入你要借的书的编号:");//找到读者编号
    scanf("%s",bo_num);
    while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL)
        p0=p0->next;

    if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0)//没这本书
    {
        printf("\n此图书编号不存在!按任意键返回..\n");
        goto END;
    }
    else if(p0->book_xiancun<=0)//被借光
    {
        printf("\n抱歉,此书已借完!请等待新书的到来!!\n按任意键返回....");
        goto END;
    }
    else if(p1->right>Max||p1->right==Max)//借书权限已满
    {
        printf("\n抱歉,借书数目已满!不能借书!\n按任意键返回....");
        goto END;
    }
    else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0)//之前借过书但是还没达到最大值
    {
        for(i=0; i<Max; i++)
        {
            if(strcmp(p1->borrow[i].borrow_book_num,bo_num)==0)//书与借的书号相同不能借
            {
                printf("\n抱歉!同一个读者不能同借两本相同的书!\n按任意键返回....");
                goto END;
            }
            else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0)//和0相等返回0,代表之前没有借阅过图书
            {
                printf("\n请输入你要归还图书的日期:");
                scanf("%s",lim_date);


                strcpy(p1->borrow[p1->right].borrow_book_num,bo_num);//把刚到手书号复制到借的书的书号中
                strcpy(p1->borrow[p1->right].limit_date,lim_date);//日期同上

                p0->book_yes=0;
                p1->right++;//读者下次借书为第几本书

                p0->book_yes=0;

                p0->book_xiancun--;//书库对应减去
                printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);
                goto END;
            }
        }
    }
    else//这种情况就是之前没有借过书
    {
        printf("\n请输入你要归还图书的日期:");
        scanf("%s",lim_date);
        strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num);
        strcpy(p1->borrow[p1->right-1].limit_date ,lim_date );
        //
        p0->book_yes=0;
        p0->book_xiancun--;
        printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);
    }
END:
    getch();
    system("cls");
}
/*********** 4还书模块(读者借书证号、还的书的编号)***********************************/

void Return_Book() /*还书模块*/
{
    BK *p;//定义书籍类型的指针
    RD *q;//定义读者类型的指针
    int i,j,find=0;
    char return_book_num[10],return_reader_num[10];//还书的书号和读者编号
    p=h_book;
    q=h_reader;
    printf("\n还书模块...\n");
    printf("\n请输入要还书的读者编号:");
    scanf("%s",return_reader_num);
    while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num)!=0)//找读者的编号
        q=q->next;
    if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0)
    {

        printf("\n此读者编号不存在!按任意键返回..\n");
        goto end;
    }
    printf("\n请输入读者还书的编号:");
    scanf("%s",return_book_num);

    while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0)//找图书的编号
        p=p->next;

    if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0)
    {
        printf("\n错误!此图书编号不存在!按任意键返回..\n");
        goto end;
    }
    for(i=0; i<Max; i++)
    {

        if(strcmp(return_book_num,q->borrow[i].borrow_book_num)==0)     //如果此读者借了此书
        {
            find=1;
            for(j=i; j<Max-1; j++)
            {
                strcpy(q->borrow[j].borrow_book_num,q->borrow[j+1].borrow_book_num);//数组中把这本书后面的数据向前移动数据
                strcpy(q->borrow[j].limit_date,q->borrow[j+1].limit_date);
            }
            p->book_xiancun++;
            q->right--;
            printf("\n编号%s的读者还书完毕!按任意键继续下步操作..",return_reader_num);
            //
            if(p->book_xiancun==p->book_count)
                p->book_yes=1;
        }
    }

    if(find==0)
        printf("\n错误!此读者未借此书!按任意键返回..\n");
end:
    getch();
    system("cls");
}
/****************5查找图书并打印信息(1-作者名 2-书名)****************/

void Print_book(BK *p)//打印图书信息
{
    printf("\n图书信息如下:\n\n");
    printf("图书编号\t图书名称\t图书作者\t现有量\t\t库存量\n");
    printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xiancun,p->book_count);
}
void Find_Book()//查找图书的方式的函数
{
    int a;
    printf("请选择查找方式:\n\n");
    printf("1 按图书名查找图书\n2 按作者名查找图书 \n");
    scanf("%d",&a);
    if(a==1)
    {
        Find_Bookname();
    }
    else if(a==2)
    {
        Find_Bookwriter();
    }
    else
    {
        printf("您输入的操作不正确!\n");
    }

 }


 void Find_Bookname() //按书名查询
{
    BK *p;//定义图书类型的指针
    p=h_book;
    char n[80];//定义这个字符串存放书名
    int flag=0;
    printf("请输入要查询的书名:");
    scanf("%s",n);
    for(; p!=NULL; p=p->next)
    {
        if(strcmp(p->book_name,n)==0)//找到了对应的书名
        {
            Print_book(p);//打印出图书的信息
            flag = 1;
        }
    }
    if(p==NULL&&flag==0)
        printf("没有相关信息!");
}
void Find_Bookwriter()          //按作者名查询(与上面的按书名查找是一样的)
{
    BK *p;
    p = h_book;
    char n[80];
    int flag=0;
    printf("请输入要查询的作者名:");
    scanf("%s",n);
    for(; p!=NULL; p=p->next)
    {
        if(strcmp(p->book_writer,n)==0)
        {
            Print_book(p);
            flag=1;
        }
    }
    if(p==NULL&&flag==0)
    {
        printf("没有相关信息!");
    }
}

/********************6删除图书( 借出的图书不能删除)**************************/

void Delete_Book()              //以图书编号作为主键进行删除
{
    BK *p;
    char n[10];
    int flag=0;
    p=h_book;
    printf("输入要删除的书的编号:");
    scanf("%s",n);
    for(; p!=NULL; p=p->next)
    {
        if(p->next != NULL && !strcmp(p->next->book_num,n))
        {                //在这里的条件是找到了要删除的书
            if(p->next->book_yes==0)
            {
                printf("当前图书被借出,不能删除!");
                return;
            }
            p->next=p->next->next;            //删除语句,链表后指
            printf("成功删除!");
            flag=1;                           //成功删除标记
            break;
        }
    }
    if(p==NULL&&flag==0)
    {
        printf("书库中没有此书!");;           //已经被删除或没有这本书
    }
}

/************ 功能描述:7图书编号排序(冒泡排序算法)******************/
void BubbleSort()
{
    BK *p,*t,*r,*a;
    bool flag;
    p = h_book->next;
    a = p;
    r = h_book;
    while(a!=NULL)
    {
        a = a->next;
        flag = false;
        p = h_book->next;
        r = h_book;

        while(p->next!=NULL)
        {
            if(strcmp(p->book_num,p->next->book_num) > 0)
            {
                t = p->next;
                p->next = t->next;
                t->next = p;
                r->next = t;
                r = r->next;
                flag = true;
            }
            else
            {
                p = p->next;
                r = r->next;
            }
        }
        if(!flag) break;
    }

}


/*******************8显示所有图书***************************/

void Print_allbook()//显示所有的图书
{
    BK *p;
    p = h_book->next;//
    if(p!=NULL)
    {
        printf("\n图书信息如下:\n\n");
        printf("图书编号\t图书名称\t图书作者\t现有量\t\t库存量\n");
        while(p!=NULL)
        {
            printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xiancun,p->book_count);
            p = p->next;
        }
    }
    else
    {
        printf("※库中没有图书!※\n");
    }

}

运行结果:



五.程序测试结果及正确性验证

5.1图书关系系统菜单显示:
 

5.2图书入库界面显示:

界面1:输入库中没有的书时需要编辑信息


 









  • 13
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讨厌一个人不需要理由

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值