单链表实现图书信息管理
时间: 2024-05-16 22:13:59 浏览: 169
可以使用单链表来实现图书信息管理,具体实现步骤如下:
1. 定义图书信息结构体,包括图书编号、书名、作者、出版社等信息。
2. 定义单链表节点结构体,包括一个指向图书信息结构体的指针和一个指向下一个节点的指针。
3. 定义单链表结构体,包括一个指向链表头节点的指针和链表长度。
4. 实现图书信息的插入、删除、查找和修改等基本操作函数,具体实现可参考以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//图书信息结构体
typedef struct Book {
int id; //图书编号
char name[50]; //书名
char author[20]; //作者
char publisher[20]; //出版社
} Book;
//单链表节点结构体
typedef struct Node {
Book *book; //指向图书信息结构体的指针
struct Node *next; //指向下一个节点的指针
} Node;
//单链表结构体
typedef struct List {
Node *head; //指向链表头节点的指针
int length; //链表长度
} List;
//初始化单链表
List *initList() {
List *list = (List*)malloc(sizeof(List)); //分配内存空间
Node *head = (Node*)malloc(sizeof(Node)); //分配头节点内存空间
head->book = NULL; //头节点不存储图书信息
head->next = NULL; //链表为空
list->head = head; //链表头指针指向头节点
list->length = 0; //链表长度为0
return list;
}
//创建图书信息结构体
Book *createBook(int id, char *name, char *author, char *publisher) {
Book *book = (Book*)malloc(sizeof(Book)); //分配内存空间
book->id = id;
strcpy(book->name, name);
strcpy(book->author, author);
strcpy(book->publisher, publisher);
return book;
}
//插入图书信息
void insertBook(List *list, Book *book) {
Node *p = list->head; //从头节点开始遍历
while (p->next != NULL) { //找到链表尾部
p = p->next;
}
Node *node = (Node*)malloc(sizeof(Node)); //创建新节点
node->book = book; //新节点存储图书信息
node->next = NULL; //新节点指向空
p->next = node; //链表尾部指向新节点
list->length++; //链表长度加1
}
//根据图书编号删除图书信息
void deleteBook(List *list, int id) {
Node *p = list->head->next; //从第一个节点开始遍历
Node *pre = list->head; //记录前一个节点
while (p != NULL) {
if (p->book->id == id) { //找到匹配节点
pre->next = p->next; //前一个节点指向下一个节点
free(p); //释放匹配节点内存空间
list->length--; //链表长度减1
return; //退出函数
}
pre = p; //记录前一个节点
p = p->next; //遍历下一个节点
}
printf("图书编号为%d的图书不存在!\n", id);
}
//根据图书编号查找图书信息
void searchBook(List *list, int id) {
Node *p = list->head->next; //从第一个节点开始遍历
while (p != NULL) {
if (p->book->id == id) { //找到匹配节点
printf("图书编号:%d,书名:%s,作者:%s,出版社:%s\n", p->book->id, p->book->name, p->book->author, p->book->publisher);
return; //退出函数
}
p = p->next; //遍历下一个节点
}
printf("图书编号为%d的图书不存在!\n", id);
}
//根据图书编号修改图书信息
void modifyBook(List *list, int id, char *name, char *author, char *publisher) {
Node *p = list->head->next; //从第一个节点开始遍历
while (p != NULL) {
if (p->book->id == id) { //找到匹配节点
strcpy(p->book->name, name); //修改图书信息
strcpy(p->book->author, author);
strcpy(p->book->publisher, publisher);
printf("图书信息修改成功!\n");
return; //退出函数
}
p = p->next; //遍历下一个节点
}
printf("图书编号为%d的图书不存在!\n", id);
}
//输出所有图书信息
void printAllBooks(List *list) {
Node *p = list->head->next; //从第一个节点开始遍历
while (p != NULL) {
printf("图书编号:%d,书名:%s,作者:%s,出版社:%s\n", p->book->id, p->book->name, p->book->author, p->book->publisher);
p = p->next; //遍历下一个节点
}
}
int main() {
List *list = initList(); //初始化单链表
insertBook(list, createBook(1001, "C语言程序设计", "谭浩强", "清华大学出版社")); //插入图书信息
insertBook(list, createBook(1002, "Java程序设计", "李刚", "机械工业出版社"));
insertBook(list, createBook(1003, "Python编程从入门到实践", "Eric Matthes", "人民邮电出版社"));
insertBook(list, createBook(1004, "MySQL技术内幕", "姜承尧", "机械工业出版社"));
printf("所有图书信息如下:\n");
printAllBooks(list); //输出所有图书信息
deleteBook(list, 1003); //删除图书信息
printf("所有图书信息如下:\n");
printAllBooks(list);
searchBook(list, 1002); //查找图书信息
modifyBook(list, 1001, "C++程序设计", "李文新", "机械工业出版社"); //修改图书信息
printf("所有图书信息如下:\n");
printAllBooks(list);
return 0;
}
```
以上代码实现了图书信息的插入、删除、查找和修改等基本操作函数,可以根据实际需要进行修改。
阅读全文