C语言单链表实现图书管理系统

本文实例为大家分享了C语言单链表实现图书管理系统的具体代码,供大家参考,具体内容如下

单链表实现的图书管理系统相比于结构体实现的管理系统,可以随时开辟新的空间,可以增加书的信息

单链表的实现

首先肯定还是打印单链表的常规操作,创建表头,创建节点,表头法插入,特定位置删除,打印链表

struct book
{
    char name[20];
    float price;
    int num;          //书的数量
};
//3 数据容器——链表
struct Node
{
    struct book data;
    struct Node*next;
};
void printflist(struct Node*headnode);
struct Node*headnode = NULL;
//创建表头
struct Node*createlisthead()
{
    //动态内存申请
    struct Node*headnode = (struct Node*)malloc(sizeof(struct Node));
    //变量的基本规则:使用前必须初始化
    headnode->next = NULL;
    return headnode;
}
//创建节点,为插入做准备
//把用户的数据变为结构体变量
struct Node* createnewnode(struct book data)
{
    struct Node*newnode = (struct Node*)malloc(sizeof(struct Node));
    newnode->data = data;
    newnode->next = NULL;
    return newnode;
}
//表头法插入
void insertbyhead(struct Node*headnode, struct book data)
{
    struct Node* newnode = createnewnode(data);
    //必须先连后断
    newnode->next = headnode->next;
    headnode->next = newnode;

}
//指定位置删除
void deletenodebyname(struct Node*headnode, char *bookname)
{
    struct Node*posleftnode = headnode;
    struct Node*posnode = headnode->next;
    //字符串比较函数
    while (posnode != NULL && strcmp(posnode->data.name,bookname))
    {
        posleftnode = posnode;
        posnode = posnode->next;
    }
    //讨论结果
    if (posnode == NULL)
    {
        printf("未找到数据");
        return ;
    }
    else
    {
        posleftnode->next = posnode->next;
        free(posnode);
        posnode = NULL;
    }
    printflist(headnode);
}
//查找书籍
struct Node*searchbyname(struct Node*headnode, char *bookname)
{
    struct Node *posnode = headnode->next;
    while (posnode != NULL &&strcmp(posnode->data.name, bookname))
    {
        posnode = posnode->next;
    }
    return posnode;
}
//打印链表——从第二个节点开始打印
void printflist(struct Node*headnode)
{
    struct Node* pmove = headnode->next;
    printf("书名\t价格\t数量\n");

    while (pmove!=NULL)
    {
        printf("%s\t%.1f\t%d\n", pmove->data.name,pmove->data.price,pmove->data.num );
        pmove = pmove->next;
    }
    printf("\n");
}

冒泡排序——通过价格

第一个for循环表示遍历次数,第二个for循环使相邻的两个元素进行比较并交换
1 比较条件里,只用q指针即可
2 交换时需要创建一个临时变量

//冒泡排序算法
void bubblesortlist(struct Node*headnode)
{
    for (struct Node*p = headnode->next; p != NULL; p = p->next)
    {
        for (struct Node*q = headnode->next; q->next != NULL; q = q->next)
        {
            if (q->data.price > q->next->data.price)
            {
                //交换
                struct book tempdata = q->data;
                q->data = q->next->data;
                q->next->data = tempdata;
            }
        }
    }
    printflist(headnode);
}

如果不储存信息,那么每次在输入信息完毕后关闭控制台,信息无法保留,所以我们通过文件的方式来储存信息

文件写操作

1 通过创建节点指针变量来遍历输出文件中的信息
2 通过fprintf可以将输入的信息保持下来

//写操作
void savefile(const char*filename, struct Node*headnode)
{
    FILE*fp = fopen(filename, "w");
    struct Node*pmove = headnode->next;
    while (pmove != NULL)
    {
        fprintf(fp, "%s\t%.1f\t%d\n", pmove->data.name, pmove->data.price, pmove->data.num);
        pmove = pmove->next;
    }

    fclose(fp);
    fp = NULL;
}

文件读操作

1 当用 “r”的形式打开文件失败时,说明没有此文件,则可以用“w+”的形式打开,当没有文件时,会创建一个文件
2 把读取出的数据以表头法插入到链表中则可以再次打印出信息

//文件读操作
void readfile(const char *filename, struct Node*headnode)
{
    FILE*fp = fopen(filename, "r");
    if (fp == NULL)
    {
        //不存在文件则创建
        fp = fopen(filename, "w+");
    }
    struct book tempdata;
    while (fscanf(fp, "%s\t%f\t%d\n", tempdata.name, &tempdata.price, &tempdata.num) != EOF)
    {
        insertbyhead(headnode, tempdata);
    }
    fclose(fp);
    fp = NULL;
}

剩余代码

1 当查找书籍时先用临时指针接受找到书籍的指针,然后再打印书籍信息

//1 界面
void menu()
{
    printf("---------------------------------\n");
    printf("\t图书管理系统\n");
    printf("\t0.退出系统\n");
    printf("\t1.登记书籍\n");
    printf("\t2.浏览书籍\n");
    printf("\t3.借阅书籍\n");
    printf("\t4.归还书籍\n");
    printf("\t5.书籍排序\n");
    printf("\t6.删除书籍\n");
    printf("\t7.查找书籍\n");
    printf("---------------------------------\n");
    printf("请输入0~7\n");

}
//2  做交互
void keydown()
{
    int input = 0;
    struct book tempbook;  //创建临时变量,存储书籍信息
    struct Node*result = NULL;     //创建临时指针变量,指向查找书籍的节点
    scanf("%d", &input);
    switch (input)
    {
    case 0:
        printf("【退出】\n");
        printf("退出成功\n");
        system("pause");
        exit(0);   //关闭整个程序
        break;
    case 1:
        printf("【登记】\n");
        printf("输入书籍的信息(name,price,num)");
        scanf("%s%f%d", tempbook.name, &tempbook.price, &tempbook.num);
        insertbyhead(headnode, tempbook);
        savefile("book.txt", headnode);
        break;
    case 2:
        printf("【浏览】\n");
        printflist(headnode);
        break;
    case 3:
        printf("【借阅】\n");          //书籍存在,数量-1
        printf("请输入要借阅的书籍");
        scanf("%s", tempbook.name);
        result = searchbyname(headnode, tempbook.name);
        if (result == NULL)
        {
            printf("没有相关书籍,无法借阅");
        }
        else
        {
            if (result->data.num > 0)
            {
                result->data.num--;
                printf("借阅成功");
            }
            else
                printf("无库存");
            
        }

        break;
    case 4:
        printf("【归还】\n");      //书记归还,数量+1
        printf("请输入要归还的书籍");
        scanf("%s", tempbook.name);
        result = searchbyname(headnode, tempbook.name);
        if (result == NULL)
            printf("来源非法");
        else
        {
            result->data.num++;
            printf("书籍归还成功!");
        }
    
        break;
    case 5:
        printf("【排序】\n");
        bubblesortlist(headnode);
        savefile("book.txt", headnode);
        break;
    case 6:
        printf("【删除】\n");
        printf("输入要删除的书名");
        scanf("%s", tempbook.name);
        deletenodebyname(headnode, tempbook.name);
        savefile("book.txt", headnode);
        break;
    case 7:
        printf("【查找】\n");
        printf("请输入要查找的书籍");
        scanf("%s", tempbook.name);
        result = searchbyname(headnode, tempbook.name);
        if (result == NULL)
        {
            printf("未找到相关信息!\n");

        }
        else
        {
            printf("书名\t价格\t数量\n");
            printf("%s\t%.1f\t%d\t", result->data.name, result->data.price, result->data.num);
        }
        break;
    default:
        printf("选择错误,请重新选择:>");
        break;
    }
}
int main()
{
    headnode = createlisthead();
    readfile("book.txt", headnode);
    while (1)
    {
        menu();
        keydown();
        system("pause");
        system("cls");

    }
    system("pause");
    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言图书管理系统课程设计

    这是本人大一第二学期初C语言课程设计的作品,嘿嘿,本来以为已经找不到原稿了,今天无意中竟然在QQ网络硬盘中找到了当初的teta版,发布于此,以作纪念. C 源代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> struct book{ char book_name[30]; int bianhao; double price; char author[20]; char state[20]; cha

  • C语言实现简单的图书管理系统

    本文实例为大家分享了C语言实现简单图书管理系统的具体代码,供大家参考,具体内容如下 代码: /* 课程设计项目名称:图书查询系统 作者:施瑞文 时间:2018.3.4 */ #include<stdio.h> #include<string.h> #include<windows.h> #include<conio.h> #include<stdlib.h> #define N sizeof(struct BOOK) struct BOOK //

  • C语言链表实现简单图书管理系统

    本文实例为大家分享了C语言链表实现图书管理系统的具体代码,供大家参考,具体内容如下 实现功能: 用C语言制作图书管理系统,实现图书进行登记书籍,浏览书籍,借阅书籍,归还书籍,书籍排序,删除书籍信息,查找书籍等功能. 功能展示 1.登记书籍 2.浏览书籍 3.借阅书籍 4.归还书籍 5.书籍排序 6.删除书籍 7.查找书籍 8.退出程序 代码如下 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h>

  • C语言链表实现图书管理系统

    之前参照网上的资料用链表实现了图书管理系统,包括简单的增删改查功能以及借书还书功能,我是VC6.0下写的一个控制台程序,格式参照的网上的.在动手编码之前,你需要理清自己的思路.首先,需要确定图书馆里系统中主要有那几个对象,这里我写了学生对象和图书对象.不妨在纸上写出或画出它们主要包括哪些属性以及其可能的对应关系,这里根据不同人的要求会有所不同.清楚这些之后,就可以设计学生和图书的数据结构,比如这里我用的结构体存储其信息.然后就需要考虑,我想要哪些功能,除了基本的增删改查之外,我还想要哪些功能?比

  • C语言实现图书馆管理系统

    本文实例为大家分享了C语言实现图书馆管理系统的具体代码,供大家参考,具体内容如下 全部代码如下: #include <stdio.h> #include<string.h> #include<stdlib.h> #include <mysql.h> #pragma comment (lib,"libmysql.lib") //#pragma comment ( lib,"xxx.lib" ) //表示鏈接xxx.lib

  • C语言实现图书管理系统(文件数据库)

    本文实例为大家分享了C语言实现图书管理系统的具体代码,供大家参考,具体内容如下 简介 c语言的一个大作业,发上来纪念下嘿嘿.写的不是很好,很多东西都揉在一起来,不过注释写的也挺多,希望能帮到有需要的朋友. 题目要求 简单文件数据库-模拟图书馆管理系统 涉及知识点:文件读写.内存管理.结构体定义.基本数据结构.高级格式化输入输出 要求: 编写一个程序模拟图书管理系统.用户分为管理员和读者两类,分别显示不同文本格式菜单,通过菜单项对应数字进行选择.读者菜单包括借书.还书.查询等功能.管理员菜单包括图

  • C语言实现图书管理系统

    目前为止跟着学校进度学习C语言大概半年左右,基础学习只学到了指针,学得非常浅.说实话,起初对C语言的印象---只是一个学习计算机语言的敲门砖,对具体C语言如何应用等,非常迷茫.直到大一下半学期的高级语言设计课程之后,试过dos运行的图形化界面的完整小程序,才发现C语言的魅力. ok,废话不多说了,下面是我第二节课的作品----C语言的图书管理系统.一个简单的小程序.并非纯原创,是基于网络搜索到的"学生管理系统"改编而成的.通过直接浏览.修改一个完整的代码,我的收获颇丰.我认为这样比枯燥

  • C语言图书管理系统实验

    本文实验为大家分享了C语言图书管理系统的具体代码,供大家参考,具体内容如下 实验要求: 1.图书信息:包括ISBN.书名.主编.出版社.定价2.功能: (1)插入:若表中不存在新图书信息(ISBN不同),则插入(表尾)新图书信息.(2)删除:按ISBN删除(3)查找:按ISBN查找(4)修改:按ISBN查找,然后修改各个属性(5)排序:按ISBN排序(6)计数:输出图书信息的个数(7)导入:从TXT文件中读取已有图书信息(不同的属性之间用tab键隔开)(8)保存:将表中现有信息保存到txt文件中

  • C语言图书管理系统简洁版

    DOS界面的图书管理系统,具体内容如下 程序分为两块:管理员操作(收录图书.删除图书等)和会员操作(注册.借书.还书等): 1.管理员操作界面 2.会员操作界面 global.h头文件:(程序中只使用了一个编写的头文件,在这里存放了所有的接口函数以及需要使用到的头文件,还有结构体的定义) #include "iostream" #include "string" #include "fstream" #include "conio.h&

  • C语言单链表实现图书管理系统

    本文实例为大家分享了C语言单链表实现图书管理系统的具体代码,供大家参考,具体内容如下 单链表实现的图书管理系统相比于结构体实现的管理系统,可以随时开辟新的空间,可以增加书的信息 单链表的实现 首先肯定还是打印单链表的常规操作,创建表头,创建节点,表头法插入,特定位置删除,打印链表 struct book {     char name[20];     float price;     int num;          //书的数量 }; //3 数据容器--链表 struct Node {

  • C语言单链表实现学生管理系统

    本文实例为大家分享了C语言单链表实现学生管理系统的具体代码,供大家参考,具体内容如下 代码: #include<stdio.h> #include<stdlib.h> #include <string.h> #include <malloc.h> struct Student { int num;//学号 char name[20];//名字 char sex[2]; int age; struct Student *next; }; void insert

  • C语言单链表实现通讯录管理系统

    本文实例为大家分享了C语言单链表实现通讯录管理系统的具体代码,供大家参考,具体内容如下 本人前几天刚刚自学了单链表,趁热打铁,赶紧写一个小小的项目练练手. 单链表的实现在本人之前的博客中有:C语言编写一个链表 通讯录管理系统 保存人的信息有:  名字   name 电话   telephone 性别   sex 年龄   age 用一个结构体来装这些信息: struct infor{ char name[20]; int age; char sex[8]; char telephone[16];

  • C语言单链表实现方法详解

    本文实例讲述了C语言单链表实现方法.分享给大家供大家参考,具体如下: slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #include<assert.h> typedef int ElemType; typedef struct Node { //定义单链表中的结点信息 ElemType data; //结点的数据域 struct Node *next

  • java单链表实现书籍管理系统

    本文实例为大家分享了java单链表实现书籍管理系统的具体代码,供大家参考,具体内容如下 书籍管理系统功能: 1).添加图书 2).删除图书 3).查看图书 4).修改书籍 5).修改排序方式 6).模糊查询 7).退出程序 代码实现: Book类 package com.bookmanagement.book; public class Book {//书类 public String no; public String name; public int price; public String

  • C语言大作业之图书管理系统的实现详程

    目录 主要内容 概要设计 项目源码 结构体 登录界面函数 选择界面函数 操作界面函数 添加函数 查找函数 删除函数 借书管理函数 信息储存函数 还书函数 修改函数 添加借书函数 查找借书函数 借书管理函数 主函数 总结 序 时间在流去,我们在长大. 嗨,这里是狐狸~~ 今天是2022年的一月四日了,元旦小长假也过去了,新年新气象,新年新目标,我们要向前看,不要执意过去了,感谢过去,把握现在,展望未来,这是我们现在应该做的.好了,废话不多说,今天我们分享一个系统,确实也有许久没有分享过系统了,今天

  • C语言单链表实现多项式相加

    本文实例为大家分享了C语言单链表实现多项式相加的具体代码,供大家参考,具体内容如下 //多项式的相加和相乘 #include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996)//兼容scanf typedef struct node { int coef; int expon; struct node* link; }Polynode,*Polynomial; Polynomial InsertPolyLinklis

  • Go语言单链表实现方法

    本文实例讲述了Go语言单链表实现方法.分享给大家供大家参考.具体如下: 1. singlechain.go代码如下: 复制代码 代码如下: ////////// //单链表 -- 线性表 package singlechain //定义节点 type Node struct {     Data int     Next *Node } /* * 返回第一个节点 * h 头结点  */ func GetFirst(h *Node) *Node {     if h.Next == nil {  

  • C语言单链表的实现

    单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表结构: SList.h #pragma once typedef int DataType; typedef struct SListNode { DataType data; struct SListNode* next; }SListNode; // 如果要修改链表就必须加引用 SListNode* _BuyNode(DataType x); //建立节点 void PrintSlist(SListNode

  • 详解go语言单链表及其常用方法的实现

    目的 在刷算法题中经常遇到关于链表的操作,在使用go语言去操作链表时不熟悉其实现原理,目的是为了重温链表这一基础且关键的数据结构. 1.链表的特点和初始化 1.1.链表的特点 用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的) 1.2.结点 结点(node) 数据域 => 存储元素信息 指针域 => 存储结点的直接后继,也称作指针或链 首元结点 是指链表中存储的第一个数据元素的结点 头结点 是在首元结点之前附设的一个结点,其指针域指向首元结点(非必须) 头指

随机推荐