图书管理系统

#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;
}

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值