void delete(book*h) //删除图书 { char ISBN[20]; //按ISBN删除,因为ISBN是唯一的 book*p = h->next; book*tail = h; printf("输入要删除书的ISBN:"); scanf("%s", &ISBN); while (p != NULL) { if (strcmp(p->date.ISBN, ISBN)!=0) { p = p->next; tail = tail->next; } else { tail->next = p->next; free(p); return; } } }
时间: 2024-04-03 10:34:11 浏览: 54
这段代码是控制台图书管理系统中的删除图书函数。它会要求用户输入要删除的图书的 ISBN 号码,然后在图书链表中查找该 ISBN 号对应的图书,并将其从链表中删除。
具体来说,这个函数会定义一个指向链表头结点后继结点的指针 `p`,一个指向链表头结点的指针 `tail`,并要求用户输入要删除的图书的 ISBN 号。然后,它会遍历图书链表,如果找到了 ISBN 号相同的图书,则将指针 `tail` 指向该结点的前一个结点,然后将该结点从链表中删除并释放内存。如果没有找到,则继续遍历直到链表末尾。最后,如果成功删除了一本图书,则函数会立即返回,否则将会继续执行完整个链表的遍历。
需要注意的是,这个函数中使用了 `strcmp` 函数来比较两个字符串是否相同,因为 ISBN 号是字符串类型。另外,由于本函数会修改链表结构,因此它需要传入一个指向链表头结点的指针 `h`。
相关问题
void delete(book*h)//删除 { char ISBN[20]; book*p = h->next; book*tail = h; printf("输入要删除书的ISBN:"); scanf("%s", &ISBN); while (p != NULL) { if (strcmp(p->date.ISBN, ISBN)!=0) { p = p->next; tail = tail->next; } else { tail->next = p->next; free(p); return; } } }
这段代码实现了一个删除函数,根据输入的ISBN号在链表中查找对应的书籍,如果找到则删除该节点并释放其内存,否则不进行任何操作。具体来说,该函数的实现过程如下:
1. 从参数中接收链表头指针h,创建一个指向链表首节点的指针p和一个指向链表首节点前一个节点的指针tail。
2. 提示用户输入要删除的书籍的ISBN号,将其存储在一个字符数组ISBN中。
3. 在while循环中,遍历链表中的每一个节点,如果当前节点的ISBN号与输入的ISBN号不相等,则将指针p和tail都向后移动一个节点,继续查找下一个节点。
4. 如果找到了ISBN号相等的节点,则将该节点的前驱节点tail的next指针指向该节点的后继节点,即跳过该节点,使其从链表中删除。
5. 最后释放该节点的内存,并退出函数。
总之,该函数用于从链表中删除一个指定ISBN号的书籍节点,其核心思想是遍历链表查找目标节点,然后删除该节点。
#include <iostream> #include <cmath>**** using namespace std; class Book { public: Book(const char *bookTitle) { pTitle = new char[strlen(bookTitle) + 1]; strcpy(pTitle, bookTitle); } void printInfo() const { cout << pTitle << endl; } ~Book() { delete pTitle;*** } private: char *pTitle; }; int main() { char bookTitle[60]; Book *pBook; cout << "Please enter book title: "; gets(bookTitle); Book book(); pBook = book; pBook.printInfo(); return 0; }
这段代码中有多处错误:
1. `#include <cmath>` 库未被使用,可以删除。
2. `using namespace std;` 没有错误。
3. 在类 `Book` 的析构函数中,应该使用 `delete[]` 释放 `new` 分配的数组内存,而不是使用 `delete`。
4. 在 `main` 函数中,应该使用 `std::cin` 和 `std::cout`,而不是 `gets` 和 `cout`。
5. 在 `main` 函数中,创建对象的方式不正确,应该使用 `new` 创建对象,并且调用对象的方法时应该使用箭头运算符 `->`。
下面是修改后的代码:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
class Book {
public:
Book(const char *bookTitle) {
pTitle = new char[strlen(bookTitle) + 1];
strcpy(pTitle, bookTitle);
}
void printInfo() const {
cout << pTitle << endl;
}
~Book() {
delete[] pTitle;
}
private:
char *pTitle;
};
int main() {
char bookTitle[60];
Book *pBook;
cout << "Please enter book title: ";
cin.getline(bookTitle, 60);
pBook = new Book(bookTitle);
pBook->printInfo();
delete pBook;
return 0;
}
```
阅读全文