实现图书表的以下功能:1. 顺序表初始化 2. 插入 3.取值 4.查找 5.删除
时间: 2024-03-21 17:39:36 浏览: 159
好的,以下是一个简单的图书表的实现,包括了您所需的功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// 图书信息结构体
typedef struct Book {
char name[50]; // 书名
char author[30]; // 作者
char publisher[30]; // 出版社
float price; // 价格
} Book;
// 顺序表结构体
typedef struct SeqList {
Book data[MAX_SIZE]; // 数组存储数据
int length; // 当前长度
} SeqList;
// 初始化顺序表
void InitList(SeqList* L) {
L->length = 0;
}
// 插入元素
int Insert(SeqList* L, int pos, Book book) {
if (pos < 1 || pos > L->length + 1) {
printf("插入位置不合法!\n");
return 0;
}
if (L->length == MAX_SIZE) {
printf("顺序表已满,无法插入!\n");
return 0;
}
for (int i = L->length; i >= pos; i--) {
L->data[i] = L->data[i-1]; // 向后移动元素
}
L->data[pos-1] = book;
L->length++;
return 1;
}
// 根据位置取值
Book Get(SeqList L, int pos) {
if (pos < 1 || pos > L.length) {
printf("取值位置不合法!\n");
exit(0);
}
return L.data[pos-1];
}
// 根据关键字查找
int Find(SeqList L, char* name) {
for (int i = 0; i < L.length; i++) {
if (strcmp(L.data[i].name, name) == 0) {
return i+1;
}
}
return 0;
}
// 删除元素
int Delete(SeqList* L, int pos) {
if (pos < 1 || pos > L->length) {
printf("删除位置不合法!\n");
return 0;
}
for (int i = pos-1; i < L->length-1; i++) {
L->data[i] = L->data[i+1]; // 向前移动元素
}
L->length--;
return 1;
}
// 测试
int main() {
SeqList L;
InitList(&L);
Book book1 = {"C语言程序设计", "谭浩强", "清华大学出版社", 36.5};
Insert(&L, 1, book1);
printf("插入书籍:%s\n", book1.name);
Book book2 = {"数据结构与算法分析", "Mark Allen Weiss", "机械工业出版社", 98.0};
Insert(&L, 2, book2);
printf("插入书籍:%s\n", book2.name);
Book book3 = {"算法导论", "Thomas H. Cormen", "机械工业出版社", 99.0};
Insert(&L, 3, book3);
printf("插入书籍:%s\n", book3.name);
int pos = 2;
Book book = Get(L, pos);
printf("获取第%d本书:%s\n", pos, book.name);
char* name = "数据结构与算法分析";
int index = Find(L, name);
if (index == 0) {
printf("未找到书籍:%s\n", name);
} else {
printf("查找到书籍:%s,位置为:%d\n", name, index);
}
pos = 1;
Delete(&L, pos);
printf("删除第%d本书\n", pos);
return 0;
}
```
在上面的代码中,我们定义了一个`Book`结构体,表示图书信息,包括书名、作者、出版社和价格四个字段。然后定义了一个`SeqList`结构体,表示顺序表,包括一个数组和当前长度两个字段。
在`InitList`函数中,我们将当前长度设为0,表示顺序表为空。
在`Insert`函数中,我们首先判断插入位置是否合法,如果不合法则返回0。然后判断顺序表是否已满,如果已满则返回0。接着从后往前遍历,将元素向后移动一位,腾出位置给新元素,最后将新元素插入到指定位置。插入成功后,当前长度加1,并返回1表示插入成功。
在`Get`函数中,我们首先判断取值位置是否合法,如果不合法则退出程序。否则,直接返回该位置上的元素。
在`Find`函数中,我们从前往后遍历顺序表,查找指定书名的书籍,如果找到则返回该书籍在顺序表中的位置,否则返回0表示未找到。
在`Delete`函数中,我们首先判断删除位置是否合法,如果不合法则返回0。然后从指定位置开始,将元素向前移动一位,覆盖要删除的元素。最后当前长度减1,并返回1表示删除成功。
在`main`函数中,我们首先初始化顺序表,然后插入三本书籍,分别输出插入的书名。接着获取第二本书籍,输出其书名。再根据关键字查找书籍,输出查找结果。最后删除第一本书籍,输出删除成功信息。
阅读全文