69,370
社区成员
发帖
与我相关
我的任务
分享
// Library Manager.cpp : 定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int num;//书号
char title[50];//书名
char author[50];//著作者
int num1;//现存量
int num2;//库存量
char name[50];//借阅者姓名
int idnum;//学生证号
struct node *link;
}linklist;
linklist* creatnull(linklist *l)//申请单链表的空间
{
l=(linklist*)malloc(sizeof(linklist));//申请空间
l->link=NULL;//尾结点置空
return l;
}
void creat(linklist *l)//采编入库
{
int i,n;
linklist *p,*tail,*q;
tail=l;
if(l->link!=NULL)//判断:下一结点不为空
q=l->link;//q指针指向下一个结点
else q=l;//输入数据读入
while(tail->link!=NULL)
{
tail=tail->link;
};
printf("\n请输入入库图书的数量:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
p=(linklist*)malloc(sizeof(linklist));
printf("\n请输入入库图书的书号:");
scanf("%d",&p->num);
while(q->num!=p->num&&q->link!=NULL)//输入的书名重复
{
q=q->link;
}
if(q->num==p->num)
{
q->num1=q->num1+1;
q->num2=q->num2+1;
printf("\n该图书已在图书库存在,已自动增加图书数量");}
else
{
printf("\n请输入入库图书的书名:");
scanf("%s",&p->title);//传入数据至单链表数据域
printf("\n请输入入库图书的著作者:");
scanf("%s",&p->author);
printf("\n请输入入库图书的现存量:");
scanf("%d",&p->num1);
printf("\n请输入入库图书的库存量:");
scanf("%d",&p->num2);
strcpy(p->name,"NULL");
tail->link=p;
tail=p;
tail->link=NULL;//尾结点置空
};
}
}
void print(linklist *l)//输出所有图书的信息
{
linklist *p;
p=l->link;
printf("\n输出所有图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
while(p)//单链表没读完
{
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
p=p->link;
}
}
void locat(linklist *l,int i)//根据书号查找图书 i是输入的书号
{
int count=0;
linklist *p;
p=l->link;
while(p->link!=NULL)
{
if(p->num!=i)
{
p=p->link;//下移一个结点
}
else
{
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
p=p->link;
count++; //同书号的有多少个
}
};
if(p->num==i)
{
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
count++;
}
if(count==0)
printf("该图书不在此书库!");
}
void locat1(linklist *l,int j)//根据学号查询
{
int count=0;
linklist *p;
p=l->link;
while(p->link!=NULL)
{
if(p->idnum!=j)
{
p=p->link;
}
else
{
printf("\n输出学生的信息:\n学号\t借阅者姓名\t书号\t书名\t著作者");
printf("\n%d\t%s\t\t%d\t%s\t%s\n",p->idnum,p->name,p->num,p->title,p->author);
p=p->link;
count++;
}
};
if(p->idnum==j)
{
printf("\n输出学生的信息:\n学号\t借阅者姓名\t书号\t书名\t著作者");
printf("\n%d\t%s\t\t%d\t%s\t%s\n",p->idnum,p->name,p->num,p->title,p->author);
p=p->link;
count++;
}
if(count==0)
printf("该学生未借阅!");
}
void borrowbook(linklist *l)//借阅
{
linklist *p;
int i;
int count=0;
printf("\n借阅的图书书号:");
scanf("%d",&i);
p=l->link;
while(p->link!=NULL)
{
if(p->num!=i)
{
p=p->link;
}
else
{
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
p=p->link;
count++;
}
};
if(p->num==i)
{
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
count++;
}
if(count==0)
{
printf("该图书不在此书库!");
}
else
{
if(p->num1<=0)
{
printf("\n该书库存不足,读者无法借阅.");
}
else
{
p->num1=p->num1-1;
printf("\n请输入借阅者的姓名:");
scanf("%s",&p->name);
printf("\n请输入借阅者的学生证号:");
scanf("%d",&p->idnum);
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量\t借阅者姓名\t学生证号");
printf("\n%d\t%s\t%s\t%d\t%d\t%s\t\t%d\n",p->num,p->title,p->author,p->num1,p->num2,p->name,p->idnum);
}
}
}
void returnbook(linklist *l)//归还
{
linklist *p;int i,a;
int count=0;
int counta=0;
printf("\n请输入归还图书的书号:");
scanf("%d",&i);
p=l->link;
while(p->link!=NULL)
{
if(p->num!=i){p=p->link;}
else
{
p=p->link;
count++;
}
};
if(p->num==i){count++;}
if(count==0)
{
printf("该图书不在此书库!");
}
else
{
printf("\n请输入学生证号:");
scanf("%d",&a);
p=l->link;
while(p->link!=NULL)
{
if(p->idnum!=a){p=p->link;}
else
{
p=p->link;
counta++;
}
};
if(p->idnum==a){counta++;}
if(counta==0)
{
printf("该学生未借阅图书!");
}
else
{
p->num1=p->num1+1;
strcpy(p->name,"NULL");
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
}
}
}
int main()
{
linklist l,*head;//初始化单链表头结点
head=creatnull(&l);
printf(" *********************************\n");
printf(" 欢迎使用图书管理系统 \n");
printf(" *********************************\n");
printf("\n");
int flag=1,a;
while(flag)
{
printf(" *************************************\n");
printf(" 1:馆藏图书信息 \n");
printf(" 2:采编入库 \n");
printf(" 3:图书查询 \n");
printf(" 4:学号查询 \n");
printf(" 5:读者借阅 \n");
printf(" 6:读者归还 \n");
printf(" 7:退出图书管理系统 \n");
printf(" *************************************\n");
printf(" 请输入您的选项:");
scanf("%d",&a);
switch(a)
{
case 7:flag=0;
printf(" *********************************\n");
printf(" 成功退出图书管理系统 \n");
printf(" *********************************\n");
break;
case 1:flag=1;
print(head);
printf("\n\n\n");
break;
case 2:flag=1;
creat(head);
printf("\n\n\n");
break;
case 3:flag=1;
int number;//书号
printf("\n请输入要查找的图书书号:");
scanf("%d",&number);
locat(head,number);
printf("\n\n\n");
break;
case 4:flag=1;
int idnumber;//学号
printf("\n请输入要查找的学号:");
scanf("%d",&idnumber);
locat1(head,idnumber);
printf("\n\n\n");
break;
case 5:
flag=1;
borrowbook(head);
printf("\n\n\n");
break;
case 6:flag=1;
returnbook(head);
printf("\n\n\n");
break;
}
}
system("pause");
return 1;
}
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
“多一少一”问题占程序员常犯错误的10%以上!
避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断,掰手指头心算验证一下程序到底应该写为
x、x-1、x+1中的哪个?
<、<=、==、>、>=中的哪个?
//#include"stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int num;//书号
char title[50];//书名
char author[50];//著作者
int num1;//现存量
int num2;//库存量
char name[50];//借阅者姓名
int idnum;//学生证号
struct node *link;
}linklist;
linklist* creatnull(linklist *l)//申请单链表的空间
{
l = (linklist*)malloc(sizeof(linklist));//申请空间
l->link = NULL;//尾结点置空
return l;
}
void creat(linklist **l)//采编入库
{
int i,n;
linklist *p,*tail,*q;
tail = *l;
if((*l)->link!=NULL)//判断:下一结点不为空
q= (*l)->link;//q指针指向下一个结点
else q = *l;//输入数据读入
while(tail->link!=NULL)
{
tail=tail->link;
};
printf("\n请输入入库图书的数量:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
p=(linklist*)malloc(sizeof(linklist));
printf("\n请输入入库图书的书号:");
scanf("%d",&p->num);
while(q->num!=p->num&&q->link!=NULL)//输入的书名重复
{
q=q->link;
}
if(q->num==p->num)
{
q->num1=q->num1+1;
q->num2=q->num2+1;
printf("\n该图书已在图书库存在,已自动增加图书数量");}
else
{
printf("\n请输入入库图书的书名:");
scanf("%s", p->title);//传入数据至单链表数据域
printf("\n请输入入库图书的著作者:");
scanf("%s", p->author);
printf("\n请输入入库图书的现存量:");
scanf("%d",&p->num1);
printf("\n请输入入库图书的库存量:");
scanf("%d",&p->num2);
strcpy(p->name,"NULL");
tail->link=p;
tail=p;
tail->link=NULL;//尾结点置空
};
}
}
void print(linklist *l)//输出所有图书的信息
{
linklist *p;
p=l->link;
printf("\n输出所有图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
while(p)//单链表没读完
{
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
p=p->link;
}
}
void locat(linklist *l,int i)//根据书号查找图书 i是输入的书号
{
int count=0;
linklist *p;
p=l->link;
while(p->link!=NULL)
{
if(p->num!=i)
{
p=p->link;//下移一个结点
}
else
{
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
p=p->link;
count++; //同书号的有多少个
}
};
if(p->num==i)
{
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
count++;
}
if(count==0)
printf("该图书不在此书库!");
}
void locat1(linklist *l,int j)//根据学号查询
{
int count=0;
linklist *p;
p=l->link;
while(p->link!=NULL)
{
if(p->idnum!=j)
{
p=p->link;
}
else
{
printf("\n输出学生的信息:\n学号\t借阅者姓名\t书号\t书名\t著作者");
printf("\n%d\t%s\t\t%d\t%s\t%s\n",p->idnum,p->name,p->num,p->title,p->author);
p=p->link;
count++;
}
};
if(p->idnum==j)
{
printf("\n输出学生的信息:\n学号\t借阅者姓名\t书号\t书名\t著作者");
printf("\n%d\t%s\t\t%d\t%s\t%s\n",p->idnum,p->name,p->num,p->title,p->author);
p=p->link;
count++;
}
if(count==0)
printf("该学生未借阅!");
}
void borrowbook(linklist *l)//借阅
{
linklist *p;
int i;
int count=0;
printf("\n借阅的图书书号:");
scanf("%d", &i);
p = l->link;
printf("bookno = %d\n", i);
while(p != NULL)
{
if(p->num != i)
{
p=p->link;
}
else
{
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
//p = p->link;
break;
count++;
}
}
if(p != NULL && p->num == i)
{
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
count++;
}
if(count == 0)
{
printf("该图书不在此书库!");
}
else
{
if(p->num1<=0)
{
printf("\n该书库存不足,读者无法借阅.");
}
else
{
p->num1=p->num1-1;
printf("\n请输入借阅者的姓名:");
scanf("%s", p->name);
printf("\n请输入借阅者的学生证号:");
scanf("%d",&p->idnum);
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量\t借阅者姓名\t学生证号");
printf("\n%d\t%s\t%s\t%d\t%d\t%s\t\t%d\n",p->num,p->title,p->author,p->num1,p->num2,p->name,p->idnum);
}
}
}
void returnbook(linklist *l)//归还
{
linklist *p;int i,a;
int count=0;
int counta=0;
printf("\n请输入归还图书的书号:");
scanf("%d",&i);
p = l->link;
while(p != NULL)
{
if(p->num!=i){p=p->link;}
else
{
break;
}
};
if(p->num==i){
count++;
}
if(count==0)
{
printf("该图书不在此书库!");
}
else
{
printf("\n请输入学生证号:");
scanf("%d",&a);
p = l->link;
while(p)
{
if(p->idnum!=a){
p=p->link;
}
else
{
break;
}
}
if(p && p->idnum==a) {
counta++;
}
if(counta==0)
{
printf("该学生未借阅图书!");
}
else
{
p->num1=p->num1+1;
strcpy(p->name,"NULL");
printf("\n输出图书的信息:\n书号\t书名\t著作者\t现存量\t库存量");
printf("\n%d\t%s\t%s\t%d\t%d\n",p->num,p->title,p->author,p->num1,p->num2);
}
}
}
int main()
{
linklist l,*head;//初始化单链表头结点
head=creatnull(&l);
printf(" *********************************\n");
printf(" 欢迎使用图书管理系统 \n");
printf(" *********************************\n");
printf("\n");
int flag=1,a;
while(flag)
{
printf(" *************************************\n");
printf(" 1:馆藏图书信息 \n");
printf(" 2:采编入库 \n");
printf(" 3:图书查询 \n");
printf(" 4:学号查询 \n");
printf(" 5:读者借阅 \n");
printf(" 6:读者归还 \n");
printf(" 7:退出图书管理系统 \n");
printf(" *************************************\n");
printf(" 请输入您的选项:");
scanf("%d",&a);
switch(a)
{
case 7:flag=0;
printf(" *********************************\n");
printf(" 成功退出图书管理系统 \n");
printf(" *********************************\n");
break;
case 1:flag=1;
print(head);
printf("\n\n\n");
break;
case 2:flag=1;
creat(&head);
printf("\n\n\n");
break;
case 3:flag=1;
int number;//书号
printf("\n请输入要查找的图书书号:");
scanf("%d",&number);
locat(head,number);
printf("\n\n\n");
break;
case 4:flag=1;
int idnumber;//学号
printf("\n请输入要查找的学号:");
scanf("%d",&idnumber);
locat1(head,idnumber);
printf("\n\n\n");
break;
case 5:
flag=1;
borrowbook(head);
printf("\n\n\n");
break;
case 6:flag=1;
returnbook(head);
printf("\n\n\n");
break;
}
}
system("pause");
return 1;
}
除了scanf处输入有若干错误;主要是scanf以%s输入时,不需要加前面的&,因为数组名本身就是地址。
借书和还书还有问题,逻辑上还存在问题。链表遍历时,不能遍历到最后一个节点,所以改成while (p)形式判断。另外,若找到节点,不应该再执行p = p->link,而是直接跳出循环。
以上改动,详见代码!
while(tail->link!=NULL)
{
tail=tail->link;
};
printf("\n请输入入库图书的数量:");
scanf("%d",&n);
当我在提示之后输入字母,他会出错。我想在程序中加上一段代码,可以检测我输入的是否为数字,如果不是数字,就提示请正确输入数字,然后重新输入。如果是数字的话,才进行下一步。