编辑代码

#include <stdio.h>
#include <stdlib.h>

// �� 关键修复:所有宏定义必须在类型定义之前
#define MAXSIZE 1000
#define OK 1
#define ERROR   0
#define OVERFLOW -1

// �� 枚举类型定义


// �� 结构体类型定义
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);
    }
}