//自己写的顺序表的实现方式
/**********需求************
***************************
模拟一种场景,图书管理系统
***************************
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的区别
*/
/**********需求************
***************************
模拟一种场景,图书管理系统
***************************
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的区别
*/