定义一个包含图书信息(书号、书名、价格)的链表,读入相应的图书数据来完成图书信息表的创建,然后将读入的图书逆序存储,逐行输出逆序存储后每本图书的信息。
时间: 2023-12-23 15:04:07 浏览: 133
好的,我会尽力回答你的问题。
首先,我们可以定义一个结构体来存储每本书的信息,如下所示:
```c
struct Book {
int id; // 书号
char name[50]; // 书名
float price; // 价格
};
```
然后,我们可以定义一个链表节点结构体来存储每个图书的信息和指向下一个节点的指针,如下所示:
```c
struct ListNode {
struct Book book; // 图书信息
struct ListNode* next; // 指向下一个节点的指针
};
```
接下来,我们可以定义一个函数来读入每本书的信息并创建链表,如下所示:
```c
struct ListNode* createList()
{
struct ListNode* head = NULL; // 链表的头节点
struct ListNode* tail = NULL; // 链表的尾节点
int id;
char name[50];
float price;
// 读入每本书的信息
while (scanf("%d %s %f", &id, name, &price) == 3) {
// 创建新的节点
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->book.id = id;
strcpy(node->book.name, name);
node->book.price = price;
node->next = NULL;
// 将新节点插入链表尾部
if (tail == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
```
接着,我们可以定义一个函数来将链表逆序存储,如下所示:
```c
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* prev = NULL;
struct ListNode* curr = head;
while (curr != NULL) {
struct ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
```
最后,我们可以定义一个函数来逐行输出逆序存储后每本图书的信息,如下所示:
```c
void printList(struct ListNode* head)
{
struct ListNode* curr = head;
while (curr != NULL) {
printf("%d %s %.2f\n", curr->book.id, curr->book.name, curr->book.price);
curr = curr->next;
}
}
```
完整的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Book {
int id; // 书号
char name[50]; // 书名
float price; // 价格
};
struct ListNode {
struct Book book; // 图书信息
struct ListNode* next; // 指向下一个节点的指针
};
struct ListNode* createList()
{
struct ListNode* head = NULL; // 链表的头节点
struct ListNode* tail = NULL; // 链表的尾节点
int id;
char name[50];
float price;
// 读入每本书的信息
while (scanf("%d %s %f", &id, name, &price) == 3) {
// 创建新的节点
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->book.id = id;
strcpy(node->book.name, name);
node->book.price = price;
node->next = NULL;
// 将新节点插入链表尾部
if (tail == NULL) {
head = node;
tail = node;
} else {
tail->next = node;
tail = node;
}
}
return head;
}
struct ListNode* reverseList(struct ListNode* head)
{
struct ListNode* prev = NULL;
struct ListNode* curr = head;
while (curr != NULL) {
struct ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
void printList(struct ListNode* head)
{
struct ListNode* curr = head;
while (curr != NULL) {
printf("%d %s %.2f\n", curr->book.id, curr->book.name, curr->book.price);
curr = curr->next;
}
}
int main()
{
struct ListNode* head = createList();
head = reverseList(head);
printList(head);
return 0;
}
```
希望这个回答能够帮助到你!如果你还有其他问题,可以继续问我。
阅读全文