C++使用链表实现图书管理系统

C++使用链表实现图书管理系统

引言

链表是一种常见的数据结构,它可以实现动态的存储和操作数据。在实际应用中,我们通常会将链表作为基础数据结构来实现一些更为复杂的问题。本篇文章将介绍如何使用链表来实现一个图书管理系统。

需求分析

首先,我们需要明确需求,以此来确定整个系统的实现思路。本次图书管理系统需要实现以下功能:

  • 添加书籍
  • 删除书籍
  • 修改书籍信息
  • 检索书籍
  • 显示书籍信息

设计思路

结合需求分析,我们可以得出使用链表来实现图书管理系统的思路:

  • 定义一个图书节点的结构体
  • 定义一个链表结构体,用于存储所有图书节点
  • 按照需求分析,实现对应的功能

系统实现

定义图书节点的结构体

首先,我们需要定义一个图书节点的结构体,它应该包括图书的一些基本信息,如书名、作者、出版社、出版时间等。

struct BookNode{
    string title;
    string author;
    string publisher;
    string pub_date;
    struct BookNode* next;
};

定义链表结构体

接着,我们需要定义一个链表结构体,用于存储所有图书节点。链表结构体应该包括图书链表的头节点指针、图书总数等信息。

struct BookList{
    struct BookNode* head;
    int count;
};

实现添加书籍功能

添加书籍功能需要向链表末尾添加一个新的图书节点。我们可以先定义一个新的图书节点,然后遍历链表找到链表末尾并将新节点添加到链表末尾。

bool add_book(BookList &list, BookNode &book){
    BookNode* new_book = new BookNode;
    new_book->title = book.title;
    new_book->author = book.author;
    new_book->publisher = book.publisher;
    new_book->pub_date = book.pub_date;
    new_book->next = NULL;

    if(list.head == NULL){
        list.head = new_book;
    }
    else{
        BookNode* p = list.head;
        while(p->next != NULL){
            p = p->next;
        }
        p->next = new_book;
    }
    list.count++;
    return true;
}

实现删除书籍功能

删除书籍功能可以根据书名或者作者名查找到图书节点,并从链表中删除该节点。

bool delete_book(BookList &list, string title){
    if(list.head == NULL){
        return false;
    }
    BookNode* p = list.head;
    if(p->title == title){
        list.head = p->next;
        delete p;
        list.count--;
        return true;
    }
    while(p->next != NULL){
        if(p->next->title == title){
            BookNode* tmp = p->next;
            p->next = tmp->next;
            delete tmp;
            list.count--;
            return true;
        }
        p = p->next;
    }
    return false;
}

实现修改书籍信息功能

修改书籍信息功能可以先查找到需要修改的图书节点,然后修改其对应的属性。

bool update_book(BookList &list, string title, BookNode &book){
    if(list.head == NULL){
        return false;
    }
    BookNode* p = list.head;
    while(p != NULL){
        if(p->title == title){
            p->title = book.title;
            p->author = book.author;
            p->publisher = book.publisher;
            p->pub_date = book.pub_date;
            return true;
        }
        p = p->next;
    }
    return false;
}

实现检索书籍功能

检索书籍功能可以根据书名或者作者名查找到对应的图书节点,并显示其所有属性。

bool search_book(BookList &list, string keyword){
    if(list.head == NULL){
        return false;
    }
    BookNode* p = list.head;
    while(p != NULL){
        if(p->title == keyword || p->author == keyword){
            cout<<"Title: "<<p->title<<endl;
            cout<<"Author: "<<p->author<<endl;
            cout<<"Publisher: "<<p->publisher<<endl;
            cout<<"Publish Date: "<<p->pub_date<<endl;
            return true;
        }
        p = p->next;
    }
    return false;
}

实现显示书籍信息功能

显示书籍信息功能可以遍历整个链表,显示每一个图书节点的所有属性。

void show_books(BookList &list){
    if(list.head == NULL){
        cout<<"No books!"<<endl;
        return;
    }
    BookNode* p = list.head;
    while(p != NULL){
        cout<<"Title: "<<p->title<<endl;
        cout<<"Author: "<<p->author<<endl;
        cout<<"Publisher: "<<p->publisher<<endl;
        cout<<"Publish Date: "<<p->pub_date<<endl;
        cout<<endl;
        p = p->next;
    }
}

示例说明

下面提供两个示例来说明如何使用链表实现图书管理系统。

示例一:添加书籍

int main(){
    BookList list;
    list.head = NULL;
    list.count = 0;

    BookNode book1 = {"C++ Primer", "Lippman", "Addison-Wesley", "JAN-01-2022", NULL};
    BookNode book2 = {"Thinking in Java", "Eckel", "Prentice Hall", "JAN-01-2022", NULL};
    BookNode book3 = {"The C Programming Language", "K&R", "Prentice Hall", "JAN-01-2022", NULL};

    add_book(list, book1);
    add_book(list, book2);
    add_book(list, book3);

    show_books(list);

    return 0;
}

输出结果:

Title: C++ Primer
Author: Lippman
Publisher: Addison-Wesley
Publish Date: JAN-01-2022

Title: Thinking in Java
Author: Eckel
Publisher: Prentice Hall
Publish Date: JAN-01-2022

Title: The C Programming Language
Author: K&R
Publisher: Prentice Hall
Publish Date: JAN-01-2022

示例二:删除书籍

int main(){
    BookList list;
    list.head = NULL;
    list.count = 0;

    BookNode book1 = {"C++ Primer", "Lippman", "Addison-Wesley", "JAN-01-2022", NULL};
    BookNode book2 = {"Thinking in Java", "Eckel", "Prentice Hall", "JAN-01-2022", NULL};
    BookNode book3 = {"The C Programming Language", "K&R", "Prentice Hall", "JAN-01-2022", NULL};

    add_book(list, book1);
    add_book(list, book2);
    add_book(list, book3);

    delete_book(list, "Thinking in Java");

    show_books(list);

    return 0;
}

输出结果:

Title: C++ Primer
Author: Lippman
Publisher: Addison-Wesley
Publish Date: JAN-01-2022

Title: The C Programming Language
Author: K&R
Publisher: Prentice Hall
Publish Date: JAN-01-2022

总结

本篇文章简要介绍了如何使用链表来实现一个图书管理系统,并提供了两个示例来说明其使用方法。链表是一种十分常用的数据结构,在程序设计中能够发挥重要的作用,我们应当熟练掌握其基本使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++使用链表实现图书管理系统 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C币交易所是怎么交易数字货币的?C币交易所支持哪些数字货币交易?

    C币交易所是一个数字货币交易平台,支持用户交易多种数字货币。在 C币交易所进行数字货币交易,需要注册一个账户,然后在账户中充值一定数量的数字资产,再根据当前市场价格进行买卖交易。 以下是数字货币交易的具体流程: 1. 注册账户 在C币交易所的官网上点击注册按钮,填写必要的个人信息完成注册并激活账户后,即可开始数字货币交易。 2. 充值数字资产 在C币交易所首…

    C 2023年5月23日
    00
  • 解决开机时svchost.exe的CPU占用率过高导致系统异常缓慢

    针对“解决开机时svchost.exe的CPU占用率过高导致系统异常缓慢”的问题,可以按照以下步骤进行: 1. 确认问题 首先要确认svchost.exe的CPU占用率过高是否是系统缓慢的主要原因。可以打开任务管理器(快捷键Ctrl+Shift+Esc),在进程标签页中找到svchost.exe进程,将其展开,查看对应的服务列表。如果某个服务的CPU占用过高…

    C 2023年5月22日
    00
  • Qt5 实现主窗口状态栏显示时间

    作为一个Qt5开发者,我们要实现主窗口状态栏显示时间,可以按照以下步骤进行: Step 1:创建状态栏 首先,我们需要在主窗口中创建状态栏,可以在构造函数中添加如下代码: QMainWindow::QMainWindow(QWidget *parent) : QMainWindow(parent) { statusBar()->showMessage(…

    C 2023年5月22日
    00
  • 教你分辨C++堆与栈的区别

    分辨C++堆与栈的区别是每个C++编程学习者在学习过程中都需要掌握的重要知识点。在这里,我将会给大家提供一份完整攻略,以帮助大家更好地学习和理解这个概念。 什么是堆和栈 在C++中,堆和栈都是存储数据的地方。其中,栈是由系统自动分配和释放的,它是一块用于临时存储数据的内存空间。而堆则是由开发人员手动分配和释放的用于存储数据的内存空间。 堆和栈的区别 内存释放…

    C 2023年5月22日
    00
  • C语言入门之基础知识详解

    C语言入门之基础知识详解 简介 C语言是一种通用的高级计算机程序设计语言。它是由贝尔实验室的Dennis Ritchie于20世纪70年代早期开发的。对于那些想要成为程序员的人来说,学习C语言是个很好的开始。C语言仍然是许多操作系统,应用程序和游戏引擎的基础。 本文将为您提供关于C语言入门的详细攻略,包括基础知识,语法和编程实践等方面。 基础知识 在学习C语…

    C 2023年5月23日
    00
  • C++详解如何通过模板实现元素的反序

    当我们需要对一组数据进行反序操作时,可以通过模板来实现。下面就详细说明如何通过模板实现元素的反序操作: 1. 利用模板实现反序函数 我们可以通过模板函数将需要反序的数组作为参数传递进去,然后在函数中进行元素反转操作,最后返回反序后的数组。下面是一段通过模板实现反序函数的代码示例: template<typename T> void Reverse…

    C 2023年5月23日
    00
  • C程序 将以英寸-英尺为单位的N个距离相加

    可以使用以下步骤完成C程序 将以英寸-英尺为单位的N个距离相加: 步骤一:定义距离变量和变量总数 首先需要定义变量来保存距离和距离总数,可以使用float类型来保存距离,int类型来保存距离总数,例如: int n; // 距离总数 float distance; // 单位为英尺或英寸的距离 步骤二:输入距离 使用循环结构来输入所有距离,例如: for(i…

    C 2023年5月9日
    00
  • 一起聊聊Java中的自定义异常

    下面我将详细讲解“一起聊聊Java中的自定义异常”的完整攻略。 什么是异常? 在Java程序运行过程中,如果程序出现错误,就称之为异常。Java提供了两种异常类型,分别是Java API中预定义的异常和自定义异常。 自定义异常的作用 自定义异常是为了更好地把控程序的错误处理,使程序结构更加清晰,提高可读性和可维护性。自定义异常一般继承于Exception或R…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部