图书管理系统(链表+文件)

简单小型的图书信息管理系统
身为菜狗能写出来也是蛮不容易的

【数据结构】

1、书籍数据文件:每个书籍的信息包含:书名,作者名,类型,出版社,出版时间,销售价格,库存数量;
2、用户数据文件:包含用户名称和密码。

【系统实现功能】

1、用户管理(操作用户数据文件)。
新建用户、修改密码。创建新用户后,将用户信息存储到文件“user.dat”中。
2、新书入库(操作书籍数据文件)。输入你需要添加的书籍信息,根据书名查找相应书籍,如果不存在,执行添加操作,存储到“book.txt”文档。如果存在,系统提示在“此书已存在”。
3、删除书籍(操作书籍数据文件)。根据输入的书名查找相应书籍,如果存在,执行删除操作;如果书籍不存在,系统提示“查无此书”。
4、修改信息(操作书籍数据文件)。根据输入的书名查找相应书籍,如果存在,执行修改操作;如果书籍不存在,系统提示“查无此书”。
5、浏览信息(操作书籍数据文件)。将所含书籍信息的文档“book.txt”经行输出显示。
6、查询书籍
支持以下几种查询方式:
(1)按书名名称查询书籍基本信息(作者名,类型,出版社,出版时间,销售价格,库存数量)
(2)按作者名查询书籍基本信息(书名,类型,出版社,出版时间,销售价格,库存数量)
(3)按类型查询查询书籍基本信息(书名,作者名,出版社,出版时间,销售价格,库存数量)
(4)按出版社查询查询书籍基本信息(书名,作者名,类型,出版时间,销售价格,库存数量)
(5)按出版时间查询查询书籍基本信息(书名,作者名,类型,出版社,销售价格,库存数量)
(6)按销售价格查询查询书籍基本信息(书名,作者名,类型,出版社,出版时间,库存数量)
(7)按库存数量查询查询书籍基本信息(书名,作者名,类型,出版社,出版时间,销售价格)

进入页面图书管理系统(链表+文件)_第1张图片

#include 
#include 
#include 
#define N sizeof(struct BOOK)
#define M sizeof(struct USER)
struct BOOK
{
	char name[50];     //书名
	char author[50];    //作者名
	char type[20];      //类型
	char publish[50];  //出版单位
	int time ;        //出版时间
	double price;       //价格
	int num;         //数量
	struct BOOK *next;   //指针域
};
typedef struct BOOK book ,*linklist;
struct USER
{
    char id[50];
    char password[20];
    struct USER *next1;
};
typedef struct USER user ,*linklist1;

void add(linklist head);   //添加
void del(linklist head);   //删除
void edit(linklist head);  //修改
void print(linklist head);  //显示
void find(linklist head);   //查找
void NAME1(linklist head);  //按书名查找
void AUTHOR1(linklist head);  //按作者查找
void TYPE1(linklist head);  //按类型查找
void PUBLISH1(linklist head);  //按出版社查找
void TIME1(linklist head);  //按时间查找
void PRICE1(linklist head);  //按价格查找
void NUM1(linklist head);  //按数量查找
void output(linklist head); //将链表储存到文件中
void books();
void login(linklist1 head); //用户登录
void creat(linklist1 head); //创建用户
void change(linklist1 head); //修改密码
void output1(linklist1 head);
int main()
{
    int select ;
    FILE *fp ;
    linklist1 head ,p2 ,pre ;
    head = (linklist1)malloc(M);
    head->next1 = NULL;
    pre = (linklist1)malloc(M);
    pre = head ;
    if((fp = fopen("user.txt","r"))==NULL)
    {
        printf("打开失败,系统自动退出\n");
        exit(0);
    }
    while(1)
    {
        p2 = (linklist1)malloc(M);
        fscanf(fp,"%s %s",p2->id ,p2->password );
        if(feof(fp))
            break;
        pre->next1 = p2;     //尾插法
        pre = p2;
    }
    pre->next1=NULL;
    fclose(fp);
    while(1)
    {
        printf("===================================\n");
        printf("        图书管理系统\n");
        printf("       1: 用户登录\n");
        printf("       2: 注册新用户\n");
        printf("       3: 修改密码\n");
        printf("       0: 退出系统\n");
        printf("===================================\n");
        printf("请输入菜单项:\n\n");
        scanf("%d",&select);
        printf("\n");
        switch(select)
        {
            case 1:
                login(head);
                break;
           case 2:
                creat(head);
                output1(head);
                break;
           case 3:
               change(head);
               output1(head);
                break;
            case 0:
                exit (0);

        }
    }
    return 0;
}
void change(linklist1 head)
{
    linklist1 pre=head,p;
    int flag=0;
    char m[20];
    p=(linklist1)malloc(M);
    printf("请输入修改用户名\n");
    printf("\n");
    scanf("%s",p->id);
    printf("\n");
    while(pre->next1)
    {
        if(strcmp(pre->next1->id,p->id)==0)
        {
            flag=1;
            break;
        }
        pre=pre->next1;
    }
    if(flag==0)
    {
        printf("用户不存在\n");
    }
    else
    {
        printf("请输入密码:\n");
        printf("\n");
        scanf("%s",m);
        printf("\n");
        if(strcmp(pre->next1->password,m)==0)
        {
             printf("请输入修改密码:\n");
        printf("\n");
        scanf("%s",p->password);
        printf("\n");
        p->next1=pre->next1->next1;
        pre->next1=p;
        printf("修改成功\n");
        }
       else
        printf("密码错误\n");
    }
    printf("\n");
}
void creat(linklist1 head)
{
    linklist1 pre = head,p;
    int flag=0;
    p=(linklist1)malloc(M);
    printf("请输入用户名称:\n");
    printf("\n");
    scanf("%s",p->id);
    printf("\n");
    while(pre->next1)
    {
        pre=pre->next1;
        if(strcmp(pre->id,p->id)==0)
        {
            printf("此用户已存在\n");
            flag=1;
            break;
        }
    }
    if(flag==0)
    {
        printf("请输入6位密码\n");
        printf("\n");
        scanf("%s",p->password);
        printf("\n");
        p->next1=pre->next1;
        pre->next1=p;
        printf("注册成功\n");
    }
    printf("\n");
}
void login(linklist1 head)
{
    int flag=0 ;
    linklist1 pre=head,p ;
    p=(linklist1)malloc(M);
    printf("请输入用户名:\n");
    printf("\n");
    scanf("%s",p->id);
    printf("\n");
    while(pre->next1)
    {
        pre=pre->next1;
        if(strcmp(pre->id,p->id)==0)
        {
            flag=1;
            break;
        }
    }
    if(flag==0)
    {
        printf("用户不存在\n");
        printf("\n");
    }
    else
    {
        printf("请输入密码:\n");
        printf("\n");
        scanf("%s",p->password);
        printf("\n");
        if(strcmp(pre->password,p->password)==0)
            books();
        else
        {
            printf("密码错误\n");
            printf("\n");
        }
    }

}
void books()
{
    int select ;
    FILE *fp ;
    linklist head ,p2 ,pre ;
    head = (linklist)malloc(N);
    head->next = NULL;
    pre = (linklist)malloc(N);
    pre = head ;
    if((fp = fopen("book.txt","r"))==NULL)
    {
        printf("打开失败,系统自动退出\n");
        exit(0);
    }
    while(1)
    {
        p2 = (linklist)malloc(N);
        fscanf(fp,"%s %s %s %s %d %lf %d",p2->name ,p2->author ,p2->type ,p2->publish ,&p2->time ,&p2->price ,&p2->num );
        if(feof(fp))
            break;
        pre->next = p2;     //尾插法
        pre = p2;
    }
    pre->next=NULL;
    fclose(fp);
    while(1)
    {
        printf("===================================\n");
        printf("    欢迎来到图书管理系统\n");
        printf("       1: 新书入库\n");
        printf("       2: 删除书籍\n");
        printf("       3: 修改信息\n");
        printf("       4: 浏览信息\n");
        printf("       5: 查询书籍\n");
        printf("       0: 退出系统\n");
        printf("===================================\n");
        printf("请输入菜单项:\n\n");
        scanf("%d",&select);
        printf("\n");
        switch(select)
        {
            case 1:
                add(head);
                printf("现在的图书信息为:\n");
                print(head);
                output(head);
                break;
           case 2:
                del(head);
                printf("现在的图书信息为:\n");
                print(head);
                output(head);
                break;
           case 3:
                edit(head);
                printf("现在的图书信息为:\n");
                print(head);
                output(head);
                break;
            case 4:
                printf("现在的图书信息为:\n");
                print(head);
                break;
            case 5:
                find(head);
                break;
            case 0:
                exit (0);

        }
    }

}
void print(linklist head)
{
    printf("====================================图书总览==========================================\n");
    printf("书名                          作者名    类型      出版社              时间  价格  数量\n");
    linklist p=head->next;
    while(p)
    {
        printf("%-30s%-10s%-10s%-20s%-6d%-6.2lf %-2d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num);
        p=p->next;
    }
    printf("\n");
}

void add(linklist head)
{
    printf("请输入增添图书信息\n");
    printf("按照书名,作者,类型,出版社,时间,价格,数量依次输入\n");
    linklist pre = head,p;
    int flag=0,n;
    p=(linklist)malloc(N);
    printf("\n");
    scanf("%s %s %s %s %d %lf %d",p->name ,p->author ,p->type ,p->publish ,&p->time ,&p->price ,&p->num );
    printf("\n");
    while(pre->next)
    {
        pre=pre->next;
        if(strcmp(pre->name,p->name)==0)
        {
            printf("此书已存在\n");
            flag=1;
            break;
        }
    }
    if(flag==0)
    {
        p->next=pre->next;
        pre->next=p;
        printf("\n");
        printf("添加成功!\n");
    }
    printf("\n");
    printf("继续添加请输入1,输入其他数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    if(n==1)
        add(head);

    printf("\n");
}

void del(linklist head)
{
    linklist p = head->next ,pre = head ,q=head;
    char NAME[50] ;
    int flag=0,n;
    printf("请输入删除图书的名字:\n");
    printf("\n");
    scanf("%s",NAME);
    while(q)
    {
        if(strcmp(q->name,NAME)==0)
        {
            flag=1;
            break;
        }

        q=q->next;
    }
    if(flag==0)
    {
        printf("\n");
        printf("查无此书\n\n");

    }
    else
    {
        while(p)
        {
            if(strcmp(p->name,NAME)==0)
            {
                pre->next = p->next;
                free(p);
            }
            else
            {
                pre=p;
                p=p->next;
            }

        }
        printf("\n");
        printf("删除成功!\n");
    }
    printf("\n");
    printf("继续删除请输入1,输入其他数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    printf("\n");
    if(n==1)
        del(head);
    printf("\n");

}

void edit(linklist head)
{
    printf("请输入修改图书的书名:\n");
    printf("\n");
    linklist p ,q=head;
    char NAME[50];
    int flag=0,n;
    scanf("%s",NAME);
    printf("\n");
    p = (linklist)malloc(N);
    while(q->next)
    {
        if(strcmp(q->next->name,NAME)==0)
            {
                flag=1;
                break;
            }
        q=q->next;
    }
    if(flag==0)
    {
        printf("查无此书\n");
    }
    else
    {
        printf("输入修改信息:\n");
        printf("按照书名,作者,类型,出版社,时间,价格,数量依次输入\n");
        printf("\n");
        scanf("%s %s %s %s %d %lf %d",p->name ,p->author ,p->type ,p->publish ,&p->time ,&p->price ,&p->num );
        p->next=q->next->next;
        q->next=p;
        printf("\n");
        printf("修改成功\n");
    }
    printf("\n");
    printf("继续修改请输入1,输入其他数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    printf("\n");
    if(n==1)
        edit(head);
    printf("\n");
}

void find(linklist head)
{
    int select;
    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");
    printf("\n");
    scanf("%d",&select);
    printf("\n");
    switch(select)
    {
        case 1:
            NAME1(head);
            break;
        case 2:
            AUTHOR1(head);
            break;
        case 3:
            TYPE1(head);
            break;
        case 4:
            PUBLISH1(head);
            break;
        case 5:
            TIME1(head);
            break;
        case 6:
            PRICE1(head);
            break;
        case 7:
            NUM1(head);
            break;

    }
}

void NAME1(linklist head)  //按名字查找
{
    linklist p=head;
    char NAME[50];
    int flag=0,n;
    printf("请输入要查找的书名:\n");
    printf("\n");
    scanf("%s",NAME);
    printf("\n");
    while(p)
    {
        if(strcmp(p->name,NAME)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==0)
    {
        printf("查无此书\n");
    }
    else
    {
        printf("====================================图书总览==========================================\n");
        printf("书名                          作者名    类型      出版社              时间  价格  数量\n");
        while(p)
        {
            if(strcmp(p->name,NAME)==0)
            {
                printf("%-30s%-10s%-10s%-20s%-6d%-6.2lf %-2d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num);
            }
            p=p->next;
        }
    }
    printf("\n");
    printf("继续查询请输入1,输入其它数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    if(n==1)
    {
        find(head);
    }
    printf("\n");
}

void AUTHOR1(linklist head)  //按作者查找
{
    linklist p=head;
    char AUTHOR[50];
    int flag=0,n;
    printf("请输入要查找的作者:\n");
    printf("\n");
    scanf("%s",AUTHOR);
    printf("\n");
    while(p)
    {
        if(strcmp(p->author,AUTHOR)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==0)
    {
        printf("查无此书\n");
    }
    else
    {
        printf("====================================图书总览==========================================\n");
        printf("书名                          作者名    类型      出版社              时间  价格  数量\n");
        while(p)
        {
            if(strcmp(p->author,AUTHOR)==0)
            {
                printf("%-30s%-10s%-10s%-20s%-6d%-6.2lf %-2d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num);
            }
            p=p->next;
        }
    }
    printf("\n");
    printf("继续查询请输入1,输入其它数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    if(n==1)
    {
        find(head);
    }
    printf("\n");
}

void TYPE1(linklist head)  //按类型查找
{
    linklist p=head;
    char TYPE[20];
    int flag=0,n;
    printf("请输入要查找的类型:\n");
    printf("\n");
    scanf("%s",TYPE);
    printf("\n");
    while(p)
    {
        if(strcmp(p->type,TYPE)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==0)
    {
        printf("查无此书\n");
    }
    else
    {
        printf("====================================图书总览==========================================\n");
        printf("书名                          作者名    类型      出版社              时间  价格  数量\n");
        while(p)
        {
            if(strcmp(p->type,TYPE)==0)
            {
                printf("%-30s%-10s%-10s%-20s%-6d%-6.2lf %-2d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num);
            }
            p=p->next;
        }
    }
    printf("\n");
    printf("继续查询请输入1,输入其它数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    if(n==1)
    {
        find(head);
    }
    printf("\n");
}

void PUBLISH1(linklist head)  //按出版社查找
{
    linklist p=head;
    char PUBLISH[50];
    int flag=0,n;
    printf("请输入要查找的出版社:\n");
    printf("\n");
    scanf("%s",PUBLISH);
    printf("\n");
    while(p)
    {
        if(strcmp(p->publish,PUBLISH)==0)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==0)
    {
        printf("查无此书\n");
    }
    else
    {
        printf("====================================图书总览==========================================\n");
        printf("书名                          作者名    类型      出版社              时间  价格  数量\n");
        while(p)
        {
            if(strcmp(p->publish,PUBLISH)==0)
            {
                printf("%-30s%-10s%-10s%-20s%-6d%-6.2lf %-2d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num);
            }
            p=p->next;
        }
    }
    printf("\n");
    printf("继续查询请输入1,输入其它数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    if(n==1)
    {
        find(head);
    }
    printf("\n");
}

void TIME1(linklist head)  //按时间查找
{
    linklist p=head;
    int TIME;
    int flag=0,n;
    printf("请输入要查找的时间:\n");
    printf("\n");
    scanf("%d",&TIME);
    printf("\n");
    while(p)
    {
        if(p->time==TIME)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==0)
    {
        printf("查无此书\n");
    }
    else
    {
        printf("====================================图书总览==========================================\n");
        printf("书名                          作者名    类型      出版社              时间  价格  数量\n");
        while(p)
        {
            if(p->time==TIME)
            {
                printf("%-30s%-10s%-10s%-20s%-6d%-6.2lf %-2d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num);
            }
            p=p->next;
        }
    }
    printf("\n");
    printf("继续查询请输入1,输入其它数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    if(n==1)
    {
        find(head);
    }
    printf("\n");
}

void PRICE1(linklist head)  //按价格查找
{
    linklist p=head;
    double PRICE;
    int flag=0,n;
    printf("请输入要查找的最高价格:\n");
    printf("\n");
    scanf("%lf",&PRICE);
    printf("\n");
    while(p)
    {
        if(p==head)
            p=p->next;
        else
        {
            if(p->price<=PRICE)
            {
                flag=1;
                break;
            }
            p=p->next;
        }

    }
    if(flag==0)
    {
        printf("查无此书\n");
    }
    else
    {
        printf("====================================图书总览==========================================\n");
        printf("书名                          作者名    类型      出版社              时间  价格  数量\n");
        while(p)
        {
            if(p->price<=PRICE)
            {
                printf("%-30s%-10s%-10s%-20s%-6d%-6.2lf %-2d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num);
            }
            p=p->next;
        }
    }
    printf("\n");
    printf("继续查询请输入1,输入其它数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    if(n==1)
    {
        find(head);
    }
    printf("\n");
}

void NUM1(linklist head)  //按数量查找
{
    linklist p=head;
    int NUM;
    int flag=0,n;
    printf("请输入要查找的数量:\n");
    printf("\n");
    scanf("%d",&NUM);
    printf("\n");
    while(p)
    {
        if(p->num==NUM)
        {
            flag=1;
            break;
        }
        p=p->next;
    }
    if(flag==0)
    {
        printf("查无此书\n");
    }
    else
    {
        printf("====================================图书总览==========================================\n");
        printf("书名                          作者名    类型      出版社              时间  价格  数量\n");
        while(p)
        {
            if(p->num==NUM)
            {
                printf("%-30s%-10s%-10s%-20s%-6d%-6.2lf %-2d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num);
            }
            p=p->next;
        }
    }
    printf("\n");
    printf("继续查询请输入1,输入其它数字返回首页\n");
    printf("\n");
    scanf("%d",&n);
    if(n==1)
    {
        find(head);
    }
    printf("\n");
}

void output(linklist head) //将链表储存到文件中
{
    linklist p=head->next;
    FILE *fp;
    fp=fopen("book.txt","w");
    if(fp==NULL)
    {
        printf("文件打开失败,自动退出系统\n");
        exit(0);
    }
    while(p)
    {
        fprintf(fp,"%s %s %s %s %d %lf %d\n",p->name ,p->author ,p->type ,p->publish ,p->time ,p->price ,p->num );
        p=p->next;
    }
    fclose(fp);
}
void output1(linklist1 head)
{

你可能感兴趣的:(图书管理系统(链表+文件))