【图书管理系统】数据结构、链表、C/C++课程设计

一、前言

大家好!今天我想和大家分享一下我最近学习和开发的一个小项目——图书管理系统。这个系统是用C++编写的,主要功能包括信息注册、用户登录和图书管理。我给不同的功能页面添加了不同的背景色来区分,同时也做了输入校验。

在这篇博客中,我将详细介绍这个图书管理系统的功能、数据结构与算法、代码实现。希望通过这篇文章,能够帮助到正在学习C++和数据结构的朋友们。(完整代码附最后)
在这里插入图片描述

二、系统概述

2.1 功能简介

在这里插入图片描述

这个图书管理系统主要包括以下功能:

  1. 信息注册系统:用户可以注册账号和密码。
  2. 用户登录系统:用户可以输入账号和密码进行登录。
  3. 访问图书系统:用户可以建立书架、查询图书、查询价格、增加图书、删除图书和浏览库存。

2.2 系统架构

在这里插入图片描述

系统架构主要分为以下几个部分:

  • 全局变量和宏定义:用于标记用户状态和存储用户信息。
  • 图书信息结构体定义:用于存储图书的基本信息。
  • 单链表的定义和基本操作:用于存储和操作图书信息。
  • 用户交互界面和功能实现:用于实现用户注册、登录和图书管理功能。
  • 主函数:用于启动系统并显示主菜单。

三、数据结构与算法

3.1 单链表的定义与操作

系统使用单链表数据结构来存储图书信息。单链表的定义和基本操作如下:

typedef int Status; // Status 是函数返回值类型,其值是函数结果状态代码。
typedef struct LNode {
Book data; // 结点的数据域
struct LNode next; // 结点的指针域
} LNode, LinkList; // LinkList为指向结构体LNode的指针类型

单链表的基本操作包括初始化、获取元素、按值查找、插入元素和删除元素。

3.2 图书信息结构体

图书信息使用Book结构体存储,定义如下:

struct Book {
	string id; // ISBN
	string name; // 书名
	double price; // 定价
};

部分数据样例如下:

ISBN			书名					单价
9999999999922	Python					99
9787302203513	编译原理				46
9787811234923	汇编语言程序设计教程	21
9787512100831	计算机操作系统			17
9787302265436	计算机导论实验指导		18
9787302180630	实用数据结构			29
9787302225065	数据结构(C语言版)		38
9787302171676	C#面向对象程序设计		39
9787302250692	C语言程序设计			42
9787302150664	数据库原理				35
9787302260806	Java编程与实践			56
9787302252887	Java程序设计与应用教程	39
9787302198505	嵌入式操作系统及编程	25
9787302169666	软件测试				24
9787811231557	Eclipse基础与应用		35

四、功能实现详解

4.1 主菜单选择系统

在这里插入图片描述

void lmain() {
    system("cls");
    system("color 1F");
    printf("\n\n\t    欢迎使用Ahual图书管理系统\n\n");
    cout << "╔*☆***◎***◇***☆*** 菜单 ***☆***◇***◎***☆* ╗\n";
    cout << "|★|\t                              \t|★|\n";
    cout << "|☆|\t        一、信息注册系统      \t|☆|\n";
    cout << "|★|\t                              \t|★|\n";
    cout << "|☆|\t        二、用户登入系统      \t|☆|\n";
    cout << "|★|\t                              \t|★|\n";
    cout << "|☆|\t        三、访问图书系统      \t|☆|\n";
    cout << "|★|\t                              \t|★|\n";
    cout << "|☆|\t        四、退出管理系统      \t|☆|\n";
    cout << "|☆|\t                              \t|☆|\n";
    cout << "╚*☆***◎***◇****☆****★****☆****◇***◎***☆***╝";
    int choose;
    printf("\n\n\t    请按数字选择(仅数字,限1位,其他字符无法输入)\n\n");
    printf("\t    按回车键确定:");
    choose = weishu1();
    switch (choose) {
        case 1:
            main1();
            break;
        case 2:
            main2();
            break;
        case 3:
            main3();
            break;
        case 4:
            system("cls");
            exit(0);
            break;
        default:
            system("cls");
            cout << "\n\t\t操作结果提示↓\n\n";
            printf("**********************************************");
            printf("\n\n\t\t输入有误 请重新输入!\n\n");
            printf("**********************************************");
            printf("\n\n\t\t");
            system("pause");
            lmain();
    }
}

lmain函数是主菜单选择函数,用户可以选择进入信息注册系统、用户登录系统、访问图书系统或退出系统。

4.2 信息注册系统

在这里插入图片描述

信息注册系统允许用户注册账号和密码。主要函数如下:

void main1() {
    int tt1 = 0;//标记是否完成账号设置
    int choose;
    choose = -1;
    while (choose != 0) {
        system("cls");
        system("color 2F");
        printf("\n\n\t    您已进入账号注册系统系统\n\n");
        cout << "╔*☆***◎***◇***☆*** 菜单1 ***☆***◇***◎***☆* ╗\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t       一、请设置用户账号        \t|☆|\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t       二、设置数字登入密码     \t|☆|\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t       三、退出返回上一级        \t|☆|\n";
        cout << "|☆|\t                                 \t|☆|\n";
        cout << "╚*☆***◎***◇****☆**** ★****☆****◇***◎***☆* ╝";
        printf("\n\n\t    请按数字选择(无法输入其他字符或多个数字)\n\n");
        printf("\t    按回车键确定:");
        choose = weishu1();

        switch (choose)//功能函数
        {
            case 1:
                system("cls");
                cout << "\n\t\t用户操作提示↓\n\n";
                cout << "请设置用户账号(任意字符、任意长度的):";
                cin >> z1;
                system("cls");
                cout << "\n\t\t操作结果提示↓\n\n";
                printf("# # # # # # # # # # # # # # # # # # # # # # # #");
                printf("\n\n\t\t 账号注册成功!\n\n");
                tt1 = 1;//标记完成账号设置
                bj1 = 1;
                printf("# # # # # # # # # # # # # # # # # # # # # # # #");
                printf("\n\n\t\t");
                system("pause");
                break;
            case 2:
                if (tt1 != 1)//标记是否完成账号设置
                {
                    system("cls");
                    cout << "\n\t\t注册系统检查提醒↓\n\n";
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                    printf("\n\n\t  您未注册入账户 请先注册一个账号\n\n");
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ \n\n");
                    system("pause");
                    main1();
                }
                system("cls");
                cout << "\n\t\t用户操作提示↓\n\n";
                cout << "请设置登入密码(已受限数字,受限1-6位,不信试试):";
                m1 = weishu61();
                system("cls");
                cout << "\n\t\t操作结果提示↓\n\n";
                printf("# # # # # # # # # # # # # # # # # # # # # # # #");
                printf("\n\n\t\t 密码设置成功!\n\n");
                bj2 = 1;
                printf("# # # # # # # # # # # # # # # # # # # # # # # #");
                printf("\n\n\t\t");
                system("pause");
                break;
            case 3:
                zcbj = bj1 + bj2;
                lmain();
                break;
            default:
                system("cls");
                cout << "\n\t\t操作结果提示↓\n\n";
                printf("# # # # # # # # # # # # # # # # # # # # # # # #");
                printf("\n\n\t\t输入有误 请重新输入!\n\n");
                printf("# # # # # # # # # # # # # # # # # # # # # # # #");
                printf("\n\n\t\t");
                system("pause");
        }

    }
    return;

}

4.3 用户登录系统

在这里插入图片描述

用户登录系统允许用户输入账号和密码进行登录。主要函数如下:

void main2() {
    int tt2 = 0;//标记是否完成账号输入
    system("color 0A");
    if (zcbj != 2) //检查是否已经注册
    {
        system("cls");
        cout << "\n\t\t登入系统检查提示↓\n\n";
        printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
        printf("\n\n\t  用户尚未注册 请先返回注册!\n\n");
        printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ \n\n");
        system("pause");
        lmain();
    }

    int choose;
    choose = -1;
    while (choose != 0) {
        system("cls");
        system("color 0A");
        printf("\n\n\t    您已进入用户登入系统\n\n");
        cout << "╔*☆***◎***◇***☆*** 菜单2 ***☆***◇***◎***☆* ╗\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t       一、请输入用户账号        \t|☆|\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t       二、请输入登入密码        \t|☆|\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t       三、退出返回上一级        \t|☆|\n";
        cout << "|☆|\t                                 \t|☆|\n";
        cout << "╚*☆***◎***◇****☆**** ★****☆****◇***◎***☆* ╝";
        printf("\n\n\t    请按数字选择(无法输入其他字符)\n\n");
        printf("\t    按回车键确定:");
        choose = weishu1();

        switch (choose)//功能函数
        {
            case 1:
                system("cls");
                cout << "\n\t\t用户操作提示↓\n\n";
                cout << "请输入用户账号:";
                cin >> z2;
                if (z1 == z2) {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                    printf("\n\n\t\t 账号匹配成功!\n\n");
                    tt2 = 1;//标记已经完成账号输入
                    bj3 = 1;
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                    printf("\n\n\t\t");
                    system("pause");
                } else {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                    printf("\n\n\t\t 账号不存在匹配失败!\n\n");
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                    printf("\n\n\t\t");
                    system("pause");
                }
                break;
            case 2:
                if (tt2 != 1)//标记没有完成账号输入
                {
                    system("cls");
                    cout << "\n\t\t系统检查提示↓\n\n";
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                    printf("\n\n\t  未输入账户 请先输入账号!\n\n");
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ \n\n");
                    system("pause");
                    main2();
                }
                system("cls");
                cout << "\n\t\t用户操作提示↓\n\n";
                cout << "请输入设置的密码(已加密*):";
                m2 = weishu62();//加密输入
                if (m1 == m2) {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                    printf("\n\n\t\t 密码正确,登入成功!\n\n");
                    bj4 = 1;
                    printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                    printf("\n\n\t\t");
                    system("pause");
                    main2();
                } else {
                    for (int k = 0; k < 3; k++) {
                        system("cls");
                        cout << "\n\t\t操作结果提示↓\n\n";
                        printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                        printf("\n\n\t  密码错误,还剩%d次\n\n", 3 - k);
                        printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                        printf("\n\n\t\t");
                        system("pause");
                        system("cls");
                        cout << "\n\t\t用户操作提示↓\n\n";
                        cout << "请重新输入正确的密码:";
                        m2 = weishu62();
                        if (m1 == m2) {
                            system("cls");
                            cout << "\n\t\t操作结果提示↓\n\n";
                            printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                            printf("\n\n\t\t 密码正确,登入成功!\n\n");
                            bj4 = 1;
                            printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                            printf("\n\n\t\t");
                            system("pause");
                            main2();
                        }
                        if (k == 2) {
                            system("cls");
                            cout << "\n\t\t操作结果提示↓\n\n";
                            printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                            printf("\n\n\t   密码错误3次,请重新注册账号\n\n");
                            printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                            printf("\n\n\t\t");
                            system("pause");
                            zcbj = 0;
                            lmain();
                        }
                    }
                }
                break;
            case 3:
                drbj = bj3 + bj4;
                lmain();
                break;
            default:
                system("cls");
                cout << "\n\t\t操作结果提示↓\n\n";
                printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                printf("\n\n\t\t输入有误 请重新输入!\n\n");
                printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
                printf("\n\n\t\t");
                system("pause");
        }
    }
    return;

}

4.4 访问图书系统

在这里插入图片描述

访问图书系统允许用户建立书架、查询图书、查询价格、增加图书、删除图书和浏览库存。主要函数如下:

void main3() {
    system("color 5F");
    if (drbj != 2)  //检查是否已经登入
    {
        system("cls");
        cout << "\n\t\t访问系统检查提醒↓\n\n";
        printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ");
        printf("\n\n\t  用户尚未登入 请先返回登入!\n\n");
        printf("@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ \n\n");
        system("pause");
        lmain();
    }
    int a, y = 0;
    double price;
    Book e; //结构体实例
    int choose;
    LinkList L, p;
    choose = -1;
    while (choose != 0) {
        system("cls");
        system("color 5F");
        printf("\n\n\t    您已进入访问图书系统\n\n");
        cout << "╔*☆***◎***◇***☆*** 菜单2 ***☆***◇***◎***☆* ╗\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t          1. 建立书架            \t|☆|\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t          2. 查询图书            \t|☆|\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t          3. 查询价格            \t|☆|\n";
        cout << "|☆|\t                                 \t|☆|\n";
        cout << "|☆|\t          4. 增加图书            \t|☆|\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t          5. 删除图书            \t|☆|\n";
        cout << "|★|\t                                 \t|★|\n";
        cout << "|☆|\t          6. 库存浏览            \t|☆|\n";
        cout << "|☆|\t                                 \t|☆|\n";
        cout << "|☆|\t          7.返回上一层           \t|☆|\n";
        cout << "|☆|\t                                 \t|☆|\n";
        cout << "╚*☆***◎***◇****☆**** ★****☆****◇***◎***☆* ╝";
        printf("\n\n\t    请按数字选择(无法输入其他字符)\n\n");
        printf("\t    按回车键确定:");
        choose = weishu1();
        switch (choose) {
            case 1://使用后插法创建单链表
                InitList_L(L);
                CreateList_R(L, length);
                system("cls");
                cout << "\n\t\t操作结果提示↓\n\n";
                printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                cout << "\n\n\t  输入 book.txt 信息完毕\n\n";
                printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                system("pause");
                break;
            case 2: //单链表的按序号取值
                system("cls");
                cout << "\n\t\t用户操作提示↓\n\n";
                cout << "请输入您想查询书架上第(_)本书的信息:";
                cin >> a;
                if (GetElem_L(L, a, e)) {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    cout << "第" << a << "本图书的信息是:";
                    cout << left << setw(15) << e.id << "  " << left << setw(50)
                         << e.name << " \t" << e.price << endl
                         << endl;
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    system("pause");
                } else {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                    cout << "\n\n\t  超出范围 查找失败\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    system("pause");
                }
                break;
            case 3: //单链表的按值查找
                system("cls");
                p = L->next;
                while (p) {
                    y++;
                    cout << left << setw(5) << p->data.price << "  ";
                    if (y % 5 == 0)
                        cout << endl;
                    p = p->next;
                }
                cout << "\n\t\t用户操作提示↓\n\n";
                cout << "\n请输入所要查找价格:";
                cin >> price;
                if (LocateElem_L(L, price) != NULL) {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                    cout << "\n\n\t  查找成功\n\n";
                    cout << "该价格对应的书名为:" << LocateElem_L(L, price)->data.name << endl << endl;
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    system("pause");
                } else {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                    cout << "\n\n\t  查找失败! 定价" << price << " 没有找到\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    system("pause");
                }
                break;
            case 4: //单链表的插入
                system("cls");
                cout << "\n\t\t用户操作提示↓\n\n";
                cout << "请输入增加的书籍信息 插入位置  编号   书名       价格(空格隔开)\n\n";
                cout << "样例 (四个信息)      1         97871  C语言基础  55\n";
                cout << "样例 (四个信息)      2         97872  C++基础    66\n";
                cout << "样例 (四个信息)      3         97873  数据结构   77\n";
                cout << "依次输入:           ";
                cin >> a;
                cin >> e.id >> e.name >> e.price;
                if (ListInsert_L(L, a, e)) {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                    cout << "\n\n\t  书本信息插入成功\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    system("pause");
                } else {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                    cout << "\n\n\t  格式错误 插入失败\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    system("pause");
                }
                break;
            case 5: //单链表的删除
                system("cls");
                cout << "请输入所要删除的书籍的位置:";
                cin >> a;
                if (ListDelete_L(L, a)) {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                    cout << "\n\n\t  删除成功!\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    system("pause");
                } else {
                    system("cls");
                    cout << "\n\t\t操作结果提示↓\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                    cout << "\n\n\t 位置错误 删除失败!\n\n";
                    printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                    system("pause");
                }
                break;
            case 6: //单链表的输出
                system("cls");
                cout << "\n\t\t操作结果提示↓\n\n";
                printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                p = L->next;
                while (p) {
                    cout << left << setw(15) << p->data.id << "\t" << left << setw(
                            50) << p->data.name << "\t" << left << setw(5)
                         << p->data.price << endl;
                    p = p->next;
                }
                cout << endl;
                printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                system("pause");
                break;
            case 7:
                lmain();
                break;
            default:
                system("cls");
                cout << "\n\t\t操作结果提示↓\n\n";
                printf("* * * * * * * * * * * * * * * * * * * * * * * *");
                printf("\n\n\t\t输入有误 请重新输入!\n\n");
                printf("* * * * * * * * * * * * * * * * * * * * * * * *\n\n");
                system("pause");
        }
    }
    system("cls");
    printf("\n\n\t\t访问结束按任意键返回\n\n");
    getch();
    lmain();
    return;
}

五、详细代码分析

5.1 全局变量和宏定义

#define OK 1
#define ERROR 0
#define OVERFLOW -2

int bj1 = 0;  //标记是否完成账号注册
int bj2 = 0;  //标记是否完成密码设置
int bj3 = 0;  //标记是否完成账号输入
int bj4 = 0;  //标记是否完成密码正确

string z1, z2; //账号12
int ch, m1, m2; //密码12
int zcbj = 0, drbj = 0; //标记注册是否完成,标记登入是否完成

这些全局变量用于标记用户注册和登录的状态,以及存储用户的账号和密码。

5.2 单链表操作函数

  1. 初始化单链表
Status InitList_L(LinkList &L) {
    L = new LNode; // 生成新结点作为头结点,用头指针L指向头结点
    L->next = NULL; // 头结点的指针域置空
    return OK;
}

InitList_L函数用于初始化一个空的单链表,创建头节点并将其指针域置空。
2. 获取单链表中的元素

Status GetElem_L(LinkList L, int i, Book &e) {
    int j = 1;
    LinkList p = L->next;
    while (j < i && p) {
        p = p->next;
        ++j;
    }
    if (!p || j > i)
        return ERROR;
    e = p->data;
    return OK;
}

GetElem_L函数用于在单链表中查找第i个元素,并将其值返回。
3. 按值查找单链表中的元素

LNode *LocateElem_L(LinkList L, int e) {
    LinkList p = L->next;
    while (p && p->data.price != e)
        p = p->next;
    return p;
}

LocateElem_L函数用于在单链表中查找值为e的元素,返回该节点的地址。
4. 在单链表中插入元素

Status ListInsert_L(LinkList &L, int i, Book &e) {
    int j = 0;
    LinkList p = L;
    while (p && j < i - 1) {
        p = p->next;
        ++j;
    }
    if (!p || j > i - 1)
        return ERROR;
    LinkList s = new LNode;
    s->data = e;
    s->next = p->next;
    p->next = s;
    ++length;
    return OK;
}

ListInsert_L函数用于在单链表的第i个位置插入值为e的新节点。
5. 删除单链表中的元素

Status ListDelete_L(LinkList &L, int i) {
    LinkList p = L;
    int j = 0;
    while ((p->next) && (j < i - 1)) {
        p = p->next;
        ++j;
    }
    if (!(p->next) || (j > i - 1))
        return ERROR;
    LinkList q = p->next;
    p->next = q->next;
    delete q;
    --length;
    return OK;
}

ListDelete_L函数用于删除单链表中第i个位置的节点。
6. 前插法创建单链表

注意:这里的book.txt需要在代码的同级目录,或者可以传入绝对路径

void CreateList_H(LinkList &L, int n) {
    LinkList p;
    L = new LNode;
    L->next = NULL;
    length = 0;
    fstream file;
    file.open("book.txt");
    if (!file) {
        cout << "未找到相关文件,无法打开!" << endl;
        exit(ERROR);
    }
    file >> head_1 >> head_2 >> head_3;
    while (!file.eof()) {
        p = new LNode;
        file >> p->data.id >> p->data.name >> p->data.price;
        p->next = L->next;
        L->next = p;
        length++;
    }
    file.close();
}

CreateList_H函数用于通过前插法创建单链表,从文件中读取图书信息并插入链表。
7. 后插法创建单链表

void CreateList_R(LinkList &L, int n) {
    LinkList p, r;
    L = new LNode;
    L->next = NULL;
    r = L;
    length = 0;
    fstream file;
    file.open("D:\\Desktop\\ACM\\book.txt");
    if (!file) {
        cout << "未找到相关文件,无法打开!" << endl;
        system("pause");
        exit(ERROR);
    }
    file >> head_1 >> head_2 >> head_3;
    while (!file.eof()) {
        p = new LNode;
        file >> p->data.id >> p->data.name >> p->data.price;
        p->next = NULL;
        r->next = p;
        r = p;
        length++;
    }
    file.close();
}

CreateList_R函数用于通过后插法创建单链表,从文件中读取图书信息并插入链表。

六、完整项目代码、演示视频

6.1 项目元源码

完整的项目代码和课程设计报告已经打包好放在github仓库,需要自取:项目源码

6.2 演示视频

如果你还不了解这个项目的内容,可以点击查看:演示视频

六、总结

通过开发这个图书管理系统,你应该对单链表数据结构的理解。这个系统虽然功能简单,但涵盖了从数据结构定义、基本操作到用户交互界面的完整实现过程。

图书管理系统C++编写程序就分享到这里啦,代码可能存在语法不严谨的地方,或者有读不懂的corder,可以在评论区留言,大家共同讨论,共同进步!!

希望这篇博客能够对大家有所帮助,也欢迎大家提出宝贵的意见和建议。谢谢阅读!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ahual_cici

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

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

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

打赏作者

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

抵扣说明:

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

余额充值