#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define HEAD1 p->data.Register,p->data.Book_title,p->data.Writer,p->data.Class_num,p->data.Publisher,p->data.Publish_data,&p->data.Price
#define HEAD2 p->data.Register,p->data.Book_title,p->data.Writer,p->data.Class_num,p->data.Publisher,p->data.Publish_data,p->data.Price
#define TITLE1 "| 登录号 | 书目 | 作者 | 分类号 | 出版单位 | 出版时间 | 价格 |\n"
#define TITLE2 "|%10s|%8s|%8s|%8s|%10s|%10s|%8d|\n"
#define TITLE3 "----------------------------------------------------------------------\n"
#define MAX 10
struct book
{
char Register[MAX]; /*登录号*/
char Book_title[MAX]; /*书目*/
char Writer[MAX]; /*作者*/
char Class_num[MAX]; /*分类号*/
char Publisher[MAX]; /*出版单位*/
char Publish_data[MAX]; /*出版时间*/
int Price; /*价格*/
};
typedef struct node
{
struct book data;
struct node *next;
}
Node,*Link;
/*数据输出*/
void Output(Link head)
{
Node *p;
p=head->next;
if(p==NULL)
{
printf("\n文件为空\n");
getchar();
return ;
}
printf(TITLE3);
printf(TITLE1);
while(p!=NULL)
{
printf(TITLE3);
printf(TITLE2,HEAD2);
p=p->next;
}
printf(TITLE3);
}
/*数据输入*/
void Input(Link head) /*链表头做参数传入*/
{
int flag=1; /*判断是否继续输入的变量*/
Node *p;
Node *ptr;
FILE *fp;
Output(head);
fp=fopen("D:\\data.txt","a");
if(fp==NULL)
{
printf("file open error!");
exit(0);
}
p=head;
ptr=p;
while(p->next!=NULL)
{
p=p->next; /*将指针移至于链表最末尾*/
ptr=p;
}
while(flag)
{
p=(Node*)malloc(sizeof(Node ));
printf("输入图书信息:登录号,书名,作者,分类号,出版时间,出版商,价格:");
scanf("%s %s %s %s %s %s %d",HEAD1);
printf("\n是否继续输入(1.YES,0.NO)");
scanf("%d",&flag);
fprintf(fp," %s ",p->data.Register); /*写入文件*/
fprintf(fp,"%s ",p->data.Book_title);
fprintf(fp,"%s ",p->data.Writer);
fprintf(fp,"%s ",p->data.Class_num);
fprintf(fp,"%s ",p->data.Publish_data);
fprintf(fp,"%s ",p->data.Publisher);
fprintf(fp,"%d",p->data.Price);
ptr->next=p; /*将p写入链表*/
p->next=NULL;
ptr=ptr->next;
}
fclose(fp); /*关闭文件*/
}
/*书目查询函数*/
void Search(Link head) /*链表头做参数传入*/
{
Node *p;
int choice;
int flag=0; /*判断是否存在想要查询的信息*/
char writer[10]; /*存储作者的 变量*/
char book_title[10]; /*存储书名的 变量*/
p=head->next;
printf("1:按照作者查询;2:按照书目查询");
printf("Please choose the way you want(1 or 2):");
scanf("%d",&choice);
if(choice==1) /*以作者搜索*/
{
printf("请输入作者名:");
scanf("%s",writer);
while(p!=NULL)
{
if(strcmp(writer,p->data.Writer)==0) /*找到节点*/
{
printf(TITLE3);
printf(TITLE1);
printf(TITLE3);
printf(TITLE2,HEAD2); /*输出节点内容*/
printf(TITLE3);
flag=1;
}
p=p->next;
}
if(flag==0) /*没有图书信息*/
printf("\n没有该图书信息\n");
}
else
if(choice==2) /*以书目查询*/
{
printf("请输入书目:");
scanf("%s",book_title);
while(p!=NULL)
{
if(strcmp(book_title,p->data.Book_title)==0) /*找到节点*/
{
printf(TITLE3);
printf(TITLE1);
printf(TITLE3);
printf(TITLE2,HEAD2); /*输出节点内容*/
printf(TITLE3);
flag=1;
}
p=p->next;
}
if(flag==0) /*没有信息*/
printf("\n没有该图书信息\n");
}
else
printf("\n--->你的选择有错误!\n"); /*选择不为1或2,输出错误提示*/
}
/*数据信息更改*/
void Update(Link head) /*链表头做参数传入*/
{
Node *p,*ptr;
FILE *fp;
int n=1; /*判断是否继续更改*/
int flag=0; /*判断登录号是否存在的参数*/
char Register[10]; /*储存修改的登录号*/
fp=fopen("D:\\data.txt","w"); /*文件打开*/
if(fp==NULL)
{
printf("File open error!");
getchar();
exit(0);
}
while(n!=0)
{
p=head->next;
if(p==NULL)
{
printf("\n文件为空\n");
getchar();
return ;
}
printf("输入你想修改的图书登录号:");
scanf("%s",Register);
while(p!=NULL)
{
if(strcmp(Register,p->data.Register)==0) /*找到节点*/
{
printf(TITLE3);
printf(TITLE1);
printf(TITLE3);
printf(TITLE2,HEAD2); /*原有信息输出*/
printf(TITLE3);
printf("输入更新的图书信息:登录号,书名,作者,分类号,出版时间,出版商,价格:"); /*更新内容*/
scanf("%s %s %s %s %s %s %d",HEAD1);
flag=1;
printf("是否继续更改(1.yes 0.no):");
scanf("%d",&n);
break;
}
p=p->next;
}
if(flag==0) /*没有信息,提示*/
{
printf("没有改登录号信息\n");
printf("是否继续更改(1.yes 0.no):");
scanf("%d",&n);
}
}
ptr=head->next;
while(ptr!=NULL) /*重新将链表内容写入文件*/
{
fprintf(fp," %s ",ptr->data.Register);
fprintf(fp,"%s ",ptr->data.Book_title);
fprintf(fp,"%s ",ptr->data.Writer);
fprintf(fp,"%s ",ptr->data.Class_num);
fprintf(fp,"%s ",ptr->data.Publish_data);
fprintf(fp,"%s ",ptr->data.Publisher);
fprintf(fp,"%d",ptr->data.Price);
ptr=ptr->next;
}
fclose(fp); /*关闭文件*/
}
/*数据删除*/
void Delete(Link head)
{
FILE *fp;
Node *p,*ptr;
char Register[10];
int flag=0;
fp=fopen("D:\\data.txt","w"); /*文件打开*/
if(fp==NULL)
{
printf("File open error!");
getchar();
exit(0);
}
ptr=head;
p=head->next;
printf("输入你想删除的书籍的登录号:"); /*登录号记录*/
scanf("%s",Register);
while(p!=NULL)
{
if(strcmp(Register,p->data.Register)==0) /*找到删除信息的节点*/
{
ptr->next=p->next; /*实现删除功能*/
p->next=NULL;
free(p); /*释放p的内存*/
flag=1; /*标志找到了此节点*/
break;
}
else
{
ptr=p;
p=p->next;
}
}
if(flag=0) /*没有此信息,输出提示信息*/
printf("\n没有你想删除的图书信息.\n");
ptr=head->next;
while(ptr!=NULL) /*链表内容重新写入文件*/
{
fprintf(fp," %s ",ptr->data.Register);
fprintf(fp,"%s ",ptr->data.Book_title);
fprintf(fp,"%s ",ptr->data.Writer);
fprintf(fp,"%s ",ptr->data.Class_num);
fprintf(fp,"%s ",ptr->data.Publish_data);
fprintf(fp,"%s ",ptr->data.Publisher);
fprintf(fp,"%d",ptr->data.Price);
ptr=ptr->next;
}
}
/*选择错误提醒函数*/
void wrong()
{
printf("\nYOU CHOSE WRONG NUMBER!!!\n");
}
/*菜单函数*/
void menu()
{
system("cls");
printf("\n >===========welcome============< \n\n");
printf(" -------------------------------- \n");
printf(" | 1.信息录入 | 2.信息浏览 |\n");
printf(" -------------------------------- \n");
printf(" | 3.书目查询 | 4.信息更改 |\n");
printf(" -------------------------------- \n");
printf(" | 5.信息删除 | 0.退出 |\n");
printf(" -------------------------------- \n");
}
/*main 函数*/
int main(void)
{
Link head;
int choice=1;
Node *p;
Node *tail;
FILE *fp;
fp=fopen("D:\\data.txt","a+");
if(fp==NULL) /*打开文件*/
{
printf("FILE open error!\n");
exit(0);
}
head=(Node*)malloc(sizeof(Node)); /*链表头建立*/
if(!head)
{
printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/
return 0; /*返回主界面*/
}
head->next=NULL;
tail=head;
while(fgetc(fp)!=EOF)
{
fseek(fp,-1,1);
p=(Node*)malloc(sizeof(Node));
if(!p)
{
printf("\n allocate memory failure!\n");
return 0;
}
fscanf(fp," %s",p->data.Register);
fscanf(fp,"%s",p->data.Book_title);
fscanf(fp,"%s",p->data.Writer);
fscanf(fp,"%s",p->data.Class_num);
fscanf(fp,"%s",p->data.Publish_data);
fscanf(fp,"%s",p->data.Publisher);
fscanf(fp,"%d",&p->data.Price);
p->next=NULL;
tail->next=p;
tail=p;
}
fclose(fp); /*关闭文件*/
while(1)
{
menu();
printf("请输入你的操作序号(0--4):"); /*选择操作*/
scanf("%d",&choice);
if(choice==0) /*如果选择0,退出*/
{
printf("=====>thank you for useness!");
getchar();
break;
}
switch(choice)
{
case 1:Input(head);break;
case 2:Output(head);getch();break;
case 3:Search(head);getch();break;
case 4:Update(head);getch();break;
case 5:Delete(head);getch();break;
default:wrong();break;
}
}
getchar();
return 0;
}
图书管理系统
最新推荐文章于 2024-03-05 15:19:36 发布