c语言基于链式存储结构的图书信息表的修改
时间: 2024-10-23 07:05:20 浏览: 56
在C语言中,基于链式存储结构的图书信息表的修改通常涉及到链表操作,如添加、删除和修改节点。以下是一个简单的例子:
假设我们有一个图书信息链表节点结构如下:
```c
typedef struct Book {
char title[50];
char author[50];
int year;
struct Book* next; // 指向下一个节点的指针
} BookNode;
```
1. **添加新书**:
- 创建一个新的BookNode实例,填充标题、作者和年份等信息。
- 将新节点的`next`指向当前最后一个节点,如果链表为空,则`next`应初始化为`NULL`。
```c
void addBook(BookNode** head, char* title, char* author, int year) {
BookNode* newNode = (BookNode*)malloc(sizeof(BookNode));
newNode->title = malloc(strlen(title) + 1); // 分配内存并复制字符串
strcpy(newNode->title, title);
newNode->author = malloc(strlen(author) + 1);
strcpy(newNode->author, author);
newNode->year = year;
newNode->next = NULL; // 如果链表为空
if (*head == NULL) {
*head = newNode;
} else {
BookNode* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
}
```
2. **修改书籍信息**:
- 遍历链表找到需要修改的节点,通过索引或特定条件定位到目标节点。
- 修改指定的字段值。
```c
void modifyBook(BookNode** head, int index, char* newTitle, char* newAuthor, int newYear) {
if (*head != NULL && index >= 0 && index < getLength(*head)) { // 确保在合法范围内
BookNode* current = *head;
for (int i = 0; i < index; i++) {
current = current->next;
}
strcpy(current->title, newTitle);
strcpy(current->author, newAuthor);
current->year = newYear;
}
}
// 获取链表长度辅助函数
int getLength(BookNode* node) {
int count = 0;
while (node != NULL) {
count++;
node = node->next;
}
return count;
}
```
3. **删除书籍**:
- 找到要删除的节点并更新前一个节点的`next`指向下一个节点,如果删除的是头节点,则需要特殊处理。
```c
void deleteBook(BookNode** head, int index) {
if (*head != NULL && index >= 0 && index < getLength(*head)) {
BookNode* current = *head;
for (int i = 0; i < index; i++) {
current = current->next;
}
if (current->next != NULL) {
current->next = current->next->next;
} else {
*head = (*head)->next; // 如果删除的是头节点
}
free(current); // 释放被删除节点的内存
}
}
```
阅读全文