请提供C语言代码实现:如何用C语言完成一个名为book.txt的图书表的初始化(结构体定义和文件操作),以及后续操作如图书结点的输入(读取文件并构建数据结构)、取值、插入、删除功能的详细算法设计,并包括相应的输出操作(显示图书信息)。
时间: 2024-09-24 15:01:56 浏览: 47
C语言期末大作业:用顺序存储结构实现图书管理系统
5星 · 资源好评率100%
在C语言中,我们首先需要定义一个图书相关的结构体(Book),然后处理文件操作,包括初始化文件、读取文件内容、创建节点、插入节点、删除节点等。这里是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义图书结构体
typedef struct Book {
char title[100];
char author[100];
int year;
} Book;
// 文件操作函数
void init_book_list(char *filename) {
FILE *file = fopen(filename, "w+"); // 创建或打开文件
if (file == NULL) {
printf("Failed to open file.\n");
return;
}
fclose(file); // 初始化后关闭文件
}
// 插入书籍到列表
void insert_book(Book *list, char *title, char *author, int year) {
Book new_book = {title, author, year};
list = realloc(list, sizeof(Book) * (list->year + 1)); // 动态分配内存
if (list == NULL) {
perror("Memory allocation failed.");
return;
}
list[list->year] = new_book; // 添加新书到末尾
list->year++; // 更新记录数
}
// 删除书籍
void delete_book(Book **list, int year) {
if (year >= list->year) {
printf("Invalid book year.\n");
return;
}
Book *temp = list;
for (int i = 0; i < list->year - 1; i++) {
temp[i] = temp[i + 1]; // 移动元素
}
free(temp[list->year]); // 释放最后一个元素的空间
list->year--; // 更新记录数
}
// 从文件读取并显示书籍信息
void read_books_from_file(Book *list) {
FILE *file = fopen("book.txt", "r");
if (file == NULL) {
printf("Failed to open file.\n");
return;
}
while (fscanf(file, "%[^,],%[^,],%d\n", list->title, list->author, &list->year) == 3) {
printf("Title: %s, Author: %s, Year: %d\n", list->title, list->author, list->year);
}
fclose(file);
}
int main() {
Book *book_list = malloc(sizeof(Book)); // 初始数组只有一个元素
init_book_list("book.txt");
// 模拟添加书籍到文件
insert_book(book_list, "Book1", "Author1", 2000);
// 从文件读取并显示
read_books_from_file(book_list);
// 删除书籍并显示剩余书籍
delete_book(&book_list, 2000);
read_books_from_file(book_list);
free(book_list); // 释放内存
return 0;
}
```
上述代码展示了基本的图书列表操作。请注意,在实际应用中,你需要处理文件I/O错误和其他可能出现的问题。
阅读全文