// �� 关键修复:所有宏定义必须在类型定义之前
// �� 枚举类型定义
// �� 结构体类型定义
typedef struct {
char id[20];
char name[100];
double price;
} Book;
typedef struct {
Book *elem;
int length;
} SqList;
// �� 函数声明
int InitList_Sq(SqList *L);
int GetElem(SqList L, int i, Book *e);
int LocateElem_Sq(SqList L, double e);
int ListInsert_Sq(SqList *L, int i, Book e);
int ListDelete_Sq(SqList *L, int i);
void PrintList(SqList L);
// ��️ 主程序入口
int main() {
SqList L;
int choose, count, pos, delete_pos;
Book book;
double target_price;
printf("图书馆管理系统\n");
printf("1. 初始化\n");
printf("2. 录入书籍\n");
printf("3. 查询书籍\n");
printf("4. 查找价格\n");
printf("5. 插入书籍\n");
printf("6. 删除书籍\n");
printf("7. 显示所有\n");
printf("0. 退出系统\n\n");
while (1) {
printf("请选择操作:");
scanf("%d", &choose);
switch (choose) {
case 1:
if (InitList_Sq(&L) == OK) {
printf("顺序表初始化成功!\n");
} else {
printf("顺序表初始化失败!\n");
}
break;
case 2:
printf("请输入要录入的书籍数量(最多%d本):", MAXSIZE);
scanf("%d", &count);
while (count < 0 || count > MAXSIZE) {
printf("输入无效!请输入0到%d之间的整数:", MAXSIZE);
scanf("%d", &count);
}
for (int i = 1; i <= count; i++) {
printf("请输入第%d本书的信息:\n", i);
scanf("%s %s %lf", book.id, book.name, &book.price);
ListInsert_Sq(&L, i, book);
}
printf("录入完成!\n");
break;
case 3:
printf("请输入要查询的书籍位置:");
scanf("%d", &pos);
if (GetElem(L, pos, &book) == OK) {
printf("书籍信息:\nID:%s\n书名:%s\n价格:%.2lf\n",
book.id, book.name, book.price);
} else {
printf("查询位置超出范围!\n");
}
break;
case 4:
printf("请输入要查找的价格:");
scanf("%lf", &target_price);
pos = LocateElem_Sq(L, target_price);
if (pos != 0) {
printf("找到第%d本书,价格%.2lf\n", pos, target_price);
} else {
printf("未找到该价格的书籍!\n");
}
break;
case 5:
printf("请输入插入位置和书籍信息:");
scanf("%d %s %s %lf", &pos, book.id, book.name, &book.price);
if (ListInsert_Sq(&L, pos, book) == OK) {
printf("插入成功!\n");
} else {
printf("插入失败!原因:");
if (pos < 1 || pos > L.length + 1) {
printf("位置无效\n");
} else if (L.length >= MAXSIZE) {
printf("存储已满\n");
}
}
break;
case 6:
printf("请输入要删除的位置:");
scanf("%d", &delete_pos);
if (ListDelete_Sq(&L, delete_pos) == OK) {
printf("删除成功!\n");
} else {
printf("删除失败!原因:");
if (delete_pos < 1 || delete_pos > L.length) {
printf("位置无效\n");
}
}
break;
case 7:
PrintList(L);
break;
case 0:
printf("感谢使用!\n");
free(L.elem);
exit(0);
default:
printf("无效选择!请重新输入。\n");
}
}
return 0;
}
// �� 函数定义
int InitList_Sq(SqList *L) {
L->elem = (Book *)malloc(MAXSIZE * sizeof(Book));
if (!L->elem)
exit(OVERFLOW);
L->length = 0;
return OK;
}
int GetElem(SqList L, int i, Book *e) {
if (i < 1 || i > L.length)
return ERROR;
*e = L.elem[i - 1];
return OK;
}
int LocateElem_Sq(SqList L, double e) {
for (int i = 0; i < L.length; i++) {
if (L.elem[i].price == e) {
return i + 1;
}
}
return 0;
}
int ListInsert_Sq(SqList *L, int i, Book e) {
if (i < 1 || i > L->length + 1)
return ERROR;
if (L->length >= MAXSIZE)
return ERROR;
for (int j = L->length - 1; j >= i - 1; j--) {
L->elem[j + 1] = L->elem[j];
}
L->elem[i - 1] = e;
L->length++;
return OK;
}
int ListDelete_Sq(SqList *L, int i) {
if (i < 1 || i > L->length)
return ERROR;
for (int j = i; j < L->length; j++) {
L->elem[j - 1] = L->elem[j];
}
L->length--;
return OK;
}
void PrintList(SqList L) {
printf("序号\tISBN\t书名\t价格\n");
for (int i = 1; i <= L.length; i++) {
printf("%d\t%s\t%s\t%.2lf\n",
i,
L.elem[i-1].id,
L.elem[i-1].name,
L.elem[i-1].price);
}
}