千家信息网

C++利用链表如何实现图书信息管理系统

发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章将为大家详细讲解有关C++利用链表如何实现图书信息管理系统,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++利用链表实现一个简单的图书信息管
千家信息网最后更新 2025年11月13日C++利用链表如何实现图书信息管理系统

这篇文章将为大家详细讲解有关C++利用链表如何实现图书信息管理系统,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

C++利用链表实现一个简单的图书信息管理系统,具体内容如下

(1)图书信息包括ISBN号、书名、作者名、价格和数量等;
(2)系统的主要功能包括:图书信息的创建、输出图书信息、查询图书信息、增加图书信息、删除图书信息。

#include #include  #include //创建结构体及其成员typedef struct Node {    int num;//编号    char name[20];//书名    char author[20];//作者    int isexsit;//数量    float price;//价格    struct Node *next;//指针域} S;//结构体定义为S//各函数定义void choose();void menu(); //菜单函数S *create();//创建链表函数void print(S *);//输出链表函数void pop_sort(S *);//排序void insert(S *);//插入节点函数void del(S *);//删除节点函数void search2(S *);//书名查找节点函数void search3(S *);//作者查找节点函数void search4(S *);//编号查找void mod(S *);//修改图书信息//主函数int main() {    choose();}void choose() {    S *head;    int n, a = 1;//n用来控制选择操作类型,a控制循环,以-1终止    while (a > 0) {        menu();//显示菜单        printf("选择你想使用的功能:");        scanf("%d", &n);//选择操作        switch (n)//各操作数字对应菜单数字,通过n确定操作类型        {            case 1://创建                head = create();                break;            case 2://输出                printf("图书信息为(按价格排序后)\n");                pop_sort(head);                printf("编号\t书名\t作者\t数量\t价格\n");                print(head);                break;            case 3://插入                insert(head);                printf("插入后\n");                printf("编号\t书名\t作者\t数量\t价格\n");                print(head);                break;            case 4://删除                del(head);                printf("删除后\n");                printf("编号\t书名\t作者\t数量\t价格\n");                print(head);                break;            case 5://书名查找                search2(head);                break;            case 6://作者查找                search3(head);                break;            case 7://编号查找                search4(head);                break;            case 8://修改                mod(head);                pop_sort(head);                printf("图书信息为\n");                printf("编号\t书名\t作者\t数量\t价格\n");                print(head);                break;            default:                a = -1;//跳出循环条件                break;        }    }}//菜单模块直接显示void menu() {    printf("\n\n");    printf("\t\t     欢迎使用图书管理系统\n");    printf("\t\t|----------SCORE-----------|\n");    printf("\t\t|\t1.创建图书           |\n");    printf("\t\t|\t2.展示图书信息        |\n");    printf("\t\t|\t3.添加图书信息        |\n");    printf("\t\t|\t4.删除图书           |\n");    printf("\t\t|\t5.按图书名搜索        |\n");    printf("\t\t|\t6.按作者名搜索        |\n");    printf("\t\t|\t7.按图书编号搜索      |\n");    printf("\t\t|\t8.修改图书信息        |\n");    printf("\t\t|\t9.退出程序           |\n");    printf("\t\t|--------------------------|\n");    printf("\t\t\tchoice(1-9):\n");}//创建链表模块S *create() {    S *head, *p, *q;//定义指针    int i;    head = (S *) malloc(sizeof(S));//头节点开辟空间    head->next = NULL;//置空头节点的指针域    q = head;//q指针记录头节点的地址    p = head->next;//p指针记录头节点的指针域的地址    printf("请输入图书编号,图书名,作者,图书数量,价格,最后输入0结束\n");    int num;    scanf("%d", &num);    while (num != 0)//输入书籍编号输入为零停止循环    {        p = (S *) malloc(sizeof(S));//p指针开辟空间        //输入各成员        p->num = num;        scanf("%s %s %d %f", p->name, p->author, &p->isexsit, &p->price);        p->next = NULL;//置空p节点的指针域        q->next = p;//p,q节点连接        q = p;//q指针后移        printf("请输入图书编号,图书名,作者,图书数量,价格,最后输入0结束\n");        scanf("%d", &num);    }    return head;//返回链表的起始地址}//插入节点模块(可多个插入)void insert(S *head) {    int i, num, flag = 1;//flag实现判断指针是否到达最后一个节点    S *p, *q, *r; //定义指针便于插入操作    printf("请输入一本图书的信息:\n");    printf("请输入图书的编号,输入0结束\n");    scanf("%d", &num);    while (num != 0)//输入编号不为零时循环,以零终止,可实现多个插入    {        r = (S *) malloc(sizeof(S));//为r开辟空间        r->next = NULL;//置空r的指针域        r->num = num;        printf("请输入图书名,作者,图书数量,图书价格\n");        scanf("%s %s %d %f", r->name, r->author, &r->isexsit, &r->price);        q = head;//q指针记录头节点的地址        p = head->next;//p指针记录头节点的指针域的地址        while (q->next != NULL && p->price < r->price)//循环条件:当q->next不为空,以及按价格排序插入        {            p = p->next;//p指针后移            q = q->next;//q指针后移            if (q->next == NULL)//这个判断防止q->next为空时,在执行循环是出现野指针使程序出错            {                p = NULL;//防止出现野指针p                q->next = r;//连接节点                r->next = NULL;//置空r指针域                flag = 0;//到达最后一个节点更改flag                break;            }        }        if (flag)//判断是否到达最后一个节点,为真执行该操作        {            r->next = p;            q->next = r;            //实现将r节点插入链表        }        printf("请输入图书编号,输入0结束\n");        scanf("%d", &num);    }}//删除节点模块void del(S *head) {    S *p, *q;//定义指针    int b;//用于输入编号查找删除    p = head;//p记录头节点的地址    q = head->next;//q记录头节点的指针域的地址    printf("请输入你想要删除的图书编号:");    //输入编号    scanf("%d", &b);    while (q != NULL)//q不为空时执行循环    {        if (q->num == b)//判断是否找到输入的编号            //为真时        {            p->next = q->next;//断开q节点            free(q);//释放q节点neicun            q = NULL; //置空q指针防止出现野指针        } else {            //判断为假时            p = p->next;//p指针后移            q = q->next;//q指针后移        }    }    if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出输入错误        printf("输入错误\n");}//书名查找模块void search2(S *head) {    S *p;//定义指针    char name1[20];//定义name1用于输入查找书名    printf("请输入你要搜素的书名:");    //输入查找书名    scanf("%s", name1);    p = head->next;    while (p != NULL) {        if (strcmp(p->name, name1) == 0)//判断是否找到书籍        {            //为真时,输出信息            printf("书籍信息\n");            printf("编号\t书名\t作者\t数量\t价格\n");            printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price);            break;        } else            //为假时            p = p->next;//指针后移    }    if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出输入错误        printf("输入错误\n");}//作者查找模块void search3(S *head) {    S *p;//定义指针    char name2[20];//定义name2用于输入查找书籍    printf("输入你想要查询的作者:");    //输入查找作者    scanf("%s", name2);    p = head->next;    while (p != NULL) {        if (strcmp(p->author, name2) == 0)//判断是否找到书籍        {            //为真时,输出信息            printf("书籍信息\n");            printf("编号\t书名\t作者\t数量\t价格\n");            printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price);            break;        } else            //为假时            p = p->next;//指针后移    }    if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出输入错误        printf("输入错误\n");}//编号查找void search4(S *head) {    S *p;//定义指针    int num1;//定义num1用于输入查找书籍    printf("请输入你要搜索的图书编号:");    //输入查找编号    scanf("%d", &num1);    p = head->next;    while (p != NULL) {        if (p->num == num1)//判断是否找到书籍        {            //为真时,输出信息            printf("书籍信息\n");            printf("编号\t书名\t作者\t数量\t价格\n");            printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price);            break;        } else            //为假时            p = p->next;//指针后移    }    if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT        printf("输入错误\n");}//修改信息模块void mod(S *head) {    S *p;//定义指针    int num1, num2, isexsit1;//定义num1用于输入查找书籍修改信息,num2用于修改    char name1[20], author1[20];    float price1;    printf("请输入你要修改的图书编号:");    //输入要修改的图书编号    scanf("%d", &num1);    p = head->next;    while (p != NULL) {        if (p->num == num1)//判断是否找到书籍        {            printf("请再次输入 图书编号,书名,作者,图书数量 ,价格\n");            //为真时,重输图书信息            scanf("%d %s %s %d %f", &num2, name1, author1, &isexsit1, &price1);            p->num = num2;            strcpy(p->name, name1);            strcpy(p->author, author1);            p->isexsit = isexsit1;            p->price = price1;            break;        } else            //为假时            p = p->next;//指针后移    }    if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出输入错误        printf("输入错误\n");}void pop_sort(S *head)   //链表冒泡排序{    //排序中没有修改头节点指针值,只是修改指针内容head->next的值    S *pre, *p, *tail, *temp;    tail = NULL;    pre = head;    while ((head->next->next) != tail)//(head->next)!=tail同样适用 ,多执行最后一个步比较    {        p = head->next;        pre = head;        while (p->next != tail) {            if ((p->price) > (p->next->price)) {                pre->next = p->next; //交换节点方法                temp = p->next->next;                p->next->next = p;                p->next = temp;                p = pre->next;  //p回退一个节点            }            p = p->next;  //p再前进一个节点            pre = pre->next;        }        tail = p;    }}//输出链表模块void print(S *head) {    int i;    S *p = head->next;    while (p)//当p不为空的时候执行    {        printf("%d\t%s\t%s\t%d\t%.2f\n", p->num, p->name, p->author, p->isexsit, p->price);        printf("\n");        p = p->next;//指针后移    }}

关于C++利用链表如何实现图书信息管理系统就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

输入 图书 指针 节点 信息 作者 书名 价格 数量 输出 书籍 后移 函数 错误 模块 地址 循环 系统 排序 管理系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 进销存软件开发谈论 企业网络技术培训资料 同有服务器 杀戮空间2 架设服务器 吉林特种网络技术质量服务 虚拟服务器可以打游戏吗 正向代理服务器作用 服务器通电了HBA卡有光么 网络安全人人有责黑板报图片 界面窗口用什么软件开发 网络安全法硬笔书法 戴尔服务器超频教程 女生学人工智能还是软件开发 计算机网络技术专业的未来 上海钛有互联网信息科技公司 网络安全法法院如何处理 网络安全的三观三监测是什么 江湖网络技术开发天津有限公司 数据库中的存储是 功能性的聊天软件开发 移动电子商务网络技术基础 svn服务器地址 软件开发蓝桥杯省一等奖 软件开发企业会计科目有哪些 数据库营销案例分析论文 网络安全自我教育ppt 移动公司网络安全故障原因分析 中国科技互联网企业排名 合众网络技术广州有限公司 传统数据库典型产品及其特点
0