运用动态存储完成下列问题:问题描述定义一个包含图书信息(书号、书名、价格)的顺序表,读入相应的图书数据完成图书信息表的创建。然后,将图书按照价格降序排序,逐行输出排序后每本图书的信息。输入要求输入n+1行,前n行是n本图书的信息(书号、书名、价格),每本图书信息占一行,书号、书名、价格用空格分隔,价格之后没有空格。最后,第n+1行是输入结束标志:0 0 0(空格分隔的三个0)。其中,书号和书名为字符串类型,价格为浮点数类型。输出要求总计n行,每行是一本图书的信息(书号、书名、价格),书号、书名、价格用空格分隔。其中,价格输出保留两位小数。
时间: 2023-05-22 19:04:48 浏览: 122
我能够帮助你解决这个问题。以下是完整的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 //定义顺序表的最大长度
typedef struct {
char book_num[20]; //书号
char book_name[50]; //书名
float price; //价格
} Book;
typedef struct {
Book book_list[MAX_SIZE]; //存储图书信息的数组
int length; //实际存储的图书数量
} SqList;
//动态分配顺序表空间
void InitList(SqList *L) {
L->length = 0;
}
//插入图书信息
int InsertBook(SqList *L, Book book) {
if(L->length == MAX_SIZE) {
return 0;
}
L->book_list[L->length] = book;
L->length++;
return 1;
}
//按价格降序排序
void SortBook(SqList *L) {
int i,j;
Book tmp;
for(i=0;i<L->length-1;i++) {
for(j=0;j<L->length-1-i;j++) {
if(L->book_list[j].price<L->book_list[j+1].price) {
tmp = L->book_list[j];
L->book_list[j] = L->book_list[j+1];
L->book_list[j+1] = tmp;
}
}
}
}
//输出排序后的图书信息
void PrintBook(SqList *L) {
int i;
for(i=0;i<L->length;i++) {
printf("%s %s %.2f\n",L->book_list[i].book_num,L->book_list[i].book_name,L->book_list[i].price);
}
}
int main() {
SqList L;
InitList(&L);
Book book;
char book_num[20],book_name[50];
float price;
int n = 1;
while(n) {
scanf("%s",book_num);
scanf("%s",book_name);
scanf("%f",&price);
if(strcmp(book_num,"0")==0 && strcmp(book_name,"0")==0 && price==0) {
n = 0; //输入结束标志
} else {
strcpy(book.book_num,book_num);
strcpy(book.book_name,book_name);
book.price = price;
InsertBook(&L,book);
}
}
SortBook(&L);
PrintBook(&L);
return 0;
}
阅读全文