• 图书管理系统


    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    #include <string.h>

    #define M 10
    #define N 15

    typedef struct book_info
    {
    char ISBN[N];//书号
    char name[M];//书名
    char writer[M];//作者
    char time[M];//出版日期
    char publisher[N];//出版社
    char price[M];//价格
    }Book;

    typedef struct link
    {
    Book info;
    struct link * next;

    }Node,*Link;

    void Add_book(Link *Head,Link *New);//添加图书信息函数原型声明
    void Delete_book(Link *Head); //删除图书信息函数原型声明
    void Find_book(Link *Head); //查找图书信息函数原型声明
    void Update_book(Link *Head); //修改图书信息函数原型声明
    void Print_book(Link *Head); //输出图书信息函数原型声明

    /*添加数据子操作*/
    void print_info(Link *New,int i);

    /*删除子操作*/
    void delete_ISBN(Link *Head);
    void delete_name(Link *Head);
    void delete_writer(Link *Head);
    void delete_publisher(Link *Head);

    /*查找子操作*/
    void search_ISBN(Link *Head);
    void search_name(Link *Head);
    void search_writer(Link *Head);
    void search_publisher(Link *Head);
    void search_price(Link *Head);
    void search_time(Link *Head);

    /*修改子操作*/
    void update_ISBN(Link *p);
    Link update_name(Link p);
    Link update_writer(Link p);
    Link update_publisher(Link p);
    Link update_price(Link p);
    Link update_time(Link p);

    void choose_op(Link *Head);

    /*输出一本图书的信息*/
    void print(Link *Head);

    /*图书管理系统菜单*/
    void Menus(Link *Head,Link *New);

    int main(int argc, char **argv)
    {
    FILE * fp;
    int bytes_read,bytes_write;

    Link Head = NULL,p; //节点声明
    Link New = NULL;
    int c = 1;
    p = Head;

    Head = (Link)malloc(sizeof(Node));//建立头节点
    Head->next = NULL; //空链表


    while(c)
    {
    Menus(&Head,&New);

    printf("你想继续操作吗?
    1.继续
    2.退出 ");
    scanf("%d",&c);

    }
    return 0;
    }

    /****************************************************
    函数功能:选择菜单
    ****************************************************/
    void Menus(Link *Head,Link *New)
    {
    int ch;
    printf("/***************欢迎进入图书管理系统****************/ ");
    printf("1.添加图书信息
    2.删除图书信息
    3.查找图书信息
    4.修改图书信息
    5.输出图书管理系统所有图书信息
    6.退出系统
    /***************************************************/ ");
    scanf("%d",&ch);
    switch(ch)
    {
    case 1:
    Add_book(Head,New);
    Print_book(Head);
    break;
    case 2:
    Delete_book(Head);
    Print_book(Head);
    break;
    case 3:
    Find_book(Head);
    break;
    case 4:
    Update_book(Head);
    break;
    case 5:
    Print_book(Head);
    break;
    case 6:
    exit(0);
    default:
    printf("输入错误,请重新输入! ");

    }
    }
    /****************************************************
    函数功能:修改指定图书的ISBN
    ****************************************************/
    void update_ISBN(Link *p)
    {
    printf("请输入新的ISBN: ");
    scanf("%s",(*p)->info.ISBN);

    }
    /****************************************************
    函数功能:修改指定图书的书名
    ****************************************************/
    Link update_name(Link p)
    {
    printf("请输入新的书名: ");
    scanf("%s",p->info.name);
    return p;
    }
    /****************************************************
    函数功能:修改指定图书的作者
    ****************************************************/
    Link update_writer(Link p)
    {
    printf("请输入新的作者名字: ");
    scanf("%s",p->info.writer);
    return p;
    }

    /****************************************************
    函数功能:修改指定图书的出版社名字
    ****************************************************/
    Link update_publisher(Link p)
    {
    printf("请输入新的出版社名字: ");
    scanf("%s",p->info.publisher);
    return p;
    }

    /****************************************************
    函数功能:修改指定图书的价格
    ****************************************************/
    Link update_price(Link p)
    {
    printf("请输入新的价格: ");
    scanf("%d",p->info.price);
    return p;
    }

    /****************************************************
    函数功能:修改指定图书的出版日期
    ****************************************************/
    Link update_time(Link p)
    {
    printf("请输入新的出版日期: ");
    scanf("%s",p->info.time);
    return p;
    }


    /*****************************************************
    函数功能:修改指定图书的信息
    *****************************************************/
    void Update_book(Link *Head)
    {
    char str[N];
    int flag = 0;
    Link p;
    /*输出录入图书的信息*/
    Link q;


    printf("请输入你要修改图书的ISBN: ");//根据ISBN找到指定图书
    scanf("%s",str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行修改操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你想要修改图书的所有信息为----------------/ ");

    /*调用函数显示指定图书的所有信息*/
    q = p->next;
    print(&q);

    /*调用函数选择修改操作*/
    choose_op(&q);

    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("不能进行修改操作,没有ISBN为%s的书 ",str);
    }

    }

    /******************************************************
    函数功能:根据需要选择要进行修改的操作
    ******************************************************/
    void choose_op(Link *p)
    {
    int ch;
    Link q;
    q = *p;
    int c = 1;

    while(c)
    {
    c = 0;
    printf("请选择你想进行的修改操作: ");
    printf("1.修改ISBN
    2.修改书名
    3.修改作者
    4.修改出版社名
    5.修改书的价格
    6.修改出版日期 ");
    scanf("%d",&ch);

    switch(ch)
    {
    case 1:
    update_ISBN(&q);
    print(&q);
    break;
    case 2:
    update_name(q);
    break;
    case 3:
    update_writer(q);
    break;
    case 4:
    update_publisher(q);
    break;
    case 5:
    update_price(q);
    break;
    case 6:
    update_time(q);
    break;
    default:
    printf("输入错误 ");
    }
    C: printf("还要继续修改吗?
    1.继续
    0.退出 ");
    scanf("%d",&c);
    if(c > 1)
    {
    printf("输入错误,请重新输入! ");
    goto C;
    }

    }
    printf("修改后: ");
    print(p);
    }

    /*****************************************************
    函数功能:查找指定图书的信息
    ****************************************************/
    void Find_book(Link *Head)
    {
    int ch;

    printf("请选择你想进行的查找操作: ");
    printf("1.按ISBN查找
    2.按书名查找
    3.查找指定作者的所有书
    4.查找指定出版社出版的所有书
    5.查找书的价格范围在指定区间的书
    6.查找出版时间在指定区间内的书 ");
    scanf("%d",&ch);

    switch(ch)
    {
    case 1:
    search_ISBN(Head);
    break;
    case 2:
    search_name(Head);
    break;
    case 3:
    search_writer(Head);
    break;
    case 4:
    search_publisher(Head);
    break;
    case 5:
    search_price(Head);
    break;
    case 6:
    search_time(Head);
    break;
    default:
    printf("输入错误 ");
    }

    }
    /*****************************************************
    函数功能:根据ISBN查找图书信息
    *****************************************************/
    void search_ISBN(Link *Head)
    {
    Link p;
    char str[N];
    int flag = 0;

    printf("请输入你想查找图书的ISBN: ");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if(strcmp(p->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你查找的图书信息为----------------/ ");
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有ISBN为%s的书 ",str);
    }

    }
    /*****************************************************
    函数功能:根据书名查找信息
    *****************************************************/
    void search_name(Link *Head)
    {
    Link p;
    char str[N];
    int flag = 0;

    printf("请输入你想查找图书的书名: ");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if(strcmp(p->info.name,str) == 0)//如果p->next->info.name与指定的书名相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你查找的图书信息为----------------/ ");
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有书名为%s的书 ",str);
    }
    }
    /*****************************************************
    函数功能:查找指定图书作者写的图书信息
    *****************************************************/
    void search_writer(Link *Head)
    {
    Link p;
    char str[N];
    int flag = 0;

    printf("请输入你想查找图书的作者: ");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if(strcmp(p->info.writer,str) == 0)//如果p->next->info.writer与指定的作者相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你查找的图书信息为----------------/ ");
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有作者%s的书 ",str);
    }
    }
    /*****************************************************
    函数功能:查找指定出版社出版的图书信息
    *****************************************************/
    void search_publisher(Link *Head)
    {
    Link p;
    char str[N];
    int flag = 0;

    printf("请输入你想查找图书的出版社名字: ");
    scanf("%s",&str);

    p = (*Head)->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if(strcmp(p->info.publisher,str) == 0)//如果p->next->info.publisher与指定的出版社名字相同,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------你查找的图书信息为----------------/ ");
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有出版社%s的书 ",str);
    }
    }
    /*****************************************************
    函数功能:查找图书价格在指定区间上的书
    *****************************************************/
    void search_price(Link *Head)
    {
    Link p;
    char a[M],b[M];
    int flag = 0;

    printf("请输入你想查找图书价格的下限: ");
    scanf("%s",a);
    printf("请输入你想查找图书的上限: ");
    scanf("%s",b);

    p = (*Head);//->next;

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if((p->info.price>a) && (p->info.price<b))//如果p->next->info.price在指定的区间[a,b]内,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------价格位于[%d,%d]内图书信息为----------------/ ",a,b);
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有图书价格位于[%d,%d]内的书 ",a,b);
    }
    }
    /*****************************************************
    函数功能:查找出版日期在区间[a,b]中的图书
    *****************************************************/
    void search_time(Link *Head)
    {
    Link p;
    char a[M],b[M];
    int flag = 0;

    printf("请输入你想查找图书出版日期的区间[a,b]:(以逗号隔开) ");
    scanf("%s,%s",a,b);

    p = (*Head);

    if(p == NULL)//链表为空
    {
    printf("没有图书,不能进行查找操作. ");
    }

    while(p != NULL)
    {
    if((p->info.time >= a) && (p->info.time <= b))//如果p->next->info.time在指定的区间[a,b]内,则输出对应的图书信息
    {
    flag = 1;
    printf(" /------------出版日期位于[%s,%s]内图书信息为----------------/ ",a,b);
    print(&p);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有出版日期位于[%s,%s]内的书 ",a,b);
    }
    }
    /*****************************************************
    函数功能:删除图书
    *****************************************************/
    void Delete_book(Link *Head)
    {
    Link p;
    int ch;

    printf("请选择你想进行的删除操作: ");
    printf("1.删除与指定ISBN相同的书
    2.删除与指定书名相同的书
    3.删除指定作者的书
    4.删除指定出版社的书 ");
    scanf("%d",&ch);

    switch(ch)
    {
    case 1:
    delete_ISBN(Head);
    break;
    case 2:
    delete_name(Head);
    break;
    case 3:
    delete_writer(Head);
    break;
    case 4:
    delete_publisher(Head);
    break;
    default:
    printf("输入错误! ");
    }
    }
    /*****************************************************
    函数功能:删除与指定ISBN相同的书
    *****************************************************/
    void delete_ISBN(Link *Head)
    {
    Link p,q;
    char str[N];
    int flag = 0;
    printf("请输入你想删除图书的ISBN: ");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行删除操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.ISBN,str) == 0)//如果p->next->info.ISBN与指定的ISBN号相同,则删除此图书节点
    {
    flag = 1;
    q = p->next;
    p->next = q->next;
    free(q);
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有ISBN为%s的书 ",str);
    }


    }
    /*****************************************************
    函数功能:删除与指定书名相同的书
    *****************************************************/
    void delete_name(Link *Head)
    {
    Link p,q;
    char str[N];
    int flag = 0;
    printf("请输入你想删除图书的名字: ");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行删除操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.name,str) == 0)//如果p->next->info.ISBN与指定的书名相同,则删除此图书节点
    {
    q = p->next;
    p->next = q->next;
    free(q);
    flag = 1;
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有这本书 ");
    }

    }
    /*****************************************************
    函数功能:删除指定作者的书
    *****************************************************/
    void delete_writer(Link *Head)
    {
    Link p,q;
    char str[N];
    int flag = 0;
    printf("请输入你想删除图书的作者名: ");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行删除操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.writer,str) == 0)//如果p->next->info.ISBN与指定的作者名相同,则删除此图书节点
    {
    q = p->next;
    p->next = q->next;
    free(q);
    flag = 1;
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有作者%s的书 ",str);
    }

    }
    /*****************************************************
    函数功能:删除指定出版社的书
    *****************************************************/
    void delete_publisher(Link *Head)
    {
    Link p,q;
    char str[N];
    int flag = 0;
    printf("请输入你想删除图书的出版社名字: ");
    scanf("%s",&str);

    p = *Head;

    if(p->next == NULL)//链表为空
    {
    printf("没有图书,不能进行删除操作. ");
    }

    while(p->next != NULL)
    {
    if(strcmp(p->next->info.publisher,str) == 0)//如果p->next->info.ISBN与指定的出版社名字相同,则删除此图书节点
    {
    q = p->next;
    p->next = q->next;
    free(q);
    flag = 1;
    break;
    }
    p = p->next;
    }
    if(!flag)
    {
    printf("没有%s出版社的书 ",str);
    }
    }

    /*****************************************************
    函数功能:录入新的书籍信息
    ****************************************************/
    void Add_book(Link *Head,Link *New)
    {
    int i;
    int num;
    Link p;
    FILE * fp;

    if((fp = fopen("F:\book_info.txt","a+")) == NULL)
    {
    perror("书库文件打开失败,不能录入信息! ");
    exit(1);
    }

    p = (*Head)->next;

    printf("你想录入几本书? ");
    scanf("%d",&num);

    for(i = 0; i < num; i++)
    {
    *New = (Link)malloc(sizeof(Node));
    /*输入图书的信息*/
    print_info(New,i);

    /*头插法插入节点*/
    (*New)->next = (*Head)->next;
    (*Head)->next = *New;
    }
    }

    /*******************************************************
    函数功能:输入图书的信息
    *******************************************************/
    void print_info(Link *New,int i,FILE *fp)
    {
    printf("请输入第%d本书的信息: ",i+1);

    printf("ISBN:");
    scanf("%s",&(*New)->info.ISBN);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("书名:");
    scanf("%s",&(*New)->info.name);
    fwrite((*New)->info.name,M,1,fp);

    printf("作者:");
    scanf("%s",&(*New)->info.writer);
    fwrite((*New)->info.writer,M,1,fp);

    printf("出版社:");
    scanf("%s",&(*New)->info.publisher);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("出版时间:");
    scanf("%s",&(*New)->info.time);
    fwrite((*New)->info.ISBN,N,1,fp);

    printf("价格:");
    scanf("%5f",&(*New)->info.price);
    fwrite((*New)->info.ISBN,N,1,fp);
    }

    /********************************************************
    函数功能:输出图书信息
    *******************************************************/
    void Print_book(Link *Head)
    {
    int i = 0;
    Link p;
    p = *Head;

    printf("/*******************************************
    管理系统所有的图书为: ");
    if(p->next == NULL)
    {
    printf("没有图书! ");
    }
    while(p->next != NULL)
    {
    i++;
    print(&p->next);//调用函数输出指针p所指向的图书的信息
    p = p->next;
    }
    }

    /**************************************************
    函数功能:输出一本图书的信息
    *************************************************/
    void print(Link *L)
    {
    Link p;
    p = *L;

    printf("ISBN:%s ",p->info.ISBN);
    printf("书名:%s ",p->info.name);
    printf("作者:%s ",p->info.writer);
    printf("出版社:%s ",p->info.publisher);
    printf("出版时间:%s ",p->info.time);
    printf("价格:%f ",p->info.price);

    }

  • 相关阅读:
    Outlook 邮件助手
    飞花令
    青蛙跳台阶
    如何提问,找到去说谎国的路
    如何计时一个小时十五分钟
    旋转数组的最小元素
    谁养鱼?
    小龙赚了多少?
    下一行是什么?
    5 = ?
  • 原文地址:https://www.cnblogs.com/wlp1115/p/6576568.html
Copyright © 2020-2023  润新知