8ccb2f1cf6feaa5fecd6ce527d0831f0.png

直接上代码不解释,文章末尾有惊喜!

b3c1b47576cceb8189d173315d7c3ee0.png


typedef struct book{

char*name;

int id;

int count;

int status;

structbook *next;

043b26343d4ab26baf028c182aa5a225.png

Book *head = NULL;

intnbook =0;

int main(){

welcome();

return0;

}void welcome(){

printf("*************************欢迎使用图书管理系统*************************n");

while(1){

printf("-------------------------------------n");

printf("请输入项目前编号执行相关操作:n");

printf("n[1] 管理员入口nn[2] 学生入口nn[0] 退出nn");

switch(land()){

case'1':

while(1){

if(usrmanager()){

continue;

}else{

break;

}

}

break;

case'2':

while(1){

if(usrstudent()){

continue;

}else{

break;

}

}

break;

case'0':

exit(0);

default:

error("采集项目参数失败");

}

}

}char land(){

char c, flag;

int i;

while(1){

for(i =0; (c = getchar()) !='n'; flag = c, ++i)

;

if(i ==1){

if(flag =='1'|| flag =='2'|| flag =='0'){

return flag;

}

}elseif(i ==0){

continue;

}

error("[请输入命令: 1 / 2 / 0 选择项目]");

}

return'0';

}voiderror(char*s){

fprintf(stderr, "%sn", s);

}char dostudent(){

char c, flag;

int i;

while(1){

for(i =0; (c = getchar()) !='n'; flag = c, ++i )

;

if(i ==1){

if(flag =='1'|| flag =='2'|| flag =='3'|| flag =='0'){

return flag;

}

}elseif(i ==0){

continue;

}

error("[请输入命令: 1 / 2 / 3/ 0 选择项目]");

}

}int usrstudent(){

printf("-------------------------------------n");

printf("请输入项目前编号执行相关操作:nn");

printf("[1] 借阅图书n[2] 归还图书n[3] 查看馆存图书n");

printf("[0] 返回主页n");

switch(dostudent()){

case'1':

borrowbook();

break;

case'2':

returnbook();

break;

case'3':

viewbook();

break;

case'0':

return0;

default:

error("采集项目参数失败");

break;

}

return1;

}int borrowbook(){

system(CLEAR);

char sname[MAXNAME];

printf("搜索图书:n");

scanf("%s", sname);

getchar();

Book *bp;

char*namep = NULL;

if((bp = lookup(namep = strdup(sname),0)) == NULL){

printf("图书 %s 不存在n", namep);

fflush(stdin);

return-1;

}else{

printbook(bp);

if(! bp->status){

printf("借阅图书: Y Nn");

}else{

printf("图书外借中n");

return0;

}

while(1){

charc ='0';

scanf("%c", &c);

getchar();

if(!(c =='Y'|| c =='y'|| c =='N'|| c =='n')){

fflush(stdin);

error("指令无效");

continue;

}

if(c =='Y'|| c =='y'){

--bp->count > -1? printf("成功n") : printf("失败n");

if(! bp->count){

bp->status = UNAVAILABLE;

}

returnbp->id;

}else{

return0;

}

}

}

return-1;

}int returnbook(){

system(CLEAR);

char sname[MAXNAME];

printf("归还图书:n");

scanf("%s", sname);

getchar();

Book *bp;

char*namep;

if((bp = lookup(namep = strdup(sname),0)) == NULL){

fflush(stdin);

printf("此图书并不是馆内图书n");

return-1;

}else{

printbook(bp);

printf("归还图书: Y Nn");

while(1){

charc ='0';

scanf("%c", &c);

getchar();

if(!(c =='Y'|| c =='y'|| c =='N'|| c =='n')){

fflush(stdin);

error("指令无效");

}elseif(c =='Y'|| c =='y'){

bp->count++ ? : (bp->status = AVAILABLE);

printf("成功n");

returnbp->id;

}else{

return0;

}

}

}

return-1;

}char domanager(){

char c, flag;

int i;

while(1){

for(i =0; (c = getchar()) !='n'; flag = c, ++i)

;

if(i ==1){

if(flag =='1'|| flag =='2'|| flag =='3'|| flag =='4'|| flag =='0'){

return flag;

}

}elseif(i ==0){

continue;

}

error("[请输入命令: 1 / 2 / 3/ 4 / 0 选择项目]");

}

return'0';

}int usrmanager(){

printf("-------------------------------------n");

printf("请输入项目前编号执行相关操作:nn");

printf("[1] 查看已存图书n[2] 注册新图书n[3] 修改已有图书信息n[4] 注销现存图书n");

printf("[0] 返回主页n");

switch(domanager()){

case'1':

viewbook();

break;

case'2':

addbook();

break;

case'3':

modbook();

break;

case'4':

delbook();

break;

case'0':

return0;

default:

error("采集项目参数失败");

break;

}

return1;

}int viewbook(){

system(CLEAR); ///Book *bp;

for(bp =head; bp != NULL; bp = bp->next){

printbook(bp);

}

if(nbook){

return nbook;

}else{

printf("图书馆还没有图书哦n");

return0;

}

return-1;

}voidprintbook(Book *bp){

printf("图书编号:%dn", bp->id);

printf("图书名:%sn", bp->name);

printf("图书存数:%dn", bp->count);

printf("图书状态:%sn", bp->status ?"不可借":"可借");

}int addbook(){

system(CLEAR); ///char sname[MAXNAME];

int id, count;

char*namep;

while(1){

id =0;

count =0;

namep = NULL;

printf("请输入图书名:n");

scanf("%s", sname);

getchar();

printf("请输入小于1000的图书编号:n");

scanf("%d", &id);

getchar();

if(!(id >0&& id <1000)){

error("输入编号不符合要求");

fflush(stdin);

continue;

}

printf("请输入小于50的图书数量:n");

scanf("%d", &count);

getchar();

if(!(count >0&& count <50)){

error("输入数目不符合要求");

fflush(stdin);

continue;

}

Book *bp;

if((bp = lookup(namep = strdup(sname), id)) == NULL){

bp = (Book *)malloc(sizeof (Book));

if(bp == NULL || (bp->name = namep) == NULL){

error("注册图书失败");

fflush(stdin);

continue;

}

bp->id = id;

bp->count = count;

bp->status = AVAILABLE;

++nbook;

bp->next = head;

head = bp;

printf("图书 %s 注册成功n", sname);

return id;

}else{

fflush(stdin);

error("图书名或编号已经被占用");

}

}

return-1;

}

Book *lookup(char*s,int id){

Book *bp;

for(bp = head; bp != NULL; bp = bp->next){

if(id == bp->id || strcmp(s, bp->name) ==0){

return bp;

}

}

return NULL;

}intmodbook(){// 修改除id之外的信息 因为要修改id 直接删掉后重新添加会更好system(CLEAR);///Book *bp = NULL;

while(1){

intid =0;

printf("请输入要修改信息的图书编号:n");

scanf("%d", &id);

getchar();

if(!(id >0&& id <1000)){

fflush(stdin);

error("图书编号不符合要求");

continue;

}

if((bp = lookup("", id)) != NULL){

printf("以下为要修改的图书的现有信息:n");

printbook(bp);

printf("[1] 修改图书名n[2] 修改图书数量n[3] 修改图书状态n[0] 放弃修改n");

while(1){

int i;

scanf("%d", &i);

getchar();

if(!(i ==1|| i ==2|| i ==3|| i ==0)){

fflush(stdin);

error("输入项目前编号选择相关项目");

continue;

}

switch(i){

case1:

while(1){

charnewname[MAXNAME], *namep;

printf("图书名:n");

scanf("%s", newname);

getchar();

if((lookup(namep = strdup(newname),0)) != NULL){

fflush(stdin);

error("图书名已存在");

continue;

}

if((bp->name = namep) != NULL){

printf("修改成功n");

return id;

}

}

break;

case2:

while(1){

int bnum;

printf("输入图书数量:n");

scanf("%d", &bnum);

getchar();

if(!(bnum >0|| bnum <1000)){

fflush(stdin);

error("数目不符合要求");

continue;

}

bp->count = bnum;

printf("修改成功n");

return id;

}

break;

case3:

while(1){

char c;

int status;

status = bp->status;

status == AVAILABLE ? printf("修改状态为[不可借]: Y Nn") : printf("修改状态为[可借]: Y Nn");

scanf("%c", &c);

getchar();

if(!( c =='Y'|| c =='y'|| c =='N'|| c =='n')){

fflush(stdin);

error("指令无效");

continue;

}

if(c =='Y'|| c =='y'){

status == AVAILABLE ? bp->status = UNAVAILABLE : (bp->status = AVAILABLE);

printf("修改成功n");

return id;

}else{

printf("放弃修改n");

return0;

}

}

break;

case0:

return0;

default:

error("获取参数失败");

break;

}

}

}else{

printf("没有此图书n");

return0;

}

}

return-1;

}int delbook(){

system(CLEAR); ///Book *bp, *fbp;

intid =0;

printf("请输入要注销的图书编号:n");

scanf("%d", &id);

getchar();

if(!(id >0&& id <1000)){

fflush(stdin);

error("图书编号不符合要求");

return-1;

}

for(fbp = bp = head; bp != NULL; fbp = bp, bp = bp->next){

if(bp->id == id){

printbook(bp);

break;

}

}

if(bp != NULL){

while(1){

printf("确定要注销此图书:Y Nn");

char YN;

scanf("%c", &YN);

getchar();

if(!((YN =='Y'|| YN =='y') || (YN =='N'|| YN =='n'))){

fflush(stdin);

error("指令无效n");

continue;

}

if(YN =='Y'|| YN =='y'){

bp == head ? head = bp->next : (fbp->next = bp->next);

free(bp->name); //2018-05-26修改:添加释放name这块内存//bp内存的只是指向name的指针

free(bp);

bp = NULL; printf(

"图书注销成功n");

break;

}else{

printf("放弃注销n");

return0;

}

}

return id;

}else{

printf("要注销的图书编号不存在n");

return-1;

}

return-1;

}

------------------------------------------------

“我是一名从事了10年开发的老程序员,最近我花了一些时间整理关于C语言、C++,自己有做的材料的整合,一个完整的学习C语言、C++的路线,学习材料和工具。全球最大的C/C++、编程爱好者的聚集地就在我这里<专栏里面>!欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以跟我一起学习!”

关注我和我的专栏,带你遨游代码世界!

程序猿​zhuanlan.zhihu.com
fcf7b33f13f74020ab8b245c662fea3c.png
Logo

快速构建 Web 应用程序

更多推荐