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语言实现刮刮乐效果”的完整攻略,我们可以分以下几个步骤来讲解: 1. 设计一个刮刮乐区域 首先,在C语言实现刮刮乐效果之前,我们需要先设计一个刮刮乐的区域。这个区域可以是一个矩形或者是一个圆形,具体的形状可以根据实际需求来进行选择。 #include <stdio.h> #include <stdlib.h>…

    C 2023年5月23日
    00
  • C if else if ladder

    C 语言中的 if else if 梯形结构又被称作 if else if ladder,它是多个条件语句的嵌套,可以用来实现复杂的条件判断。以下是 if else if ladder 的完整使用攻略: 梯形结构语法格式 if (condition1) { statement1; } else if (condition2) { statement2; } …

    C 2023年5月9日
    00
  • C语言实现猜数字小游戏

    以下是详细讲解“C语言实现猜数字小游戏”的完整攻略。 第一步:获取用户输入的数字 为实现猜数字小游戏的基本功能,首先需要获取用户输入的数字。可以使用C语言的标准库函数scanf()来实现。示例代码如下: int guess_num; // 定义变量来存储用户输入的数字 printf("请猜一个数字:"); scanf("%d&q…

    C 2023年5月23日
    00
  • C++解密Chrome80版本数据库的方法示例代码

    下面是针对C++解密Chrome80版本数据库的方法示例代码的完整攻略及示例说明: 攻略 1.获取加密数据 首先,我们需要获取Chrome80版本数据库的加密数据。Chrome80版本默认采用AES256-CBC加密算法加密其数据库文件,所以我们需要获取SQLite数据库文件的相关信息,以便于进行解密。 2.解密过程说明 我们可以通过C++语言来解密Chro…

    C 2023年5月22日
    00
  • C语言实验报告范例

    实验报告四 一, 实验类型:设计型 二, 实验室: 三, 指导老师: 四, 日期: 五, 实验名称:if分支语句的嵌套 六, 实验目的: 1, 学习if嵌套结构,能够用C语言编程解决日常生活的实例 2, 明确if语句在实现分支结构控制语句方面的特点和优势 3, 熟练掌握关系运算符、关系表达式、逻辑运算符和逻辑表达式、条件运算符和条件表达式,会使用if分支语句…

    C 2023年4月25日
    00
  • C语言实现银行管理系统(文件操作)

    C语言实现银行管理系统(文件操作)攻略 1. 概述 这篇攻略介绍如何使用C语言实现一个基本的银行管理系统,并使用文件读写操作进行数据的存取。银行管理系统的功能包括用户注册、登录、存款、取款、查询余额等。 2. 数据结构设计 为了实现银行管理系统,我们需要使用一些数据结构来存储用户信息。以下是我们所需要使用的数据结构: // 用户账户结构体 typedef s…

    C 2023年5月23日
    00
  • CCleaner怎么关闭自动更新?CCleaner关闭自动更新方法

    当你安装CCleaner之后,它默认会启用自动更新功能,这意味着即使你不手动检查更新,它也会在后台自动下载并安装新版本的CCleaner。对于一些用户来说,这可能不是一个理想的操作行为。那么,如何关闭CCleaner自动更新呢?下面是详细的步骤。 方法一:通过CCleaner程序关闭自动更新 打开CCleaner程序,点击左下角的“选项”按钮。 切换到“设置…

    C 2023年5月23日
    00
  • win10激活出现0xc0020036怎么解决?

    解决Win10激活错误码0xc0020036 问题描述 在尝试激活Windows 10时,可能遇到错误码0xc0020036。这意味着您无法激活Windows,不能使用所有Win10的功能。该错误是由于软件许可证助手(SLUI)进程出现错误导致的。许多用户在尝试激活Windows时会遇到此错误。该问题可能是由于以下原因导致: 无法连接到许可证服务器 未知错误…

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