链表实现图书借阅管理系统

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
typedef struct book
{
    char name[10];
    struct book* next;
}BOOK,*pBook;

typedef struct node
{
    int num;
    pBook Book;
    struct node* next;
}NODE,*pNode;
//打印图书
void printBook(pBook head)
{
    pBook temp = head;
    int index = 0;
    while (temp)
    {
        printf("    第%d本图书名:%s\n",++index,temp->name);
        temp = temp->next;
    }
    system("pause");
}
//保存图书
void saveBook(pBook head)
{
    FILE* file = fopen("图书管理.txt", "w");
    pBook temp = head->next;
    int index = 0;
    while (temp != nullptr)
    {
        fprintf(file,"%s\n", temp->name);
        index++;
        temp = temp->next;
    }
    fprintf(file, "%2d", index);
    fclose(file);

    printf("保存完成\n");
    getchar();
    getchar();
}
//读取图书
void readBook(pBook head)
{
    while (head->next)
    {
        head = head->next;
    }
    FILE* file = fopen("图书管理.txt", "r");
    int index = 0;
    fseek(file, -2, SEEK_END);
    fscanf(file, "%2d", &index);
    fseek(file, 0, SEEK_SET);
    for (int i = 0; i < index;i++)
    {
        pBook temp = (pBook)malloc(sizeof(BOOK));
        fscanf(file,"%s\n",temp->name);
        head->next = temp;
        head = head->next;
    }
    head->next = NULL;
    printf("读取完成\n");
    getchar();
    getchar();
}
//添加图书
void addBook(pBook head)
{
    while (head->next)
    {
        head = head->next;
    }
    int index = 0;
    printf("请输入要添加的图书数\n");
    scanf("%d",&index);
    for (int i = 0; i < index; i++)
    {
        printf("请输入第%d本书的名字",i+1);
        pBook temp = (pBook)malloc(sizeof(book));
        scanf("%s", temp->name);
        head->next = temp;
        head = head->next;
    }
    head->next = NULL;
    printf("输入完成\n");
    getchar();
    getchar();

}
//查找图书 返回对应图书的上一本书的地址
pBook foundBook(pBook head)//因为用的是单向链表,所以返回上一个地址比较方便
{
    char name[10] = "";
    printf("请输入要找的图书名字\n");
    scanf("%s",name);
    printf("寻找中...请等待...\n");
    while (head->next && strcmp(head->next->name, name) != 0)
    {
        head = head->next;
    }
    if (head->next == NULL)
        printf("查无此书\n");
    else
        printf("成功查询\n");
    system("pause");
    return head;
}
//删除某本书
void deleteBook(pBook head)
{
    printf("开始查找要删除的图书\n");
    pBook book=foundBook(head);
    if ((book->next))
    {
        pBook temp = book->next;
        book->next = temp->next;
        free(temp);
        printf("删除图书成功\n");
        system("pause");
    }
    else
    {
        printf("没有找到图书,无法删除\n");
        system("pause");
        return;
    }
}



//打印会员借阅图书信息
void printNode(pNode head)
{
    pNode temp = head->next;
    while (temp != nullptr)
    {
        printf("会员编号%d\n", temp->num);
        if (temp->Book->next==NULL)
            printf("    暂无借阅\n");
        else
            printBook(temp->Book->next);
        temp = temp->next;
    }
    system("pause");
}
//添加会员
void addNode(pNode head)
{
    while (head->next)
    {
        head = head->next;
    }
    int index = 0;
    printf("请输入要添加的会员个数\n");
    scanf("%d", &index);
    for (int i = 0; i < index; i++)
    {
        printf("请输入会员编号\n");//暂时用数字代替名字
        pNode temp = (pNode)malloc(sizeof(NODE));
        scanf("%d", &temp->num);
        temp->Book = (pBook)malloc(sizeof(book));
        temp->Book->next = NULL;
        head->next = temp;
        head = head->next;
    }
    head->next = NULL;
    printf("输入完成\n");
    getchar();
    getchar();

}
//查找会员
pNode foundNode(pNode head)
{
    int num = 0;
    printf("请输入要找的会员编号\n");
    scanf("%d", &num);
    printf("寻找中...请等待...\n");
    while (head->next && num != head->next->num)
    {
        head = head->next;
    }
    if (head->next == NULL)
        printf("查无此人\n");
    else
        printf("成功查询\n");
    system("pause");
    return head;
}
//借书,先有会员才可以借书
void borrowBook(pBook book, pNode node)
{
    printf("开始查找要借阅的会员\n");
    pNode nodeTemp = foundNode(node);
    if ((nodeTemp->next)!=NULL)
    {
        nodeTemp = nodeTemp->next;//因为返回的是前一个位置
        pBook nodeBook = nodeTemp->Book;
        if (nodeTemp->Book->next)//找到这个人借的最后一本书的位置的下一个位置(尾插法)
            while (nodeBook->next)
                nodeBook = nodeBook->next;
        pBook bookIndex = foundBook(book);//借走的图书的位置
        if ((bookIndex->next) != NULL)
        {
            pBook temp = bookIndex->next;
            bookIndex->next = temp->next;
            nodeBook->next = temp;
            temp->next = NULL;
            printf("图书借阅成功\n");
        }
        else
            printf("图书借阅失败\n");
        system("pause");
    }
    else
        return;
}
//归还图书
void ReturnBook(pBook book, pNode node)
{
    printf("开始查找要归还图书的会员\n");
    pNode nodeTemp = foundNode(node);
    if ((nodeTemp->next) != NULL)
    {
        nodeTemp = nodeTemp->next;//定位会员
        pBook bookIndex = foundBook(nodeTemp->Book);//读取所要归还图书的位置
        if ((bookIndex->next) != NULL)//用头插法插入图书管理系统
        {
            pBook temp = bookIndex->next;//要归还的图书地址
            bookIndex->next = temp->next;

            temp->next = book->next;
            book->next = temp;
            printf("图书归还成功\n");
        }
        else
            printf("图书归还失败\n");
    }
    else
        return;
}
//删除会员
void deleteNode(pBook book, pNode node)
{
    printf("开始查找要删除的会员\n");
    pNode nodeTemp = foundNode(node);
    pNode temp = nodeTemp->next;
    nodeTemp->next = temp->next;

    while (book->next)
        book = book->next;
    book->next = temp->Book->next;
    free(temp);
}
//删除所有申请空间
void deleteALL(pBook book, pNode node)
{
    while (book->next)
    {
        pBook temp = book->next;
        book->next = temp->next;
        free(temp);
        printf("删除图书成功\n");
    }


    while (node->next)
    {
        while (node->next->Book)
        {
            pBook temp = node->next->Book;
            node->next->Book = temp->next;
            free(temp);
        }
        pNode temp = node->next;
        node->next = temp->next;
        free(temp);
    }
}
void memu()
{
    printf("  ==================图书管理系统====================\n");
    printf(" |图书管理:                                        |\n");
    printf(" |              1.添加图书;                        |\n");
    printf(" |              2.查找图书;                        |\n");
    printf(" |              3.删除图书;                        |\n");
    printf(" |              7.保存图书;                        |\n");
    printf(" |              8.读取书库;                        |\n");
    printf(" |              9.显示所有图书;                    |\n");
    printf(" |会员管理:                                        |\n");
    printf(" |              4.新增会员;                        |\n");
    printf(" |              5.查找会员;                        |\n");
    printf(" |              6.借书;                            |\n");
    printf(" |              66.还书;                           |\n");
    printf(" |              10.显示会员借阅情况;               |\n");
    printf(" |              33.删除会员;                       |\n");
    printf(" |              0.清空所有信息,并退出;            |\n");
    printf("  ===========(请输入相应数字执行其功能)===========\n");
}
void main()
{
    pBook book = (pBook)malloc(sizeof(BOOK));
    book->next = NULL;
    pNode node = (pNode)malloc(sizeof(NODE));
    node->Book = NULL;
    node->next = NULL;
    while (1)
    {
        int index = 0;
        system("cls");
        memu();
        scanf("%d",&index);
        switch (index)
        {
            //图书管理
        case 1:addBook(book);
            break;
        case 2:foundBook(book);
            break;
        case 3:deleteBook(book);
            break;
        case 7:saveBook(book);
            break;
        case 8:readBook(book);
            break;
        case 9:printBook(book->next);
            break;

            //会员管理
        case 4:addNode(node);
            break;
        case 5:foundNode(node);
            break;
        case 6:borrowBook(book, node);
            break;
        case 66:ReturnBook(book, node);
            break;
        case 10:printNode(node);
            break;
        case 33:deleteNode(book, node);
            break;
        
        case 0:deleteALL(book, node); free(book); free(node);exit(0);
            break;
        default:
            break;
        }
    }

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值