当前位置: 首页 > 文档资料 > C 语言程序设计 >

图书管理系统

优质
小牛编辑
155浏览
2023-12-01

图书管理

案例描述

随着科技的发展,计算机的普及,计算机软件在诸多领域都得到了广泛的应用。如今,管理系统不再是大公司的专利,许多小型的管理系统,如餐厅的餐饮管理系统、超市的收银系统、学校的学生选课系统等都已逐步普及到了我们的生活中。

本案例要求实现一个基于单链表的图书管理系统,该系统可实现图书信息的增加、浏览、查询、更新、删除这五项功能,并能将链表中存储的数据保存到文件中。

案例分析

本案例要求实现基于单链表的图书管理系统,并能实现增删改查这几项基本功能。掌握单链表的基础操作是完成本案例的前提。另外图书信息应包含多项数据,所以链表结点中应为结构体类型的数据。当需要将链表中的数据保存到本地时,可以使用文件读写将数据写入创建的文件中。

案例实现

功能函数设计如下:

  1. 图书信息录入。该函数应实现增加数据的功能,其实质为链表结点的添加;
  2. 图书信息浏览。该函数应实现链表中书籍信息的输出,其实质为链表的遍历;
  3. 图书信息查询。该函数应能根据用户输入的某项信息,查找记录并输出;
  4. 图书信息修改。该函数应能根据用户输入的某项信息,修改信息并保存;
  5. 图书信息删除。该函数借助查询功能,查找链表中的数据,并删除;
  6. 图书信息保存。该函数应能将链表中的数据写入文件;
  7. 创建书单;
  8. 菜单函数。本函数可展示功能菜单,提供用户与程序交互的入口;

案例代码

StuManager.h

#include <stdio.h>

typedef struct book
{
    char bnum[10];                        //书籍编号
    char bname[30];                        //书名
    char bauthor[20];                    //作者
    char bclassfy[10];                    //类别编号
    float bprice;                        //价格
    struct book* next;                    //链表指针
}BookInfo;

BookInfo* CreateBooksList();            //创建链表
void Insert(BookInfo* head);            //插入
void Delete(BookInfo* head);            //删除
void Print(BookInfo* head);                //浏览
void Search(BookInfo* head);            //查询
void Update(BookInfo* head);            //修改
void Save(BookInfo* head);                //保存
int menu();                                //菜单

StuManage.c

#define _CRT_SECURE_NO_WARNINGS
#include "StuManage.h"
#include <stdlib.h>
#include <string.h>

//创建书单
BookInfo* CreateBooksList()
{
    BookInfo* head;
    head = (BookInfo*)malloc(sizeof(BookInfo));        //为头结点分配空间
    head->next = NULL;                                //初始化头指针
    return head;
}
//插入记录
void Insert(BookInfo* head)
{
    BookInfo *b, *p;
    char flag = 'Y';
    p = head;
    while (p->next != NULL)
        p = p->next;
    //开辟新空间,存储书籍信息,并加入链表
    while (flag == 'Y' || flag == 'y')
    {
        b = (BookInfo*)malloc(sizeof(BookInfo));    //开辟新空间
        printf("请输入图书编号:");                    //获取书籍信息
        fflush(stdin);                                //清空缓冲区
        scanf("%s", b->bnum);
        printf("请输入书名:");
        fflush(stdin);
        scanf("%s", b->bname);
        printf("请输入作者:");
        fflush(stdin);
        scanf("%s", b->bauthor);
        printf("请输入类别编号:");
        fflush(stdin);
        scanf("%s", b->bclassfy);
        printf("请输入图书价格:");
        fflush(stdin);
        scanf("%f", &b->bprice);
        p->next = b;                                //将新增加的结点加入链表
        p = b;                                        //指针p向后移动,指向尾结点
        b->next = NULL;
        printf("添加成功!\n继续添加?(Y/N):");
        fflush(stdin);
        scanf("%c", &flag);
        if (flag == 'N' || flag == 'n')break;
        else if (flag == 'Y' || flag == 'y')continue;
    }
    return;
}
//删除记录
void Delete(BookInfo* head)
{
    BookInfo *b, *p;
    char tmp[30];
    int flag;                                        //标志位,判断是否找到了要删除的书籍
    flag = 0;
    b = head;
    p = head;
    printf("请输入要删除的书籍名:");
    fflush(stdin);
    scanf("%s", tmp);
    //遍历链表
    while (p != NULL)
    {
        if (strcmp(p->bname, tmp) == 0)
        {
            flag = 1;
            break;
        }
        p = p->next;
    }
    if (flag == 1)
    {
        for (; b->next != p;)
            b = b->next;
        b->next = p->next;
        free(p);
        printf("删除成功!\n");
    }
    else
        printf("该书不存在!");
    return;
}
//浏览书单
void Print(BookInfo* head)
{
    BookInfo *p;
    if (head == NULL || head->next == NULL)                //判断链表是否为空
    {
        printf("无记录!\n");
        return;
    }
    p = head;
    printf("┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━┓\n");
    printf("┃ 编号 ┃   书名   ┃   作者   ┃ 类别编号 ┃  价格  ┃\n");
    printf("┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━┫\n");
    //遍历链表,输出书籍信息
    while (p->next != NULL)
    {
        p = p->next;
        printf("┃%-6s┃%-10s┃%-10s┃%-10s┃%.2lf   ┃\n", p->bnum,
            p->bname, p->bauthor, p->bclassfy, p->bprice);
        printf("┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━┛\n");
    }
}
//查找书籍
void Search(BookInfo* head)
{
    BookInfo *p;
    char tmp[30];
    int flag = 0;
    p = head;
    if (head == NULL || head->next == NULL)
        printf("清单为空!\n");
    else
    {
        printf("请输入书名:");
        fflush(stdin);
        scanf("%s", tmp);
        while (p->next != NULL)
        {
            p = p->next;
            if (strcmp(p->bname, tmp) == 0)
            {
                flag = 1;                                //书籍已找到
                printf("编号:%s\n书名:《%s》\n作者:%s\n分类:%s\n价格:%.2f\n",
                    p->bnum, p->bname, p->bauthor, p->bclassfy, p->bprice);
                return;
            }
            if (p->next == NULL)
                printf("\n查询完毕!");
        }
        if (flag == 0)
            printf("没有找到《%s》!\n", tmp);
    }
    return;
}
//修改信息
void Update(BookInfo* head)
{
    BookInfo *p;
    int flag = 0;
    char tmp[30];
    p = head;
    printf("请输入书名:");
    fflush(stdin);
    scanf("%s", tmp);
    while (p->next != NULL)
    {
        p = p->next;
        if (strcmp(p->bname, tmp) == 0)
        {
            flag = 1;                                //标志找到所要修改的书籍
            printf("请输入编号:");
            fflush(stdin);
            scanf("%s", p->bnum);
            printf("请输入书名:");
            fflush(stdin);
            scanf("%s", p->bname);
            printf("请输入作者:");
            fflush(stdin);
            scanf("%s", p->bauthor);
            printf("请输入类别编号:");
            fflush(stdin);
            scanf("%s", p->bclassfy);
            printf("请输入价格:");
            fflush(stdin);
            scanf("%f", &p->bprice);
        }
    }
    if (flag == 0)
        printf("没有找到《%s》!\n", tmp);
    return;
}
//保存书单到文件
void Save(BookInfo* head)
{
    BookInfo *p;
    FILE *fp;
    p = head;
    //以只写的方式打开文件
    fp = fopen("C:\\Users\\admin\\Desktop\\bookslist.txt", "w");
    fprintf(fp, "┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━┓\n");
    fprintf(fp, "┃ 编号 ┃   书名   ┃   作者   ┃ 类别编号 ┃  价格  ┃\n");
    fprintf(fp, "┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━┫\n");
    while (p->next != NULL)
    {
        p = p->next;
        fprintf(fp, "┃%-6s┃%-10s┃%-10s┃%-10s┃%.2lf   ┃\n",
            p->bnum, p->bname, p->bauthor, p->bclassfy, p->bprice);
        fprintf(fp, "┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━┛\n");
    }
    fclose(fp);
    printf("保存成功!\n");
    printf("数据已成功保存到C:\\Users\\admin\\Desktop\\bookslist.txt\n");
}
//菜单
int menu()
{
    int sec;
    printf("           图书管理系统              \n");
    printf("━━━━━━━━━━━━━━━━━━ \n");
    printf("          1-图书信息录入\n");
    printf("          2-图书信息浏览\n");
    printf("          3-图书信息查询\n");
    printf("          4-图书信息修改\n");
    printf("          5-图书信息删除\n");
    printf("          6-图书信息保存\n");
    printf("          7-退出\n");
    printf("━━━━━━━━━━━━━━━━━━ \n");
    printf("请选择:");
    fflush(stdin);
    scanf("%d", &sec);
    while (sec > 7 || sec < 0)
    {
        printf("选择有误!\n请重新输入:");
        scanf("%d", &sec);
    }
    return sec;
}

main.c

#include "StuManage.h"
#include <Windows.h>

int main()
{
    BookInfo *head;
    int sel;
    head = NULL;
    for (;;)
    {
        sel = menu();                        //输出菜单,并获取选择的功能
        switch (sel)
        {
        case 1:
            if (head == NULL)
                head = CreateBooksList();
            Insert(head);
            break;
        case 2:Print(head); break;
        case 3:Search(head); break;
        case 4:Update(head); break;
        case 5:Delete(head); break;
        case 6:Save(head); break;
        case 7:exit(0); break;
        default:break;
        }
    }
    return 0;
}