基于链式存储结构的图书信息表的排序 代码
时间: 2023-05-29 20:03:18 浏览: 224
实验1 基于线性表的图书信息管理.pdf
这里给出一种使用链式存储结构的图书信息表排序的代码实现,以ISBN号为关键字进行排序。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义图书信息结构体
typedef struct book {
char isbn[14]; // ISBN号
char title[101]; // 书名
char author[31]; // 作者
float price; // 价格
struct book *next; // 指向下一本书的指针
} Book;
// 将图书信息插入链表中
void insert(Book **head, Book *book) {
Book *p = *head;
Book *prev = NULL;
while (p != NULL && strcmp(p->isbn, book->isbn) < 0) {
prev = p;
p = p->next;
}
if (prev == NULL) {
*head = book;
} else {
prev->next = book;
}
book->next = p;
}
// 从文件中读取图书信息
void read_books(char *filename, Book **head) {
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("Can't open file %s\n", filename);
exit(1);
}
char line[150];
while (fgets(line, sizeof(line), fp) != NULL) {
Book *book = (Book *)malloc(sizeof(Book));
sscanf(line, "%s %s %s %f", book->isbn, book->title, book->author, &book->price);
book->next = NULL;
insert(head, book);
}
fclose(fp);
}
// 打印图书信息
void print_books(Book *head) {
printf("ISBN\tTitle\tAuthor\tPrice\n");
while (head != NULL) {
printf("%s\t%s\t%s\t%.2f\n", head->isbn, head->title, head->author, head->price);
head = head->next;
}
}
// 释放链表内存
void free_books(Book **head) {
Book *p = *head;
while (p != NULL) {
Book *temp = p;
p = p->next;
free(temp);
}
*head = NULL;
}
// 使用插入排序对图书信息表进行排序
void sort_books(Book **head) {
if (*head == NULL || (*head)->next == NULL) {
return; // 链表为空或只有一个节点,无需排序
}
Book *sorted = *head;
Book *unsorted = sorted->next;
sorted->next = NULL;
while (unsorted != NULL) {
Book *p = unsorted;
unsorted = unsorted->next;
p->next = NULL;
insert(&sorted, p);
}
*head = sorted;
}
int main() {
Book *head = NULL;
read_books("books.txt", &head);
printf("Before sorting:\n");
print_books(head);
sort_books(&head);
printf("\nAfter sorting:\n");
print_books(head);
free_books(&head);
return 0;
}
```
这个代码实现了一个链式存储结构的图书信息表,并使用插入排序对其进行排序。具体来说,读取图书信息时每读入一本书就将其插入链表中,插入时使用ISBN号作为关键字进行排序。排序时采用插入排序,每次从未排序的链表中取出一个节点,在已排序的链表中找到其应该插入的位置,然后插入到已排序链表中。最终输出排序后的图书信息表,并释放链表内存。
阅读全文