当前位置: 首页 > news >正文

图书管理系统的c实现用于图书信息的管理。

图书管理系统的c实现

用于图书信息的管理。包括图书信息的创建、图书信息的打印、图书信息的查询、图书信息的修改、图书信息的删除。方便用户整理图书,查询图书。

这个图书管理系统是由单链表这一数据结构实现的,板块包括图书信息的创建、打印、查询、修改、删除、以及图书价格的排序等组成。 代码后面也有注释的,基本很好理解的。

 

下面为源代码:

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

//3.数据的设计

 //3.1程序的数据存储--->容器

 //3.2数据的结构 --->图书的信息

 

struct bookInfo

{

 char name[20]; //书名

 float price; //书籍的价格

 int num; //书籍的数量

};

 

//定义链表

struct Node

{

 struct bookInfo data;

 struct Node* 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 data)

{

 struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));

 newNode->data = data;

 newNode->next = NULL;

 return newNode;

}

 

//数据插入(头插法)

void insertNodeByHead(struct Node* headNode, struct bookInfo data)

{

 struct Node* newNode = createNode(data);

 newNode->next = headNode->next;

 headNode->next = newNode;

}

 

//尾插法

/*struct insertNodeByTall(struct Node* headNode, int data)

{

 struct Node* pMove = headNode;

 while (pMove != NULL)

 {

  pMove = pMove->next;

 }

 struct Node* newNode = createHead(data);

 pMove->next = newNode;

}*/

 

//指定删除(删除链表中元素)

//posLeftNode->next=posNode->next;

//free(posNode);

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 = posLeftNode->next;

 }

 //讨论查找的结果

 if (posNode == NULL)

  return;

 else

 {

  printf("删除成功!\n");

  posLeftNode->next = posNode->next;

  free(posNode);

  posNode = NULL;

 }

}

//查找

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 printList(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;

 }

}

 

//直接文件操作

//文件写操作

void saveInfoToFile(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);

}

 

//文件读操作

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(fp);

}

//冒泡排序(链表)

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 bookInfo tempData = q->data;

    q->data = q->next->data;

    q->next->data = tempData;

   }

  }

 }

 printList(headNode);

}

 

 

//2.交互

void keyDown()

{

 int userkey = 0;

 struct bookInfo tempBook; //产生一个临时的变量存储书籍信息

 struct Node* result = NULL;

 scanf("%d", &userkey);

 switch (userkey) {

 case 0:

  printf(" 【 登记 】 \n");

  printf("输入书籍的信息(name,price,num):");

  scanf("%s%f%d", tempBook.name, &tempBook.price, &tempBook.num);

  insertNodeByHead(list, tempBook);

  saveInfoToFile("bookinfo.txt", list);

  break;

 case 1:

  printf(" 【 浏览 】 \n");

  printList(list);

  break;

 case 2:

  printf(" 【 借阅 】 \n"); 

  printf("请输入你要借阅的书籍:");

  scanf("%s", tempBook.name);

  result = searchByName(list,tempBook.name);

  if (result == NULL)

   printf("没有相关书籍无法借阅!\n");

  else

  {

   if (result->data.num > 0)

   {

    result->data.num--;

    printf("借阅成功\n");

    saveInfoToFile("bookinfo.txt", list);

   }

   else

   {

    printf("当前书籍无库存,借阅失败!\n");

   }

  }

  break;

 case 3:

  printf(" 【 归还 】 \n");

  printf("请输入你要归还的书籍:");

  scanf("%s", tempBook.name);

  result = searchByName(list, tempBook.name);

  if (result == NULL)

   printf("书籍来源非法!\n");

  else

  {

   result->data.num++;

   printf("书籍归还成功!\n");

   saveInfoToFile("bookinfo.txt", list);

  }

  break;

 case 4:

  printf(" 【 查找 】 \n");

  printf("你要查询的书名:");

  scanf("%s", tempBook.name);

  result = searchByName(list, tempBook.name);

  if (result == NULL)

  {

   printf("未找到相关结果!\n");

  }

  else

  {

   printf("书名\t价格\t数量\n");

   printf("%s\t%.1f\t%d\n", result->data.name, result->data.price, result->data.num);

  }

  break;

 case 5:

  printf(" 【 排序 】 \n");

  bubbleSortList(list);

  break;

 case 6:

  printf(" 【 删除 】 \n");

  printf("输入想要删除的书名:");

  scanf("%s", tempBook.name);

  deleteNodeByName(list, tempBook.name);

  saveInfoToFile("bookinfo.txt", list);

  break;

 case 5:

  printf(" 【 排序 】 \n");

  bubbleSortList(list);

  break;

 case 6:

  printf(" 【 删除 】 \n");

  printf("输入想要删除的书名:");

  scanf("%s", tempBook.name);

  deleteNodeByName(list, tempBook.name);

  saveInfoToFile("bookinfo.txt", list);

  break;

 case 7:

  printf(" 【 退出 】 \n");

  printf(" 退出成功 \n");

  system("pause");

  exit(0); //关掉整个程序

  break;

 default:

  printf(" 【 error 】 \n");

  break;

 }

}

 

//1.界面--->菜单--->模块

void makeMenu()

{

 printf("----------------------------------\n");

 printf(" Eugeo图书管理借阅系统\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):");

}

 

int main()

{

 list = createHead(); //链表初始化

 readInfoFromFile("bookinfo.txt", list);

 while (1)

 {

  makeMenu();

  keyDown();

  system("pause");

  system("cls");

 }

 

}

相关文章:

  • RabbitMQ工作模式
  • 20221223今天的世界发生了什么
  • 即时通讯音视频开发数字视频介绍
  • T-SQL程序练习01
  • 十、51单片机之步进电机
  • iPhone设置163邮箱 收件服务器和发件服务器填写内容
  • 四大领先优势加持,华为云会议服务更省心可靠!
  • 【AI理论学习】理解词向量、CBOW与Skip-Gram模型
  • 【学习笔记】JavaScript异步编程
  • Java Number Math 类
  • 【Go实现】实践GoF的23种设计模式:命令模式
  • ETCD的创建
  • 沥青瓦UKCA认证—EN 544
  • 一本通 1276:【例9.20】编辑距离
  • c语言复习之文件(十三)
  • 【OJ每日一练】1033 - 等级成绩
  • 5G URLLC标准化关键技术分析
  • 安装GitHub上一些库的注意事项
  • 知识蒸馏DEiT算法实战:使用RegNet蒸馏DEiT模型
  • 《MySQL高级篇》九、数据库的设计规范