双向链表实现图书管理系统采用c语言
时间: 2023-07-13 17:34:19 浏览: 145
好的,我可以为您介绍一下双向链表的实现方法。首先,您需要定义一个图书的结构体,包含图书的相关信息,例如书名、作者、出版社、价格等等。接着,您需要定义一个节点结构体,包含指向前驱节点和后继节点的指针,以及指向图书结构体的指针。代码如下所示:
```c
struct book {
char name[50];
char author[20];
char publisher[20];
float price;
};
struct node {
struct book *data;
struct node *prev;
struct node *next;
};
```
接下来,您需要实现双向链表的各种操作函数,例如创建链表、插入节点、删除节点等。这里给出一个简单的示例代码:
```c
// 创建双向链表
struct node *create_list() {
struct node *head = (struct node *)malloc(sizeof(struct node));
head->data = NULL;
head->prev = NULL;
head->next = NULL;
return head;
}
// 在链表末尾插入节点
void insert_at_end(struct node *head, struct book *data) {
struct node *new_node = (struct node *)malloc(sizeof(struct node));
new_node->data = data;
new_node->prev = NULL;
new_node->next = NULL;
struct node *ptr = head;
while (ptr->next != NULL) {
ptr = ptr->next;
}
ptr->next = new_node;
new_node->prev = ptr;
}
// 在链表中删除指定节点
void delete_node(struct node *head, struct node *del_node) {
struct node *ptr = head;
while (ptr != NULL && ptr != del_node) {
ptr = ptr->next;
}
if (ptr == NULL) {
return;
}
ptr->prev->next = ptr->next;
ptr->next->prev = ptr->prev;
free(ptr);
}
```
最后,您可以在 main 函数中调用这些操作函数,实现图书管理系统的功能。例如,您可以创建一个双向链表,存储图书信息,然后可以通过遍历链表的方式查找、修改或删除某本图书的信息。完整的示例代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct book {
char name[50];
char author[20];
char publisher[20];
float price;
};
struct node {
struct book *data;
struct node *prev;
struct node *next;
};
// 创建双向链表
struct node *create_list() {
struct node *head = (struct node *)malloc(sizeof(struct node));
head->data = NULL;
head->prev = NULL;
head->next = NULL;
return head;
}
// 在链表末尾插入节点
void insert_at_end(struct node *head, struct book *data) {
struct node *new_node = (struct node *)malloc(sizeof(struct node));
new_node->data = data;
new_node->prev = NULL;
new_node->next = NULL;
struct node *ptr = head;
while (ptr->next != NULL) {
ptr = ptr->next;
}
ptr->next = new_node;
new_node->prev = ptr;
}
// 在链表中删除指定节点
void delete_node(struct node *head, struct node *del_node) {
struct node *ptr = head;
while (ptr != NULL && ptr != del_node) {
ptr = ptr->next;
}
if (ptr == NULL) {
return;
}
ptr->prev->next = ptr->next;
ptr->next->prev = ptr->prev;
free(ptr);
}
// 遍历链表,输出所有图书信息
void print_list(struct node *head) {
struct node *ptr = head->next;
while (ptr != NULL) {
printf("书名:%s,作者:%s,出版社:%s,价格:%f\n", ptr->data->name, ptr->data->author, ptr->data->publisher, ptr->data->price);
ptr = ptr->next;
}
}
int main() {
struct node *head = create_list();
// 添加图书信息
struct book book1 = {"C语言程序设计", "谭浩强", "清华大学出版社", 38.5};
struct book book2 = {"数据结构与算法分析", "Mark Allen Weiss", "机械工业出版社", 98.0};
struct book book3 = {"计算机组成原理", "唐朔飞", "清华大学出版社", 45.0};
insert_at_end(head, &book1);
insert_at_end(head, &book2);
insert_at_end(head, &book3);
// 输出所有图书信息
printf("所有图书信息:\n");
print_list(head);
// 修改图书信息
struct node *ptr = head->next;
while (ptr != NULL && strcmp(ptr->data->name, "C语言程序设计") != 0) {
ptr = ptr->next;
}
if (ptr != NULL) {
strcpy(ptr->data->publisher, "人民邮电出版社");
printf("修改后的图书信息:\n");
print_list(head);
}
// 删除图书信息
ptr = head->next;
while (ptr != NULL && strcmp(ptr->data->name, "数据结构与算法分析") != 0) {
ptr = ptr->next;
}
if (ptr != NULL) {
delete_node(head, ptr);
printf("删除后的图书信息:\n");
print_list(head);
}
return 0;
}
```
阅读全文