概述
很多数据结构的教程一开始就是介绍大量的概念,数据类型等,并且抽象层次很高,不易理解和学习,我个人认为同学们完全具有举一反三的能力,也就是说,会写图书管理,也就会写酒店管理,也就会写学生管理等,本文的代码使用顺序存储实现(数组)。
描述一本书
一本书有很多信息,我们从中抽取最主要的三个信息:图书编号,书名,价格
,别的信息大家可以自行添加。很显然这三个信息的数据类型都不一样,所以我们选择创建一个结构体类型来描述一本书。注意此时我们并没有创建一个实体的书,而是仅仅刻画了一本书的模板,当之后使用Book
类型定义一本书时候,我们才算真正的拥有了一本书
typedef struct{
char name[10];// name of a book
float price ;//price of a book
int number ;//ibsn number , here use int to describe
}Book;
书架结构体
typedef struct {
Book* books;//include a lots of books
int store;//the store quantity of the books
}Shelf;
同样,书架结构体是描述一个书架应该拥有的属性,第一个属性是Book指针
,细心的朋友们可能会发现,也可以使用Book数组
来取代Book指针
,也就是说,我们的书架也可以这么描述
typedef struct {
Book books[100];//include a lots of books
int store;//the store quantity of the books
}Shelf;
在这里使用指针是因为等下我们会调用malloc函数进行空间的分配,当然你也可以尝试使用Book[100]
来改写结构体。Book指针表示的是一堆书,store表示的是储量
这是我们抽象出来的图书馆的两个最基本属性
创建书架
int create_shelf(Shelf* shelf){
//create a shelf
shelf->books=(Book*)malloc(100*sizeof (Book));//malloc 100 space to store
shelf->store=0;
if(!shelf->books) return 0;//malloc failure
return 0;
}
首先我们malloc
100个空间,然后设置store属性为0。也就是说我们让一个木工制作了一个空的书架,这个书架可以存储100本书。有一个判断逻辑判断有没有成功分配空间,怎么理解呢,就比如这个在木工制作书架的时候突然发生了一些意外,导致没办法做好书架,自然也就没办法交货了,也就是 if(!shelf->books) return 0;
添加书
int add(Shelf* shelf,Book* book){
int current_store = shelf->store;
shelf->books[current_store].price=book->price;
shelf->books[current_store].number=book->number;
strncpy(shelf->books[current_store].name,book->name,10);
shelf->store++;
}
本函数没有写一些异常判断逻辑,同学们可以自行添加,注意我们传递两个参数都是指针,不过本函数更像是在图书馆里系统中一条一条录入信息,而不是真实的放书,最后由于我们放置了一本书,所以书架的存货量需要加1
销毁
int destroy(Shelf* shelf){
free(shelf->books);
return 0;
}
顾名思义,砍了书架
清空
int clear(Shelf* shelf){
shelf->store=0;
}
把书架上面的书全部拿下来
插入书
//insert a book to number n
void insert(Shelf* shelf,Book* book,int number){
if(number<1||number>shelf->store) return;
shelf->store++;
int i;
for(i=shelf->store;i>number-1;i--){
//back shift
shelf->books[i].number=shelf->books[i-1].number;
shelf->books[i].price=shelf->books[i-1].price;
strncpy( shelf->books[i].name,shelf->books[i-1].name