#include <iostream> #include <string> #define OK 1 #define ERROR 0 using namespace std; typedef int Status; //typedef int ElemType; typedef struct Book { string no; string title; string writer; string price; struct Book *next; }Book,*BookList; Status InitBookList(BookList &L)//初始化 { L=new Book; L->next=NULL; return OK; } Status CreateBookList(BookList &L,int n)//输入 { BookList p; for(int i=0;i<n;i++) { p=new Book; cout<<"请输入图书编号"<<":"; cin>>p->no; cout<<"请输入图书名称:" ; cin>>p->title; cout<<"请输入图书作者:"; cin>>p->writer; cout<<"请输入图书价格:"; cin>>p->price; p->next=L->next; L->next=p; } return OK; } void PrintBookList(BookList L)//输出 { BookList p; cout<<"输出当前图书信息:\n"; p=L->next; cout<<"图书编号\t图书名称\t图书作者\t图书价格\t"; while(p) { cout<<p->no<<"\t\t"<<p->title<<"\t\t"<<p->writer<<"\t\t"<<p->price<<endl; p=p->next; } cout<<endl; } Status noBook(BookList &L,int i,string &n,string &t,string &w,string &pr)//按照图书编号查找图书 { BookList p; int j=0;//注意条件 p=L->next; while(p&&j<i) { p=p->next; j++; } if(p==NULL||j>i) return ERROR; n=p->no; w=p->writer; pr=p->price; return OK; } Status titleBook(BookList L,string t,string n,string w,string pr)//按照图书名称查找 { BookList p; p=L->next; while(p&&p->title!=t) { p=p->next; } if(p) { n=p->no; t=p->title; w=p->writer; pr=p->price; return OK; } else return ERROR; } /*Status ListInsert_L(LinkList &L,int i,ElemType e)//头插插入 { LinkList p,s; int j=0; p=L; while(p&&j<i-1) { p=p->next; ++j; } if(!p||j>i-1) return ERROR; s=new LNode; s->data=e; s->next=p->next; p->next=s; return OK; } Status ListDelete_L(LinkList &L,int i)//删除 { LinkList p,q; int j=0; p=L; while((p->next)&&j<i-1)//查找第i-1个节点,以便删除第i个节点 { p=p->next; j++; } if(!(p->next)||j>i-1) return ERROR; q=p->next; p->next=q->next; delete q; return OK; } Status DestroyList_L(LinkList &L)//销毁 { LinkList p; while(L) { p=L; L=L->next; delete p; } L=NULL; return OK; } Stat
时间: 2025-07-10 07:52:04 浏览: 11
<think>好的,用户想要关于C++链表实现图书管理的示例代码和解析。首先,我需要回忆链表的基本操作,比如创建节点、插入、删除、遍历等。用户可能希望这些操作能应用在图书管理系统里,比如添加图书、删除图书、查找图书信息等。
接下来,我得考虑如何用C++的类来设计这个链表。通常,链表由节点组成,每个节点包含数据和指向下一个节点的指针。图书的信息可能包括书名、作者、ISBN等,所以节点结构体应该包含这些字段。
然后,需要设计图书管理类,封装链表的操作。比如,添加图书对应链表的插入操作,删除图书对应删除节点,显示所有图书则是遍历链表。可能还需要考虑如何查找特定图书,这里可以用ISBN作为唯一标识。
用户可能对内存管理不太熟悉,所以在代码中要注意正确释放节点,避免内存泄漏。此外,示例代码的注释要详细,方便用户理解每个函数的作用和实现细节。
还要考虑示例的实用性,比如提供一个简单的菜单界面,让用户可以通过输入命令来操作链表。这样用户可以看到程序的实际运行效果,加深理解。
在解析部分,需要分步骤解释每个模块的功能,比如节点结构、链表类的方法,以及主函数中的交互逻辑。同时,要指出可能的优化点,比如使用双向链表、添加文件存储功能等,帮助用户扩展思路。
最后,生成相关问题,确保用户能进一步学习链表的高级应用或其他数据结构。这些问题应该围绕链表操作、内存管理和系统扩展等方面,促进用户深入探索。</think>### C++链表实现图书管理系统示例代码及解析
#### 1. 节点结构定义
```cpp
struct Book {
string title;
string author;
string ISBN;
Book* next;
Book(string t, string a, string i)
: title(t), author(a), ISBN(i), next(nullptr) {}
};
```
#### 2. 图书管理类实现
```cpp
class LibrarySystem {
private:
Book* head;
int count;
public:
LibrarySystem() : head(nullptr), count(0) {}
// 添加新书(头插法)
void addBook(string title, string author, string ISBN) {
Book* newBook = new Book(title, author, ISBN);
newBook->next = head;
head = newBook;
count++;
}
// 删除指定ISBN的图书
bool removeBook(string ISBN) {
Book* curr = head;
Book* prev = nullptr;
while(curr) {
if(curr->ISBN == ISBN) {
if(prev) {
prev->next = curr->next;
} else {
head = curr->next;
}
delete curr;
count--;
return true;
}
prev = curr;
curr = curr->next;
}
return false;
}
// 显示所有图书
void displayBooks() {
Book* curr = head;
cout << "当前馆藏图书(" << count << "本):\n";
while(curr) {
cout << "《" << curr->title << "》"
<< " 作者:" << curr->author
<< " ISBN:" << curr->ISBN << endl;
curr = curr->next;
}
}
// 析构函数释放内存
~LibrarySystem() {
Book* curr = head;
while(curr) {
Book* temp = curr;
curr = curr->next;
delete temp;
}
}
};
```
#### 3. 使用示例
```cpp
int main() {
LibrarySystem lib;
lib.addBook("C++ Primer", "Lippman", "9787111553076");
lib.addBook("算法导论", "Cormen", "9787111407010");
lib.addBook("设计模式", "Gamma", "9787111635988");
lib.displayBooks();
lib.removeBook("9787111407010");
cout << "\n删除后的列表:\n";
lib.displayBooks();
return 0;
}
```
### 关键实现解析:
1. **节点设计**:使用`struct Book`封装图书信息,包含`title`(书名)、`author`(作者)、`ISBN`(国际标准书号)和`next`指针[^2]
2. **内存管理**:通过构造函数分配内存,析构函数遍历链表释放所有节点内存,避免内存泄漏
3. **操作时间复杂度**:
- 添加操作:$O(1)$(头插法)
- 删除操作:$O(n)$(需要遍历查找)
- 显示操作:$O(n)$
4. **唯一标识**:使用ISBN作为图书唯一标识符进行删除操作,符合实际图书馆管理需求
5. **扩展性设计**:
- 可添加`findBook()`方法实现按条件查询
- 可增加`modifyBook()`方法修改图书信息
- 可改用双向链表优化删除效率
###
阅读全文
相关推荐



















