顺序存储线性表:创建图书馆

概述

很多数据结构的教程一开始就是介绍大量的概念,数据类型等,并且抽象层次很高,不易理解和学习,我个人认为同学们完全具有举一反三的能力,也就是说,会写图书管理,也就会写酒店管理,也就会写学生管理等,本文的代码使用顺序存储实现(数组)。

描述一本书

一本书有很多信息,我们从中抽取最主要的三个信息:图书编号,书名,价格,别的信息大家可以自行添加。很显然这三个信息的数据类型都不一样,所以我们选择创建一个结构体类型来描述一本书。注意此时我们并没有创建一个实体的书,而是仅仅刻画了一本书的模板,当之后使用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
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值