用C语言的链表完成这四道题
时间: 2024-10-19 21:11:03 浏览: 28
您的请求涉及到使用链表实现图书信息表的操作。然而,您提供的实验题目明确要求基于**顺序存储结构**来完成任务。因此,这里我将提供一个基于链表的解决方案,并解释其与原题目的不同之处。
### 链表实现方案
#### 数据结构定义
首先定义图书信息的数据结构和链表节点:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNAME 50
// 图书信息结构体
typedef struct {
char isbn[20];
char name[MAXNAME];
float price;
} Book;
// 链表节点
typedef struct Node {
Book data;
struct Node* next;
} Node, *LinkList;
```
#### 创建链表并添加图书信息
接下来,编写函数用于初始化链表、插入新图书以及释放内存:
```c
void initList(LinkList* L) {
*L = (Node*)malloc(sizeof(Node));
(*L)->next = NULL;
}
int insertBook(LinkList L, const Book* book) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) return 0;
memcpy(&newNode->data, book, sizeof(Book));
newNode->next = L->next;
L->next = newNode;
return 1;
}
```
#### 输出图书信息
编写函数遍历链表并打印所有图书信息:
```c
void printBooks(LinkList L) {
Node* p = L->next;
while (p != NULL) {
printf("%s %s %.2f\n", p->data.isbn, p->data.name, p->data.price);
p = p->next;
}
}
```
#### 主函数
在主函数中处理输入数据,并调用上述函数:
```c
int main() {
LinkList L;
initList(&L);
char isbn[20], name[MAXNAME];
float price;
int count = 0;
while (scanf("%s %s %f", isbn, name, &price) && strcmp(isbn, "0") != 0) {
Book book = {isbn, name, price};
if (insertBook(L, &book)) count++;
}
printf("%d\n", count); // 输出图书数量
printBooks(L);
// 清理链表
Node* p = L;
while (p != NULL) {
Node* temp = p;
p = p->next;
free(temp);
}
return 0;
}
```
### 注意事项
- **与顺序存储的区别**:链表不需要预先指定最大容量,但每次插入操作都需要分配新的内存空间,而顺序存储则需要预先分配足够的空间以存放所有可能的数据。
- **性能差异**:对于频繁插入或删除操作,链表通常比数组更高效;但在随机访问方面,数组更为快速。
- **内存管理**:链表需要手动管理每个节点的内存分配和释放,而顺序存储只需管理整个数组的空间。
希望这个解答对您有所帮助!如果您有任何疑问,请随时提问。
阅读全文