实现图书信息管理,具体要求如下: 定义图书结构体类型ElemType,至少包括三个属性(书号,书名,价格);定义图书顺序表SqList(ElemType指针,表长,容量)。 功能:1、初始化创建一个空表(提示:需要分配存储空间,第二种顺序表类型定义);2、插入一条新的图书信息成为表中第i个元素;3、删除表中第i条图书信息;4、按书名进行查找,并返回且输出;5、查找表中的第i条图书信息;6、输出顺序表中的所有图书信息(注意排版清楚美观);7、修改指定图书信息的价格;8、自己分析,扩展有意义的功能。 主函数中定义顺序表变量L,通过调用各功能函数顺序完成以下操作:1.初始化创建空表L,2.连续插入3条数据到表头,3. 输出顺序表,4. 插入一条数据使其成为表中第3条数据,5. 输出顺序表,6. 根据指定的书名进行删除; 7. 输出顺序表; 8. 按书名进行查找,并输出查找到的图书完整信息; 9. 按书名查找后进行对应记录价格的修改; 10 .输出修改后全部图书信息。
时间: 2023-04-03 11:02:40 浏览: 153
基本操作的实现-数据结构体
ElemType结构体类型定义如下:
```
typedef struct {
char bookNo[20]; // 书号
char bookName[50]; // 书名
float price; // 价格
} ElemType;
```
图书顺序表SqList定义如下:
```
typedef struct {
ElemType *elem; // 指向动态分配数组的指针
int length; // 当前长度
int capacity; // 当前分配的存储容量
} SqList;
```
1. 初始化创建一个空表
```
void InitList(SqList *L, int capacity) {
L->elem = (ElemType *)malloc(capacity * sizeof(ElemType));
if (!L->elem) {
printf("初始化失败,内存分配失败\n");
exit(1);
}
L->length = 0;
L->capacity = capacity;
}
```
2. 插入一条新的图书信息成为表中第i个元素
```
bool ListInsert(SqList *L, int i, ElemType e) {
if (i < 1 || i > L->length + 1) {
printf("插入位置不合法\n");
return false;
}
if (L->length >= L->capacity) {
printf("存储空间已满,无法插入\n");
return false;
}
ElemType *p = &(L->elem[i-1]);
for (ElemType *q = &(L->elem[L->length-1]); q >= p; q--) {
*(q+1) = *q;
}
*p = e;
L->length++;
return true;
}
```
3. 删除表中第i条图书信息
```
bool ListDelete(SqList *L, int i) {
if (i < 1 || i > L->length) {
printf("删除位置不合法\n");
return false;
}
ElemType *p = &(L->elem[i-1]);
for (ElemType *q = p+1; q <= &(L->elem[L->length-1]); q++) {
*(q-1) = *q;
}
L->length--;
return true;
}
```
4. 按书名进行查找,并返回且输出
```
void FindBookByName(SqList *L, char *name) {
int i;
for (i = 0; i < L->length; i++) {
if (strcmp(L->elem[i].bookName, name) == 0) {
printf("找到了第%d本书:\n", i+1);
printf("书号:%s\n", L->elem[i].bookNo);
printf("书名:%s\n", L->elem[i].bookName);
printf("价格:%.2f\n", L->elem[i].price);
return;
}
}
printf("没有找到书名为%s的图书\n", name);
}
```
5. 查找表中的第i条图书信息
```
void GetBookByIndex(SqList *L, int i) {
if (i < 1 || i > L->length) {
printf("查找位置不合法\n");
return;
}
printf("第%d本书的信息为:\n", i);
printf("书号:%s\n", L->elem[i-1].bookNo);
printf("书名:%s\n", L->elem[i-1].bookName);
printf("价格:%.2f\n", L->elem[i-1].price);
}
```
6. 输出顺序表中的所有图书信息
```
void PrintList(SqList *L) {
printf("当前图书信息如下:\n");
printf("书号\t\t书名\t\t价格\n");
for (int i = 0; i < L->length; i++) {
printf("%s\t\t%s\t\t%.2f\n", L->elem[i].bookNo, L->elem[i].bookName, L->elem[i].price);
}
}
```
7. 修改指定图书信息的价格
```
bool ModifyPrice(SqList *L, char *name, float price) {
int i;
for (i = 0; i < L->length; i++) {
if (strcmp(L->elem[i].bookName, name) == 0) {
L->elem[i].price = price;
printf("修改成功,书名为%s的图书价格已修改为%.2f\n", name, price);
return true;
}
}
printf("没有找到书名为%s的图书\n", name);
return false;
}
```
8. 自己分析,扩展有意义的功能
可以增加按价格排序的功能,可以增加按书号查找的功能等。
主函数中的操作如下:
```
int main() {
SqList L;
InitList(&L, 10);
ElemType e1 = {"001", "C语言程序设计", 29.9};
ElemType e2 = {"002", "Java程序设计", 39.9};
ElemType e3 = {"003", "Python程序设计", 49.9};
ListInsert(&L, 1, e1);
ListInsert(&L, 1, e2);
ListInsert(&L, 1, e3);
printf("插入3条数据后的顺序表:\n");
PrintList(&L);
ElemType e4 = {"004", "C++程序设计", 59.9};
ListInsert(&L, 3, e4);
printf("在第3个位置插入一条数据后的顺序表:\n");
PrintList(&L);
FindBookByName(&L, "Java程序设计");
ListDelete(&L, 2);
printf("删除书名为Java程序设计的图书后的顺序表:\n");
PrintList(&L);
GetBookByIndex(&L, 2);
ModifyPrice(&L, "C语言程序设计", 19.9);
printf("修改价格后的顺序表:\n");
PrintList(&L);
return 0;
}
```
阅读全文