编辑代码

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

typedef int Status;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef struct {
    char id[20];    // ISBN
    char name[100]; // 书名
    double price;   // 定价
} Book;

typedef struct {
    Book *elem; // 存储空间的基地址
    int length; // 当前长度
} SqList;

Status InitList_Sq(SqList *L) {
    L->elem = (Book *)malloc(MAXSIZE * sizeof(Book));
    if (!L->elem)
        return OVERFLOW;
    L->length = 0;
    return OK;
}

Status 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;
}

Status ListInsert_Sq(SqList *L, int i, Book e) {
    if ((i < 1) || (i > L->length + 1))
        return ERROR;
    if (L->length == MAXSIZE)
        return OVERFLOW;
    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;
}

Status 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) {
    for (int i = 0; i < L.length; i++) {
        printf("ID: %s, Name: %s, Price: %.2f\n", L.elem[i].id, L.elem[i].name, L.elem[i].price);
    }
}

int main() {
    SqList L;
    int i = 0, temp, a, c, choose;
    double price;
    Book e;

    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");
    choose = -1;
    while (choose != 0) {
        printf("请选择:");
        scanf("%d", &choose);
        switch (choose) {
            case 1:
                if (InitList_Sq(&L) == OK)
                    printf("成功建立顺序表\n\n");
                else
                    printf("顺序表建立失败\n\n");
                break;
            case 2:
                // 输入书籍信息(示例)
                printf("输入书籍的ISBN, 书名, 定价:\n");
                scanf("%s %s %lf", L.elem[L.length].id, L.elem[L.length].name, &L.elem[L.length].price);
                L.length++;
                if (L.length > MAXSIZE) {
                    L.length--; // 超过最大容量,回退
                    printf("书籍输入失败,顺序表已满\n\n");
                } else {
                    printf("书籍输入成功\n\n");
                }
                break;
            case 3:
                printf("输入位置:");
                scanf("%d", &i);
                if (GetElem(L, i, &e) == OK) {
                    printf("书籍信息: ID=%s, Name=%s, Price=%.2f\n\n", e.id, e.name, e.price);
                } else {
                    printf("取值失败\n\n");
                }
                break;
            case 4:
                printf("输入价格:");
                scanf("%lf", &price);
                i = LocateElem_Sq(L, price);
                if (i) {
                    printf("找到书籍,位置:%d\n\n", i);
                } else {
                    printf("未找到书籍\n\n");
                }
                break;
            case 5:
                printf("输入插入位置和书籍信息(ISBN 书名 价格):\n");
                scanf("%d %s %s %lf", &i, e.id, e.name, &e.price);
                if (ListInsert_Sq(&L, i, e) == OK) {
                    printf("插入成功\n\n");
                } else {
                    printf("插入失败\n\n");
                }
                break;
            case 6:
                printf("输入删除位置:");
                scanf("%d", &i);
                if (ListDelete_Sq(&L, i) == OK) {
                    printf("删除成功\n\n");
                } else {
                    printf("删除失败\n\n");
                }
                break;
            case 7:
                PrintList(L);
                printf("\n");
                break;
        }
    }
    free(L.elem);
    return 0;
}