用c语言帮我写一份代码,要求如下:建立一个包含 10 个结点的链表,每个结点包括书号、书名、作者、出版社和价格。输 入一个书名,如果链表中的结点所包含的书名等于输入的书名,则将此结点删去。
时间: 2024-12-20 10:27:58 浏览: 14
以下是使用 C 语言实现的链表操作代码,用于创建一个包含10个结点的链表,并提供删除特定书名的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义链表节点结构
typedef struct BookNode {
int bookId;
char title[50];
char author[50];
char publisher[50];
float price;
struct BookNode* next;
} BookNode;
// 链表的初始化函数
BookNode* createList() {
static BookNode nodes[10] = {0};
for (int i = 0; i < 10; i++) {
printf("请输入第%d本书的信息(书号:%, 书名:%, 作者:%, 出版社:%, 价格:%f),输入'q'结束:\n",
i + 1, &nodes[i].bookId, nodes[i].title, nodes[i].author, nodes[i].publisher, &nodes[i].price);
if (strcmp(nodes[i].title, "q") == 0) break;
scanf("%d%s%s%f", &nodes[i].bookId, nodes[i].title, nodes[i].author, &nodes[i].price);
nodes[i].next = (i == 9) ? NULL : &nodes[i + 1];
}
return nodes;
}
// 删除指定书名的函数
void deleteByTitle(BookNode** head, const char* targetTitle) {
if (*head == NULL) return;
BookNode* current = *head;
BookNode* prev = NULL;
while (current != NULL && strcmp(current->title, targetTitle) != 0) {
prev = current;
current = current->next;
}
if (current == NULL) return;
// 如果找到目标结点并且不是列表的第一个结点
if (prev != NULL) {
prev->next = current->next;
} else {
*head = current->next; // 如果是第一个结点,需要更新头指针
}
free(current);
}
int main() {
BookNode* list = createList();
if (list != NULL) {
printf("请输入要删除的书名:\n");
char input[50];
fgets(input, sizeof(input), stdin);
input[strlen(input) - 1] = '\0'; // 去除换行符
deleteByTitle(&list, input);
// 输出处理后的链表信息
BookNode* current = list;
while (current != NULL) {
printf("书号:%d, 书名:%s, 作者:%s, 出版社:%s, 价格:%f\n", current->bookId, current->title, current->author, current->publisher, current->price);
current = current->next;
}
}
return 0;
}
```
这个程序首先创建一个包含10个结点的链表,然后允许用户输入书名进行删除。注意,这个例子假设输入的书名都是字符串形式,实际应用中可能需要添加更多的验证和错误处理。
相关问题:
1. 删除功能是如何工作的?
2. 如何在程序中增加新的书籍并保持链表同步更新?
3. 输入“q”作为书名会怎样影响程序?
阅读全文