当前位置: 代码网 > it编程>编程语言>C/C++ > C语言项目搭建-图书管理系统(链表详解)

C语言项目搭建-图书管理系统(链表详解)

2024年07月28日 C/C++ 我要评论
图书管理系统

系统要实现的功能概述:

(1)用户登录管理员根据用密码进行身份验证登录系统

(2)菜单介绍根据菜单介绍本系统的使用规则

(3)图书信息录入根据编号录入图书信息

(4)图书信息浏览根据编号显示图书信息

(5)图书信息查找根据编号查找图书信息

(6)图书信息修改根据编号修改图书信息

(7)图书信息保存输入图书信息文件存档 

(8)图书信息插入输入图书信息插入系统

(9)图书信息删除:根据图书编号进行删除


目录

项目介绍

用户登录系统

 系统菜单提示

 图书信息录入

 图书信息浏览

 图书信息插入

 图书信息删除

图书信息保存

图书信息查找

图书信息修改

退出管理系统

 主函数的介绍


人生漫长,晴雨交加

但若是心怀热爱,即使岁月荒芜

亦能奔山赴海,静待一树花开

对于这种代码量超百位数的,大家最好养成分模块写代码的习惯: 


代码的讲解如下:

头文件:

#include <stdio.h>//标准输入输出函数
#include <stdlib.h>//动态内存malloc函数,system函数
#include <string.h>	//strcmp比较字符串函数
#include <assert.h>//断言判断malloc的空间有没有开辟成功,没有成功就产生断点

宏定义: 

#define n 10

结构体:

typedef struct
{
    char num[n];	     //编号
    char namebook[n];	 //名字
    int price;	         //价格
}book;
typedef struct lnode
{
    book date;              //数据域,结构体的嵌套
    struct lnode* next;     //指针域
}lnode, * node;             //指向节点的指针

用户登录系统

void menu2()
{
    int input = 0, count = 0, i = 0;
    char mima[20] = "123";//登入的密码
    char shuru[20] = { 0 };
    system("color f4");
    printf("\t\t\t     **************************************\n");
    printf("\t\t\t     |       *欢迎使用图书管理系统*       |\n");
    printf("\t\t\t     |           *管理员: 小唐*           |\n");
    printf("\t\t\t      ------------------------------------\n");
    printf("请输入管理员密码:\n");
    while ((count = _getch()) != '\r')
    {
        if (count == '\b')
        {
            i--;
            printf("\b \b");
        }
        else
        {
            shuru[i++] = count;
            printf("*");
        }
    }
    shuru[i++] = '\0';
    if (strcmp(mima, shuru) == 0)
    {
        printf("\n密码正确,您已进入系统!\n");
    }
    else
    {
        printf("\n密码错误,请重新输入!\n");
        exit(0);     //输入错误,直接退出
    }
    system("pause");
    system("cls");
}

 系统菜单提示

这是我们的介绍帮助副菜单: 

void assist()
{
    printf("\t\t-------------------------------*系统菜单介绍*--------------------------------------------\n");
    printf("图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书借阅问题,工作将非常繁琐\n");
    printf("而这些项目在过去靠手工操作,需要手工记录这些事情,不但麻烦,还经常出错\n");
    printf("给广大用户带来很多不便,因此,开发这样一套图书馆管理系统软件\n");
    printf("让管理员方便的管理图书及用户信息,方便用户查找图书\n");
}

这是我们的选择功能主菜单: 

void menu()
{
    printf("\n");
    system("color f4");
    printf("\t\t\t*****************************************************\n");
    printf("\t\t\t*---------------------------------------------------*\n");
    printf("\t\t\t*                   图书管理系统                    *\n");
    printf("\t\t\t*****************************************************\n");
    printf("\t\t\t********************系统功能菜单*********************\n");
    printf("\t\t\t----------------------     --------------------------\n");
    printf("\t\t\t*****************************************************\n");
    printf("\t\t\t**    1、使用帮助菜单   *     2、浏览图书信息      **\n");
    printf("\t\t\t*****************************************************\n");
    printf("\t\t\t**    3、插入图书信息   *     4、删除图书信息      **\n");
    printf("\t\t\t*****************************************************\n");
    printf("\t\t\t**    5、图书信息保存   *     6、退出管理系统      **\n");
    printf("\t\t\t*****************************************************\n");
    printf("\t\t\t**    7、修改图书信息   *     8、查找图书系统     **\n");
    printf("\t\t\t*****************************************************\n");
    printf("\t\t\t*****************************************************\n");
    printf("\t\t\t----------------------     --------------------------\n");
}


 图书信息录入

node inputbook()                    //输入图书信息(尾插法)
{
    printf("--------------------------*图书录入系统*----------------------------------\n");
    node l,p,s;                         //设置三个结构体指针变量
    l = (node)malloc(sizeof(lnode));    //用malloc开辟头节点l结构体的动态内存
    assert(l);                          //断言判断动态空间是否开辟成功
    s = l;                              //将头节点赋值给s
    int input;                          //定义一个变量input来判断录入图书的数量
    printf("请输入图书数量:");
    scanf("%d", &input);
    while (input--)
    {
        p = (node)malloc(sizeof(lnode));      //为p开辟空间也就是创建下一个节点
        assert(p);                            //断言判断空间是否开辟成功
        printf("请输入图书信息>:\n");        //输入基本信息
        printf("*-----------------------*\n");
        printf("请输入图书编号:\n");
        scanf("%s", p->date.num);
        printf("*-----------------------*\n");
        printf("请输入图书名字:\n");
        scanf("%s", p->date.namebook);
        printf("*-----------------------*\n");
        printf("请输入图书价格:\n");
        scanf("%d", &p->date.price);          //因为不是数组所以用&
        printf("------------------------*您的图书数据已录入系统*-----------------------------------\n");
        system("pause");                      //按任意键
        system("cls");                        //清除屏幕
        p->next = null;                       //如果不在录入图书信息就指向null
        s->next = p;                          //s指向下一个节点,并将p赋值给s
        s = p;
    }
    return l;                                 //返回给链表头节点l
}

 图书信息浏览

void printbook(node l)   
{
    node n;	
    n = l->next;
    printf("------------------------*图书信息显示*------------------------\n");
    while (n)
    {	
        printf("书名:%s\t编号:%s\t价格:%d", n->date.namebook,n->date.num,n->date.price);
        n = n->next;
        printf("\n");
    }
    printf("-----------------------*感谢使用本系统*-----------------------\n");
}

 图书信息插入

void chabook(node l)
{
    int m, j, n = 0;                          
    node s, ptr;		                      
    ptr = l;                                          //让定义的结构体指针指向头节点l
    while (ptr != null) 	                          //通过遍历算出节点数
    {					    
        ptr = ptr->next;                              //当ptr访问的下一个节点为null时,就停止访问
        n++;			  
    }
    printf("请输入将图书插入的位置:\n");
    scanf("%d", &m);
    while (m > n)                                      //如果输入数字大于节点数就会执行以下语句
    {
        printf("输入的位置大于图书数量,请重新输入!\n");
        scanf("%d", &m);
    }
    ptr = l;                                            //让ptr重新指向头节点l
    j = 1; 
    while (ptr && (j < m))                              //循环到插入位置的前一个节点
    {
        ptr = ptr->next;
        j++;
    }
    s = (node)malloc(sizeof(lnode));                     //对新节点进行动态内存开辟
    assert(s);                                           //判断s的动态空间开辟有没有成功
    printf("----------------------------*图书插入系统*-----------------------------------------\n");
    printf("请输入图书信息:\n");	 
    printf("\n");
    printf("*-----------------------*\n");
    printf("请输入图书的名字:\n");
    scanf("%s", s->date.namebook);
    printf("*-----------------------*\n");
    printf("请输入图书的编号:\n");
    scanf("%s", s->date.num);
    printf("*-----------------------*\n");
    printf("请输入图书价格:\n");
    scanf("%d", &s->date.price);
    s->next = ptr->next;                //将新结点的next指针指向插入位置后的结点                
    ptr->next = s;                      //将插入位置前结点的next指针指向插入结点                
    printf("——————————————*信息插入成功*-------------------------------------——\n");
}

 图书信息删除

void freebook(node l)
{
    int m, n = 0, j;
    node p, q;                                   
    p = l->next;                                    //让定义的结构体指针指向头节点l
    while (p != null)                               //通过遍历算出节点数
    {                                               //当ptr访问的下一个节点为null时,就停止访问
        p = p->next;
        n++;
    }
    printf("----------------------------------*图书删除系统*-------------------------------------\n");
    printf("请输入要删除图书的位置:\n");
    scanf("%d", &m);
    while (n < m)                                     //如果输入数字大于节点数就会执行以下语句
    {
        printf("输入的图书超过总数,请重新输入要删除的图书位置:\n");
        scanf("%d", &m);
    }
    p = l; j = 1;                                      //让p重新指向头节点l
    while ((p->next) && (j < m))	                   //循环到插入位置的前一个节点
    {
        p = p->next;
        j++;
    }	
    q = p->next;	                                    //q指向指定节点m
    p->next = q->next;	                                //两个节点手拉手
    free(q);	                                        //释放内存空间
    printf("———————-----------————*图书删除成功*—--------------------------—————\n");
}

图书信息保存

void fopenbook(node l)
{
    file* fp;                                      //定义文件指针file* 类型的fp
    node ptr = l;                                  
    char filename[n];
    printf("------------------------------\n");
    printf("---*请输入你要保存的文件名*---\n");
    printf("------------------------------\n");
    scanf("%s", filename);
    if ((fp = fopen(filename, "wb")) == null)      //fopen打开文件,wb为了输出数据,打开一个二进制文件
    {
        printf("------------------------*打开文件失败*---------------------------\n");
        exit(0);                                   //如果fp为null就说明打开文件失败,退出文件操作
    }
    while (ptr->next != null)                      //while循环遍历整个链表
    {
        printf("------------------------*保存文件成功*---------------------------\n");
        fprintf(fp, "%s\n", ptr->next->date.namebook);    //fprintf格式化输出函数
        fprintf(fp, "%s\n", ptr->next->date.num);         //将链表节点的信息在文件上显示
        fprintf(fp, "%d\n", ptr->next->date.price);
        ptr = ptr->next;                                  //访问下一个节点
    }
    fclose(fp);                                           //关闭文件
    fp = null;                                            
}

图书信息查找

void seebook(node l)
{
    char num[n];                                
    node p;
    printf("-----------------------------------*图书查找系统*--------------------------------------------\n");
    printf("请输入查找的图书编号:>\n");
    scanf("%s", num);
    p = l->next;                                 //结构体指针p指向头节点的下一位
    while (p && strcmp(p->date.num, num) != 0)	 //strcmp函数比较两个字符串的大小
    {                                            //如果p不指向null,且两个字符串大小不相同就进入循环
        p = p->next;                             //访问下一个节点
    }                                           
    if (p)                                       //现在访问的就是目标节点
    {
        printf("*-----------------------*\n");
        printf("书名:%s\t编号:%s\t价格:%d", p->date.namebook, p->date.num, p->date.price);  //如果不是null,就输出节点信息
        printf("*-----------------------*\n");
    }
    else
    {
        printf("该图书信息还没有录入系统!\n");
    }
    printf("------------------------------------*图书查找系统欢迎您*---------------------------------------\n");
}

图书信息修改

void editbook(node l)
{
    char num[n];
    int input = 0;
    node p;
    printf("-----------------------------------*图书修改系统*--------------------------------------------\n");
    printf("----------------------------\n");
    printf("|-------*1.图书编号*-------|\n");
    printf("|-------*2.图书名字*-------|\n");
    printf("|-------*3.图书价格*-------|\n");
    printf("----------------------------\n");
    printf("请输入查找的图书编号:>\n");
    scanf("%s", num);
    p = l->next;
    while (p && strcmp(p->date.num, num) != 0)	//strcmp函数比较两个字符串的大小
    {
        p = p->next;
    }
    if (p)
    {
        printf("请选择你要修改的图书内容>:\n");
        printf("*-------------------------*\n");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("-------*修改图书编号*-------\n");
            scanf("%s", p->date.num);
            break;
        case 2:
            printf("-------*修改图书名字*-------\n");
            scanf("%s", p->date.namebook);
            break;
        case 3:
            printf("-------*修改图书价格*-------\n");
            scanf("%d", &p->date.price);
            break;
        default:
            printf("*-------------------------*\n");
            printf("输入错误,重新操作!\n");
            break;
        }
    }
    else
    {
        printf("该图书信息还没有录入系统!\n");
    }
}

退出管理系统

void quitbook(node l)
{
    printf("*-------------------------#您已退出此系统,欢迎下次使用#-------------------------------*\n");
    exit(0);
}

 主函数的介绍

int main()
{
    menu2();
    menu();
    node l;
    l = inputbook();
    int input = 0;
    while (1)
    {
        menu();
        printf("\n*请输入你要进行的图书操作>:\n");
        scanf("%d", &input);
            switch (input)
            {
            case 1:assist(); break;
            case 2:printbook(l); break;
            case 3:chabook(l); break;
            case 4:freebook(l); break;
            case 5:fopenbook(l); break;
            case 6:quitbook(l); break;
            case 7:editbook(l); break;
            case 8:seebook(l); break;
            }
        }
    return 0;
}

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com