用C语言写的一个顺序表

//自己写的顺序表的实现方式
/**********需求************
***************************
模拟一种场景,图书管理系统
***************************
Function:
    增add_book()
    删delete_book()
    改modify_book()
    查check_book()
***************************
        实现吧!
***************************/
#include<stdio.h>//里面包括标准的输入输出,以及perror("fail to open")这样的用法
#include<string.h>
#define COUNT_SIZE 120 //此处为符号常量,注意这里没有分号,也可以用typedef定义,只能为类型的定义;
#define OK 0
#define ERROR 1
typedef char string[20];
//定义一组数据类型
struct book{
    int number;        //图书编号
    int count;        //图书数量
    int price;        //图书价格
    string name;    //图书名称
};
struct list{
    struct book Book[COUNT_SIZE];//定义顺序表要存储的数据,也可以是简单的int类型或者char,float,double等基本数据类型
    int length;
};

typedef struct list List;//为结构体struct list 取一个别名List
//定义以下操作名称,为什么有的要加*指针操作符,因为这些操作将要修改数据的结构,所以需要传地址
void init(List *L);//初始化操作
int add_book(List *L);//增加一本书
int delete_book(List *L);//删除一本书,
int modify_book(List *L);//修改书的属性
int is_empty(List L);//判断书的数量是否为空
int is_full(List L);//判断书的数量是否达到了极限
int findbookname(List L,string name);//根据书名查找书籍的位置
int findbooknumber(List L,int num);//根据书的编号查找书籍的位置
int count_book(List L);//计算出总数
void travel(List L);//遍历整个顺序表

//以下为每个函数的实现
void init(List * L)//初始化函数,使顺序表的长度为0
{
    L->length=0;
}

int add_book(List *L)//增加一本书
{

    if(is_full(*L)){
        printf("对不起,数量已经达到了极限,不能再继续添加");
        return ERROR;
    }

    printf("输入要添加书籍的名称:");
    scanf("%s",&(L)->Book[L->length].name);

    printf("输入要添加书籍的编号:");
    scanf("%d",&(L)->Book[L->length].number);

    printf("输入要添加书籍的数量:");
    scanf("%d",&(L)->Book[L->length].count);

    printf("输入要添加书籍的价格:");
    scanf("%d",&(L)->Book[L->length].price);

    printf("\n添加结束@-@\n");
    L->length++;//长度加1
    return OK;
}

int delete_book(List *L)//删除一本书
{
    int check,num;
    string book_name;
    if(is_empty(*L)){
        printf("书籍为空,无法完成删除操作@-@\n");
        return ERROR;
    }
set1://标号,goto语句跳转到这里
    printf("你想根据1.书籍名称、还是2.编号删除?请输入如下选项:");
    scanf("%d",&check);
    switch(check)
    {
    case 1:
        printf("根据书名来删除操作");
        scanf("%s",book_name);
        strcpy(L->Book[findbookname(*L,book_name)].name,"");//调试了好久好久,其中包括了双引号和单引号以及NULL的区别,
                                                            //NULL表示空指针,空指针不能作为拷贝函数的参数
        L->Book[findbookname(*L,book_name)].count = 0;

        L->Book[findbookname(*L,book_name)].number = 0;
    
        L->Book[findbookname(*L,book_name)].price = 0;

    break;
    case 2:
        printf("根据书的编号来进行操作");
        scanf("%d",&num);
        strcpy(L->Book[findbooknumber(*L,num)].name,"");

        L->Book[findbooknumber(*L,num)].count = 0;

        L->Book[findbooknumber(*L,num)].number = 0;
    
        L->Book[findbooknumber(*L,num)].price = 0;

    break;
    default:
        printf("输入数据错误,重新输入:");
        goto set1;
    }
    L->length--;
    return OK;

}
int modify_book(List *L)//修改书的属性
{    
    string name;
    int count;
    int number;
    int price;
    printf("请输入需要修改的书名:\n");
    scanf("%s",&name);

    printf("请输入书的数量:\n");
    scanf("%d",&count);
    //printf("%d",findbookname(*L,name));测试下标是否正确
    L->Book[findbookname(*L,name)].count = count;
    printf("请输入书的编号: \n");
    scanf("%d",&number);

    L->Book[findbookname(*L,name)].number = number;
    printf("请输入书的价格: \n");
    scanf("%d",&price);

    L->Book[findbookname(*L,name)].price = price;
    printf("请输入新的名称: \n");
    scanf("%s",L->Book[findbookname(*L,name)].name);//此处花费我10分钟时间排错,我此时如果修改了name,那么
                                                    //接下来的findbookname()中参数也会变化,所以不对

    printf("修改结束! @-@");
    return OK;
}

int check_book(List L)//查看一本书是否存在
{
    string name;
    if(is_empty(L)){
        printf("书籍为空,无法查询!@-@\n");
        return ERROR;
    }
    printf("请输入书名");
    scanf("%s",&name);
//    findbookname(L,name)>0?printf("%s存在\n",name):printf("%s不存在\n",name);//等效的三元运算符
    if(findbookname(L,name)<0)//判断根据书名查找书的位置,返回书的位置
    {
        printf("%s不存在\n",name);
    }
    else
        printf("%s存在\n",name);
    return OK;
}

int is_empty(List L)//判断书的数量是否为空
{

    if(L.length<0)
    {
        return ERROR;//返回1
    }
    else
        return OK;//返回0
}

int is_full(List L)//判断书的数量是否达到了极限
{
    if(L.length == COUNT_SIZE)
        return ERROR;
    else
        return OK;
}

int findbookname(List L,string name)//根据书名查找书籍的位置
{    
    int times;//记录查找的位置
    if(is_empty(L)){
        printf("书籍为空,无法查询!@-@\n");
        return ERROR;
    }
    for(times = --L.length; times >= 0;times--)
    {
        if(strcmp(L.Book[times].name,name)==0)
        {
            return times;
        }
    }
    return ERROR;
}
int findbooknumber(List L,int num)//根据书的编号查找书籍的位置
{
    int times;//记录查找的位置
    if(is_empty(L)){
        printf("书籍为空,无法查询!@-@\n");
        return ERROR;
    }
    for(times = L.length-1; times >= 0;times--)
    {
        if(L.Book[times].number==num)
        {
            return times;
        }
    }
    return ERROR;
}

void travel(List L)//遍历整个顺序表
{
    int times = L.length;
    while(times-->0)
    {
        printf("第%d本书:\n",times+1);
        printf("数量是:%d\n",L.Book[times].count);
        printf("名称是:%s\n",L.Book[times].name);
        printf("价格是:%d\n",L.Book[times].price);
        printf("编号是:%d\n",L.Book[times].number);
    }
    return ;
}

int count_book(List L)//计算出总数
{
    printf("一共有%d本\n",L.length);
    return OK;
}

// 以下为测试函数
int main(void)
{
    List list;            //定义一个顺序表
    init(&list);
    add_book(&list);    //增加操作
    travel(list);
    modify_book(&list);    //修改操作
    travel(list);
    check_book(list);    //查询操作
    delete_book(&list);    //删除操作
    travel(list);        //遍历操作
    count_book(list);    //计算总数
}

/*给我的几点教训就是:
    1、必须要知道全局变量的作用域,不能随意的定义全局变量,很容易在函数中修改,找不到错误。
    2、strcpy函数以及strcmp函数要学会调用,以及strlen函数的使用方法。
    3、关于字符串的一些操作还不是很明白,“”和‘’以及NULL的区别
*/
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想做个自由的人

随缘吧打赏与否还是会坚持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值