• 不仅仅是图书信息管理系统


    不仅仅是图书信息管理系统

     

    基于双链表,采用面向对象编程方法制作的图书管理系统

    效果演示

     

    root用户:账号:0,密码:0

    640?wx_fmt=gif&tp=wxpic&wxfrom=5&wx_lazy=1

    普通用户:账号:1001,密码:666666

     

    640?wx_fmt=gif&tp=wxpic&wxfrom=5&wx_lazy=1

     

    图书信息

     

    640?wx_fmt=gif&tp=wxpic&wxfrom=5&wx_lazy=1

    没有完全演示,只是个大概,微信gif只能300帧以内


    框架结构

    数据层:双链表管理

    核心层:用户管理、图书管理

    用户管理:

    用户分三种:readonly、write、root(可删除数据)

    功能:Exit(退出), Add(添加), Show(显示), Change(修改), Delete(删除), Search(查找)

    图书管理:

    权限分级:暂未实现(可自行实现)

    功能:EXIT(退出), ADD(添加), SHOW(显示), CHANGE(修改), DELETE(删除), SEARCH(查找)

    ps:用这个双链表框架可以解决99.9%的各种信息管理系统(增删改查)问题,那%0.1就是给自己留的后路,毕竟没有什么问题可以100%解决

    以后再跟我提xxx管理系统我就给你扔过去这对代码,自己去实现

     

    核心部分:双链表的实现

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    双链表

    1. typedef struct deroy_node
    2. {
    3. void* data;
    4. struct deroy_node* prev;
    5. struct deroy_node* next;
    6. }deroy_node_t;
    7. typedef deroy_node_t* deroy_node_pt;
    8. typedef struct deroy_list
    9. {
    10. int limit_size;
    11. deroy_node_pt head;
    12. deroy_node_pt tail;
    13. }deroy_list_t;
    14. typedef deroy_list_t* deroy_list_pt;

    为什么链表里面的data是void*呢,谭浩强的C语言不是这样教的啊

    void类型是空类型,可以转成任意一种类型,你不知道你插入的数据的结构体是什么,或者说你要插入多种数据的结构体,确定的结构体已经不能够满足需求了,需要定义void*类型来指向你要添加进链表的结构体数据

    我们需要实现一些函数来管理链表,注意o,前方高能,小白勿看

    功能函数

    1. /*初始化链表*/
    2. deroy_list_pt deroy_list_create(void);
    3. /*插入节点*/
    4. int deroy_list_insert_before(deroy_list_t** list_head, int num, void* new_node_data);
    5. /*删除节点*/
    6. int deroy_list_delete(deroy_list_t** list_head, int num);
    7. /*修改节点*/
    8. int deroy_list_modify(deroy_list_t** list_head, int num, void* new_node_data);
    9. /*遍历节点*/
    10. void deroy_list_cuid(deroy_list_t* list_head, void (*do_function)(void*));
    11. /*查询数据 返回 数据的位置*/
    12. int deroy_list_search(deroy_list_t** list_head, void* find_data, int(*compare)(void*, void*));
    13. /*查询数据 返回 数据的指针*/
    14. void* deroy_list_find(deroy_list_t** list_head, void* find_data, int(*compare)(void*, void*))

    为什么我要先把功能函数的原型给列举出来,因为你仔细看参数,双链表功能实现多次用到回调函数

    什么是回调函数呢?

    回调函数就是一个通过函数指针调用的函数。❞

    怎么说呢,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

    回调函数能够干什么?

    你学过C++知道多肽吧,就是一个方法实现多个功能,回调函数就是C里面实现多肽的方式

    举个栗子:

    1. if (list_head == NULL || *list_head == NULL)
    2. {
    3. errno = EINVAL;
    4. exit(errno);
    5. }
    6. if ((*list_head)->limit_size == 0)
    7. {
    8. return -1; //无数据可查询
    9. }
    10. current = (*list_head)->head;
    11. /*通过传入的comper函数进行比较*/
    12. while (compare(current->data, find_data) == 0 && current->next != NULL)
    13. {
    14. current = current->next;
    15. counter++;
    16. }
    17. if (current->next == NULL && compare(current->data, find_data) == 0)
    18. return 0;
    19. return counter;
    20. }

    这里的的回调函数要求判断两个数据返回真假

     

    /*回调函数 比较db_data_pt数据段的id是否相同*/

    static int proxy_compare_id(deroy_data_pt pdata, deroy_data_pt other)

    {

        if (pdata->id == other->id)

            return1;

        return0;

    }

    通过核心层的用户管理去实现按id查找,还是其他查找方式,这里你总不能两个函数解决吧,必须要分层

     

    不能扯太远,咱说的是链表,继续..

     

    双链表的实现,我之前发过一篇循环双链表,有图解,还算详细

     

    循环双链表

     

    这个双链表还算可以,没有内存泄漏(如果有请告诉我,反正我也不会去改),各种判断安全系数高,功能完善,能处理各种增删改查功能的系统设计

     

    核心层:用户管理

    啊~当时想着用双链表实现学生信息管理系统来着,码着码着就想把图书信息管理系统也码下来,比较学生信息管理系统已经烂大街了,我上个学生信息管理系统在知乎都有2000赞了

     

    #define STU 0

    #define TEACHER 1

     

    typedefenum Menu

    {

        Exit, Add, Show, Change, Delete, Search

    }MENU;

     

    typedefenum Sex

    {

        MAN, WOMAN

    }SEX;

     

    /*权限*/

    enum RANK

    {

        READ_ONLY /*只读*/

        , WRITE /*读写*/

        , ROOT /*root可删除*/

    };

     

    /*学号、专业、姓名、年龄、性别属性。*/

     

    typedefstruct deroy_data

    {

        char type; /*类型*/

        char rank; /*级别*/

        int id; /*编号*/

        char name[10]; /*姓名*/

        char sex; /*性别*/

        int acount; /*账号*/

        char password[20]; /*密码*/

        void* data; /*其他*/

        int(*Init)(struct deroy_data* pdata);

    }deroy_data_t;

    typedefderoy_data_t* deroy_data_pt;

    没什么特殊的,甚至用户信息少的可怜,有点用处的就是权限了,然后看到deroy_data里面的void* data段了吗,没错,我就是想告诉你们,这个是扩展功能,可扩展用户的其他信息,这个我就不实现了,比较代码多了,你们看着挺烦的

    然后这个结构体里面的函数指针,就相当于C++里面的方法,可以指向一个功能函数

    然后就和之前的学生信息管理系统差不多了~

    1. /*学生信息管理系统*/
    2. int system_proxy_stu(deroy_list_pt ptlist,int user_rank)
    3. {
    4. rank = user_rank;
    5. while (1)
    6. {
    7. switch (menu_proxy_stu()) //菜单选择
    8. {
    9. case Exit: //退出程序
    10. system("cls");
    11. printf("退出程序\n");
    12. Quit();
    13. return 1;
    14. break;
    15. case Show: //显示所有学生信息
    16. system("cls");
    17. if (rank == READ_ONLY)
    18. {
    19. printf(" 类型\t学号\t姓名\t性别\t权限\n\n");
    20. deroy_list_cuid(ptlist, proxy_find_stu);
    21. }
    22. else if(rank == ROOT)
    23. {
    24. printf(" 类型\t学号\t姓名\t性别\t权限\t账号:\t密码\n\n");
    25. deroy_list_cuid(ptlist, proxy_find_all);
    26. }
    27. Quit();
    28. break;
    29. case Add: //添加学生信息
    30. init_proxy_stu(ptlist);
    31. Quit();
    32. break;
    33. case Change: //修改学生信息
    34. proxy_stu_modify(ptlist);
    35. Quit();
    36. break;
    37. case Delete: //删除学生信息
    38. proxy_stu_delete(ptlist);
    39. Quit();
    40. break;
    41. case Search: //查询学生信息
    42. proxy_stu_find(ptlist);
    43. Quit();
    44. break;
    45. }
    46. system("cls");
    47. }
    48. }

    把所有功能函数都实现了,并且功能函数都有权限设置,普通用户只能查看普通用户的信息

  • 相关阅读:
    广播的流程
    neo4j load csv 配置和使用
    Pandas中的方法及使用示例
    Java 类加载机制与双亲委派
    系统架构设计专业技能 ·操作系统
    asp.net core EF Sqlserver
    如何给element el-date-picker日期组件设置时间按照时间禁用
    Node.js
    【linux】Linux 查看内存使用情况的几种方法汇总
    『德不孤』Pytest框架 — 6、Mark分组执行测试用例
  • 原文地址:https://blog.csdn.net/qq_31716541/article/details/133177298