某图书管理系统中,书本种类信息包括:书号,书名,价格三项属性,且书的种类不超过20种,要求使用双向循环链表表示。要求实现的操作,初始化,插入,删除,从某一位置正序及倒叙输出所有书本信息(如四本书的情况下,按照2341、2143等顺序输出
时间: 2024-10-27 20:05:33 浏览: 23
软件工程图书管理系统需求规格说明书.pdf
在图书管理系统中,我们可以使用双向循环链表来存储书本信息,因为这种方式支持高效地在链表两端添加或删除元素,同时也能方便地遍历链表。以下是使用C++实现的基础框架:
```cpp
#include <iostream>
// 定义书本节点结构体
struct BookNode {
int bookId;
std::string bookName;
double price;
BookNode* prev;
BookNode* next;
};
class BookCatalogue {
private:
BookNode* head; // 链表头
int numTypes; // 书本种类数量
public:
BookCatalogue() : head(nullptr), numTypes(0) {}
// 初始化链表为空
void init() {
head = nullptr;
numTypes = 0;
}
// 插入书本,如果种类超过20,则不插入
void insertBook(int id, const std::string& name, double price) {
if (numTypes >= 20) {
std::cout << "Too many book types, insertion skipped." << std::endl;
return;
}
BookNode* newNode = new BookNode();
newNode->bookId = id;
newNode->bookName = name;
newNode->price = price;
newNode->prev = nullptr;
newNode->next = head;
if (head != nullptr) {
head->prev = newNode;
} else {
newNode->next = newNode; // 创建循环链表
}
head = newNode;
numTypes++;
}
// 删除书本,从头开始查找
bool removeBookById(int id) {
if (head == nullptr || numTypes == 0) return false;
BookNode* curr = head;
while (curr != nullptr && curr->bookId != id) {
curr = curr->next;
}
if (curr == nullptr) return false;
if (curr->prev != nullptr) {
curr->prev->next = curr->next;
} else {
head = curr->next; // 更新头节点
}
if (curr->next != nullptr) {
curr->next->prev = curr->prev;
} else {
tail = curr->prev; // 更新尾节点
}
delete curr;
numTypes--;
return true;
}
// 正序输出所有书本信息
void printBooksInOrder() {
if (head == nullptr) return;
BookNode* temp = head;
do {
cout << "ID: " << temp->bookId << ", Title: " << temp->bookName << ", Price: " << temp->price << endl;
temp = temp->next;
} while (temp != head);
}
// 倒序输出所有书本信息
void printBooksReversed() {
if (tail == nullptr) return;
BookNode* temp = tail;
do {
cout << "ID: " << temp->bookId << ", Title: " << temp->bookName << ", Price: " << temp->price << endl;
temp = temp->prev;
} while (temp != tail);
}
private:
BookNode* tail; // 链表尾
};
int main() {
BookCatalogue catalogue;
catalogue.init();
// 添加书籍示例
catalogue.insertBook(1, "Book A", 25.99);
catalogue.insertBook(2, "Book B", 39.99);
catalogue.insertBook(3, "Book C", 49.99);
// 输出示例
catalogue.printBooksInOrder();
catalogue.printBooksReversed();
// 删除书籍示例
catalogue.removeBookById(2);
return 0;
}
```
在这个代码中,我们实现了初始化、插入、删除书本的功能,并分别提供了正序和倒序输出所有书本信息的方法。注意,这个实现假定书本的种类数量始终小于等于20,如果实际需求中种类数量可能变化,你需要调整相关的判断条件。
阅读全文