#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*结构体类型定义*/
struct book{
int num;//图书编号
char bname[20]; //图书名
char wname[20]; //作者名
char sort[50]; //类别
char price[20]; //图书价格
char press[20]; //出版社
struct book *next; //指针
};
struct book2{
int num;//图书编号
char bname[20]; //图书名
char ruktime[50]; //入库年份
int rukunum; //入库数量
int sum; //总数
struct book2 *next; //指针
};
/*声明新的类型名来代替原有的类型名*/
typedef struct book BK;
typedef struct book2 BK2;
/* 显示菜单 */
char Menu(){
char m;
printf(" 图 书 信 息 管 理 系 统 \n\n");
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("请输入您的选择:\n");
fflush(stdin);
scanf("%c",&m);
return m;
}
/*在图书链表末端添加一个新节点*/
BK *creatbook(BK *head,BK **pNew){
struct book *p=NULL;
struct book *pr=head;
p=(BK *)malloc(sizeof(BK));/*为新添加的节点申请内存*/
if(p==NULL){
printf("内存不够!");
exit(0);
}
if(head==NULL){
head=p;/*如果原来的链表为空,则新建节点为首节点*/
}
else{
while(pr->next!=NULL){
pr=pr->next;
}
pr->next=p;
}
pr=p;
pr->next=NULL;
*pNew=p;
return head;
}
/*保存到TXT文本.图书*/
void SaveToTxt(BK *head){
BK *p=head;
FILE *file;
file=fopen("book.txt","w+");
if(file!=NULL){
while(p!=NULL){
fprintf(file,"%d\t%s\t%s\t%s\t%s\t%s\t%s\t\n",p->num,p->bname,p->wname,p->sort,p->price,p->press);
p=p->next;
}
fclose(file);
}
else{
printf("存入文件失败!");
}
};
/*从TXT文本中读取信息*/
BK *load(BK *head){
BK *p=NULL;
FILE *file;
char a;
int i=0;
file=fopen("book.txt","a+");
if(file!=NULL){
while(!feof(file)){
if(head==NULL&&i==0){
a=fgetc(file);
if(a==EOF){
fclose(file);
return NULL;
}
rewind(file);
}
head=creatbook(head,&p);
fscanf(file,"%d\t%s\t%s\t%s\t%s\t%s\t%s\n",&(p->num),p->bname,p->wname,p->sort,p->price,p->press);
}
fclose(file);
}
else{
printf("打开文件失败!");
}
return (head);
}
/* 删除图书链表的某个新节点 */
BK *pdel(BK *head,int num){
BK *p=head,*pr=head;
if(head==NULL){
printf("链表为空!无法删除!");
return(head);
}
while(p->num!=num&&p->next!=NULL){
pr=p;
p=p->next;
}
if(p->num==num){
//两种情况
if(p==head){
//就是链表的开头的时候
head=p->next;//头指针向后移动一位
}
else{
pr->next=p->next;
}
free(p);
}
else{
printf("无法找到该联系人!");
}
return(head);
}
/*向图书信息链表中添加数据*/
BK *addbook(BK *head){
char c;
int i=0;
BK *pNew=NULL;/*定义一个新的结构体指针,用于添加*/
do{
head=creatbook(head,&pNew);
printf("请输入新的图书信息!\n");
printf("请输入图书编号:\t");
scanf("%d",&pNew->num);
printf("请输入图书书名:\t");
scanf("%s",pNew->bname);
printf("请输入作者名字:\t");
scanf("%s",pNew->wname);
printf("请输入类别:\t");
scanf("%s",pNew->sort);
printf("请输入图书价格:\t");
scanf("%s",pNew->price);
printf("请输入出版社:\t");
scanf("%s",pNew->press);
printf("\n输入完毕!是否需要继续输入(Y/N)?");
fflush(stdin);/*清除缓冲区*/
scanf("%c",&c);
fflush(stdin);/*清除缓冲区*/
i++;
}while(c=='Y'||c=='y');
printf("您添加了%d条新纪录!\n",i);
SaveToTxt(head);
return head;
}
/*修改图书信息*/
void xiugai(BK *head){
BK *p=head;
int m;
printf("请输入要修改的图书编号:");
scanf("%d",&m);
while(p!=NULL){
if(m==p->num){
printf("请输入图书编号:\t");
scanf("%d",&p->num);
printf("请输入图书书名:\t");
scanf("%s",p->bname);
printf("请输入作者名字:\t");
scanf("%s",p->wname);
printf("请输入类别:\t");
scanf("%s",p->sort);
printf("请输入图书价格:\t");
scanf("%s",p->price);
printf("请输入出版社:\t");
scanf("%s",p->press);
return;
}
p=p->next;
}
SaveToTxt(head);
}
/*删除图书信息*/
BK *deletebook(BK *head){
int num,i=0;
char c;
do{
printf("请输入你要删除的图书编号:");
scanf("%d",&num);
head=pdel(head,num);
printf("\n删除完毕!是否需要继续删除(Y/N)?");
fflush(stdin);//清除缓冲区
scanf("%c",&c);
fflush(stdin);//清除缓冲区
i++;
}
while(c=='y'||c=='Y');
printf("你删除了%d条数据",i);
SaveToTxt(head);
return (head);
}
/*查询图书信息*/
void chaxun(BK *head){
BK *p=head;
int m;
printf("请输入您要查询的图书编号:\n");
scanf("%d",&m);
printf("图书编号\t图书名\t作者名\t类别\t图书价格\t出版社\n");
while(p!=NULL){
if(m==p->num){
printf("%d\t\t%s\t\t%s\t\t%s\t\t%s\t\t%s\n",p->num,p->bname,p->wname,p->sort,p->price,p->press);
return;
}
p=p->next;
}
}
/*输出图书信息*/
void printbook(BK *head){
BK *p=head;
printf("图书编号\t图书名\t作者名\t类别\t图书价格\t出版社\n");
while(p!=NULL){
printf("%d\t\t%s\t%s\t%s\t%s\t\t%s\n",p->num,p->bname,p->wname,p->sort,p->price,p->press);
p=p->next;
}
}
//------------------------------------------------华丽的分割线---------------------------------------------------------------------------
/*在入库链表末端添加一个新节点*/
BK2 *creatbook2(BK2 *head2,BK2 **pNew){
BK2 *p=NULL;
BK2 *pr=head2;
p=(BK2 *)malloc(sizeof(BK2));/*为新添加的节点申请内存*/
if(p==NULL){
printf("内存不够!");
exit(0);
}
if(head2==NULL){
head2=p;/*如果原来的链表为空,则新建节点为首节点*/
}
else{
while(pr->next!=NULL){
pr=pr->next;
}
pr->next=p;
}
pr=p;
pr->next=NULL;
*pNew=p;
return head2;
}
/*保存到TXT文本.入库*/
void SaveToTxt2(BK2 *head2){
BK2 *p=head2;
FILE *file;
file=fopen("book2.txt","w+");
if(file!=NULL){
while(p!=NULL){
fprintf(file,"%d\t%s\t%s\t%d\t\n",p->num,p->bname,p->ruktime,p->rukunum);
p=p->next;
}
fclose(file);
}
else{
printf("存入文件失败!");
}
};
/*从TXT文本中读取信息*/
BK2 *load2(BK2 *head2){
BK2 *p=NULL;
FILE *file;
char a;
int i=0;
file=fopen("book2.txt","a+");
if(file!=NULL){
while(!feof(file)){
if(head2==NULL&&i==0){
a=fgetc(file);
if(a==EOF){
fclose(file);
return NULL;
}
rewind(file);
}
head2=creatbook2(head2,&p);
fscanf(file,"%d\t%s\t%s\t%d\t\n",&(p->num),p->bname,p->ruktime,&(p->rukunum));
}
fclose(file);
}
else{
printf("打开文件失败!");
}
return (head2);
}
/* 删除入库链表的某个新节点 */
BK2 *pdel2(BK2 *head2,int num){
BK2 *p=head2,*pr=head2;
if(head2==NULL){
printf("链表为空!无法删除!");
return(head2);
}
while(p->num!=num&&p->next!=NULL){
pr=p;
p=p->next;
}
if(p->num==num){
//两种情况
if(p==head2){
//就是链表的开头的时候
head2=p->next;//头指针向后移动一位
}
else{
pr->next=p->next;
}
free(p);
}
else{
printf("无法找到该联系人!");
}
return(head2);
}
/*添加入库信息*/
BK2 *addbook2(BK2 *head2){
char c;
int i=0;
BK2 *pNew=NULL;/*定义一个新的结构体指针,用于添加*/
do{
head2=creatbook2(head2,&pNew);
printf("请输入入库信息!\n");
printf("请输入入库图书编号:");
scanf("%d",&pNew->num);
printf("请输入入库图书名称:");
scanf("%s",pNew->bname);
printf("请输入入库年份:");
scanf("%s",pNew->ruktime);
printf("请输入入库数量:");
scanf("%d",&pNew->rukunum);
printf("\n输入完毕!是否需要继续输入(Y/N)?");
pNew->sum=0;
fflush(stdin);/*清除缓冲区*/
scanf("%c",&c);
fflush(stdin);/*清除缓冲区*/
i++;
}while(c=='Y'||c=='y');
printf("您添加了%d条入库记录!\n",i);
SaveToTxt2(head2);
return head2;
}
/*修改入库信息*/
void xiugai2(BK2 *head2){
BK2 *p=head2;
int m;
printf("请输入要修改的图书编号:");
scanf("%d",&m);
while(p!=NULL){
if(m==p->num){
printf("请输入入库图书编号:\t");
scanf("%d",&p->num);
printf("请输入入库图书名称:\t");
scanf("%s",p->bname);
printf("请输入入库年份:\t");
scanf("%s",p->ruktime);
printf("请输入入库数量:\t");
scanf("%d",&p->rukunum);
return;
}
p=p->next;
}
SaveToTxt2(head2);
}
/*删除入库信息*/
BK2 *deletebook2(BK2 *head2){
int num,i=0;
char c;
do{
printf("请输入你要删除的入库信息:");
scanf("%d",&num);
head2=pdel2(head2,num);
printf("\n删除完毕!是否需要继续删除(Y/N)?");
fflush(stdin);//清除缓冲区
scanf("%c",&c);
fflush(stdin);//清除缓冲区
i++;
}
while(c=='y'||c=='Y');
printf("你删除了%d条数据",i);
SaveToTxt2(head2);
return (head2);
}
/*查询入库信息*/
void chaxun2(BK2 *head2){
BK2 *p=head2;
int m;
printf("请输入您要查询入库的图书编号:\n");
scanf("%d",&m);
printf("图书编号\t图书名\t入库年份\t入库数量\n");
while(p!=NULL){
if(m==p->num){
printf("%d\t%s\t%s\t%d\t\n",p->num,p->bname,p->ruktime,p->rukunum);
return;
}
p=p->next;
}
}
/*输出入库信息*/
void printbook2(BK2 *head2){
BK2 *p=head2;
printf("图书编号\t图书名\t\t入库年份\t入库数量\n");
while(p!=NULL){
printf("%d\t\t%s\t\t%s\t\t%d\t\n",p->num,p->bname,p->ruktime,p->rukunum);
p=p->next;
}
}
/*排序*/
void paixu(BK2 *head2)
{
BK2 *p;
BK2 *pr=NULL;
int i=0;
pr=(BK2 *)malloc(sizeof(BK2));//提问在什么情况下添加内存
do
{
i=0;
p=head2;
while(p->next!=NULL)
{
if(p->next->rukunum>p->rukunum)
{
pr->num=p->next->num;
strcpy(pr->bname,p->next->bname);
strcpy(pr->ruktime,p->next->ruktime);
pr->rukunum=p->next->rukunum;
pr->sum=p->next->sum;
p->next->num=p->num;
strcpy(p->next->bname,p->bname);
strcpy(p->next->ruktime,p->ruktime);
p->next->rukunum=p->rukunum;
p->next->sum=p->sum;
p->num=pr->num;
strcpy(p->bname,pr->bname);
strcpy(p->ruktime,pr->ruktime);
p->rukunum=pr->rukunum;
p->sum=pr->sum;
i=1;
}
p=p->next;
}
}
while(i);
SaveToTxt2(head2);
}
/*统计*/
void tongji(BK2 *head2)
{
int sum=0;
BK2 *p=head2;
while(p!=NULL)
{
sum+=p->rukunum;
p=p->next;
}
printf("%d\n",sum);
SaveToTxt2(head2);
}
/*登入界面*/
void dengru(){
char n,y=1;/*choice=序号,n=用户登入、退出系统数字,a=(y/n),*/
int j,i=123456;
char b[10],b1[10]="hcj";/*a=选择,d=验证,*/
while(y){
system("cls");
printf("\n\n\n\n\n\n\n");
printf("****************************** 欢迎光临 *******************************\n\n");
printf("********************** 图 书 信 息 管 理 系 统 ************************\n\n\n");
printf("\n\n");
printf("\t========== ========== 1.用户登录 ====== ==========\n");
printf("\t========== ========== 0.退出系统 ====== ==========\n");
printf(" 请输入您的选择:");
scanf("%c",&n);
printf("\n");
switch(n){
case '0':
printf("程序结束!");exit(0);break;
case '1':
printf(" 请输入您的用户名:");
fflush(stdin);
gets(b);
printf("\n");
printf(" 请输入您的密码:");
scanf("%d",&j);
printf("\n");
while(strcmp(b,b1)!=0&&j!=i){
printf(" 请输入您的用户名:");
fflush(stdin);
gets(b);
printf("\n");
printf(" 请输入您的密码:");
scanf("%d",&j);
printf("\n");
}
printf(" 验证通过!请请按Enter键进入!\n");
getchar();
getchar();
y=0;
break;
default:printf("输入错误,请重新输入!");
break;
}
}
}
/*入库信息菜单*/
char Menuruku(BK2 *head2){
char m;
while(1){
printf("*************************************************************************\n");
printf("*----------------1.添加入库信息-------------------*\n");
printf("*----------------2.查询入库信息-------------------*\n");
printf("*----------------3.删除入库信息-------------------*\n");
printf("*----------------4.修改入库信息-------------------*\n");
printf("*----------------5.打印入库信息-------------------*\n");
printf("*----------------6.排序-------------------*\n");
printf("*----------------7.统计-------------------*\n");
printf("*----------------8.退出---------------------------*\n");
printf("*----------------0.返回添加图书信息---------------*\n");
printf("***************************************************************************\n");
printf("请输入您的选择:\n");
fflush(stdin);
scanf("%c",&m);
switch(m){
case '0':return m;break;
case '1':head2=addbook2(head2);break;
case '2':chaxun2(head2);break;
case '3':head2=deletebook2(head2);break;
case '4':xiugai2(head2);break;
case '5':printbook2(head2);break;
case '6':paixu(head2);break;
case '7':tongji(head2);break;
case '8':printf("程序结束!");exit(0);break;
default:printf("输入错误,请重新输入!");
break;
}
}return m;
}
/*主函数*/
main(){
BK *head=NULL;
BK2 *head2=NULL;
char m;
dengru();
head=load(head);
head2=load2(head2);
while(1){
m=Menu();
switch(m){
case '1':head=addbook(head);break;
case '2':chaxun(head);break;
case '3':head=deletebook(head);break;
case '4':xiugai(head);break;
case '5':printbook(head);break;
case '6':Menuruku(head2);break;
case '7':printf("程序结束!");exit(0);break;
default:printf("输入错误,请重新输入!");
break;
}
}
}