前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言项目 图书管理系统 | 链表

C语言项目 图书管理系统 | 链表

作者头像
CtrlX
发布2022-11-22 16:53:31
6130
发布2022-11-22 16:53:31
举报
文章被收录于专栏:C++核心编程

需求文档

产品原型图

产品流程图

核心代码

预备知识

  1. 指针如何变成变量
  2. 什么是结构体
  3. 什么是链表
代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//3.数据的设计
/*
1.程序用什么东西处理数据-- 数组、链表
2.数据的结构 -- 图书的处理
*/

//创建图书信息
struct bookInfo
{
    char name[20];
    float price;
    int num;
};

//创建容器-有表头的链表-表头不存放数据
struct Node()
{
    struct bookInfo data;
    struct *next;
};
//创建全局链表表头
struct Node* list = NULL;

//创建表头:
struct Node* createHead(){
    //动态内存分配
    struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
    //初始化:通常需要初始化指针和数据
    //但是表头不需要存放数据所以只需要初始化指针即可
    headNode->next = NULL;
    return headNode;
}

//创建节点:为插入做准备
/*
把用户的数据变为结构体变量
*/
struct Node* createNode(struct bookInfo date)
{
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

//打印链表
/*
打印以当前节点为头节点的链表。
需要定义一个指针从当前头节点的下一个节点开始打印
*/
void printList(struct Node* headNode){
    struct Node* pMove = headNode->next;
    while(pMove)//完整写法pMove != NULL
    {
        printf("%s/t%.1f\n%d\n",pMove->data.name,pMove->data.price,pMove->data.num);
        pMove = pMove->next;
    }
}

//插入:只需要一种插入方式
/*
表头插入
*/
void insertNodeByHead(struct Node* headNode,struct bookInfo data){
    struct Node* newNode = createNode(data);
    newNode->next = headNode->next;
    headNode->next = newNode;
}

//插入:尾插
/*
关键是找到表尾:当pMove-next == NULL时
*/
void insertNodeByTail(struct Node* headNode,struct bookInfo data){
    struct Node* pMove = headNode;
    while(pMove->next == NULL){
        pMove = pMove-next;
    }
    struct Node* newNode = createNode(data);
    pMove->next = newNode;
    
}

//指定位置删除
/*
通过书名进行查询删除
*/
void deleteNodeByName(struct Node* headNode,char *bookName)
{
    struct Node* posLeftNode = NULL;
    struct Node* posNode = headNode->next;
    //书籍名字时是字符串,需要采用strcmp函数比较字符串
    while(posNode != NULL && strcmp(posNode->data.name,bookName)){
        posLeftNode = posNode;
        posNode = posLeftNode->next;
    }
    if(posNode == NULL){
        return;
    }
    else 
    {
        printf("删除成功\n");
        posLeftNode->next = posNode->next;
        free(posNode);
        posNode = NULL; 
    }
}

//
struct Node* searchByName(struct Node* headNode,char* fileName){
    struct Node* posNode = headNode->next;
    while(posNode != NULL && strcmp(posNode->data->name,fileName)){
        posNode = posNode->next;
    }
    return posNode;
}

//1.写界面--》菜单--》模块
void makeMeun()
{
    printf("图书管理系统\n");
    printf("0.退出系统\n");
    printf("1.登记书籍\n");
    printf("2.浏览书籍\n");
    printf("3.借阅书籍\n");
    printf("4.归还书籍\n");
    printf("5.书籍排序\n");
    printf("6.删除书籍\n");
    printf("7.查找书籍\n");
}

//直接文件操作
/*
在程序中我们通过list链表存储数据,但是在计算机中我们通过文件存储数据,所以我们需要通过从文件中读取数据到链表里。
*/
//文件写操作
void saveInforToFile(const char* fileName,struct Node* headNode){
    FILE *fp = fopen(filename,"w");
    //从第二个节点开始存入文件
    struct Node* pMove = headNode->next;
    while(pMove != NULL){
        fprintf(fp,"%s\t%f\t%d\n",pMove->data.name,pMove->data.price,pMove->data.num);
        pMove = pMove->next;
    }
    fclose(fileName);
}
//文件读操作 
void readInfoFromFile(const char* fileName,struct Node* headNode){
    FILE *fp = fopen(filename,"r");
    if(fp == NULL){
        //第一次打开程序文件肯定不存在,所以要创建一个文件
        fp = fopen(fileName,"w+")
    }
    struct bookInfo tempdata;
    //怎么写的怎么读
    while(fscanf(fp,"%s\t%f\t%d\n",tempData.name,tempData.price,tempData.num) != EOF){
        insertNodeByHead(list,tempData);
    }
    fclose(fileName);
}

//冒泡排序-对链表进行排序-按照书籍的价格排序
void bubbleSortList(struct Node* headNode){
    for(struct Node* p = headNode->next;p != NULL;p = p->next){
        for(struct Node* p = headNode->next;q->next != NULL;q = q->next){
            if(q->data.price > q->data.price){
                struct bookInfo tempData = q->data;
                q->data = q->next->data;
                q->next->data = tempData;
            }
        }
    }
}


//2.做交互
void keyDown()
{
    int userKey = 0;
    struct bookInfo tempBook;
    struct Node* resualt = NULL;
    scanf("%d",userKey);
    switch(userKey)
    {
    case 0:
        exit(0);
        break;
    case 1:
        printf("登记\n");
        printf("请输入书籍信息:(名称,价格,数量)");
        scanf("%s%f%d",);
        insertNoteByhead(list,);
        saveInfoToFile("bookFile.txt",list);
        break;
    case 2:
        printf("浏览\n");
        printList(list);
        break;
    case 3:
        printf("借阅\n");
        scanf("%s",tempBook.name);
        resualt = searchByName(list,tempBook.name);
        if(resualt == NULL){
            printf("Book Not Found!");
        }
        else{
            if(resualt->data.num > 0){
                resualt->data.num --;
                printf("借阅成功\n");
            }
            	
        }
        break;
    case 4:
        break;
    case 5:
        bubbleSortList(list);
        break;
    case 6:
        printf("删除");
        scanf("%s"'tempData.name');
        deleteNoteByName(list,tempBook.name);
        saveInfoToFile("bookInfo.txt",list);
        break;
    case 7:
        Printf("查找");
        scanf("%s",tempBook.name);
        resualt = searchByName(list,tempBook.name);
        if(resualt == NULL){
            printf("Not Found!")
        }
        else{
            printf("%s\t%.1f\t%d\n",resualt->data.name,resualt->data.price,resualt->data.num);
        }
        break;
    default:
        printf("error\n");
        break;
        
    }
}



int main()
{
    int userKey = 0;
    list  = createHead();
    while(1){
        makeMenu();
        keyDown();
        system("pause");
        system("cls");
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求文档
  • 产品原型图
  • 产品流程图
  • 核心代码
    • 预备知识
    相关产品与服务
    文件存储
    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档