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++单线程同时监听多个端口,可以使用select和poll这两个系统调用。这两个函数都可以用来完成IO多路复用,允许开发者同时监视多个文件描述符的状态。以下是实现方法的详细攻略: 1. 创建套接字 在开始监听端口之前,需要先创建套接字。使用socket函数可以创建一个套接字,其中参数domain设置为AF_INET(IPv4地址族),type设置为S…

    C 2023年5月22日
    00
  • PHP实现数组转JSon和JSon转数组的方法示例

    下面是详细的“PHP实现数组转JSon和JSon转数组的方法示例”的攻略: 一、数组转JSON 1. json_encode() 函数 json_encode()函数是PHP中将一个数组转换为JSON格式字符串的标准方法。 语法:string json_encode ( mixed $value [, int $options = 0 [, int $dep…

    C 2023年5月23日
    00
  • C语言模拟实现strstr函数的示例代码

    C语言中的strstr函数是用来查找一个字符串中是否包含另一个字符串的函数,其原型定义如下: char *strstr(const char *haystack, const char *needle); 其中,haystack表示要查找的字符串,needle表示要搜索的子字符串。该函数返回子字符串在要查找的字符串中第一次出现的位置的指针,如果没有找到,则返…

    C 2023年5月24日
    00
  • golang分层测试之http接口测试入门教程

    我来详细讲解“golang分层测试之http接口测试入门教程”的完整攻略。该攻略包括以下几个部分: 1.前置知识 在学习golang分层测试之http接口测试之前,需要掌握一些基础知识,包括但不限于: Golang基础语法 RESTful API基本概念 Http协议 JSON数据格式 2.环境搭建 在进行http接口测试之前,需要搭建一套测试环境。可以从以…

    C 2023年5月23日
    00
  • C语言实现斗地主的核心算法

    下面我将为您详细讲解C语言实现斗地主的核心算法的完整攻略。 一、实现思路 1.1 牌型定义 我们可以采用两个数组来定义牌的大小和花色,其中大小可以用一个int值表示,花色可以用枚举类型表示。 1.2 发牌过程 发牌的过程可以采用随机数的方式实现,每个玩家依次取一张牌,直到每个玩家取到17张牌。 1.3 牌型判断 我们需要定义一个函数来判断牌的牌型,可以采用s…

    C 2023年5月22日
    00
  • 辐射4人员属性设定详细分析

    辐射4人员属性设定详细分析 在辐射4中,人员属性设定对游戏的角色扮演和流程起着很大的作用。本文将详细分析人员属性设定的每个部分,并提供一些有用的技巧和建议。 S.P.E.C.I.A.L S.P.E.C.I.A.L.代表了Strength(力量)、Perception(感知)、Endurance(耐力)、Charisma(魅力)、Intelligence(智力…

    C 2023年5月22日
    00
  • Java中json使用方法_动力节点Java学院整理

    Java中json使用方法_动力节点Java学院整理 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于描述复杂数据结构。JSON格式兼容JavaScript,Python,C#等多种编程语言,逐渐替代了XML成为当今最常用的数据交换格式之一。 JSON的语法 JSON的语法是类似于JavaScr…

    C 2023年5月23日
    00
  • C语言代码实现通讯录管理系统

    C语言代码实现通讯录管理系统 1. 思路 通讯录管理系统主要分为三个模块:显示、添加、删除联系人。首先,我们需要定义一个联系人的结构体,包含姓名、电话、地址等基本信息。然后,通过数组来存储联系人信息,可以通过遍历数组来显示已有联系人,通过添加、删除数组中的元素来添加、删除联系人信息。 2. 代码实现 2.1 定义联系人结构体 在这个管理系统中,我们需要联系人…

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