数据结构之图书管理系统

简介: 数据结构之图书管理系统

绪论:

   昨晚看了女友老师的数据结构题目要求,觉得你们的题还是很有意思的,晚上花了两小时纯写了一下代码,救济一下18级数媒的小伙伴。因为这道题你们在网上找不到答案!老师题目要求还是比较刁钻的。


令狐助教帮你们分析分析

   答案我会贴出来,但是看你们有没有能力把它组织起来了,放在项目里执行。但答案我肯定都会写在这篇文章里。我会按我写它时的思路来介绍这个答案,希望大家从答案里学到东西。


第一文件结构创建:

我们需要在源文件创建:

  • bookmis.cpp
  • bookmis.h
  • main.cpp
  • status.h

第二打通文件脉络:

首先从main.cpp开始:

#include <iomanip>
#include "string"
#include"bookmis.h"
#include"status.h"
#include<iostream>

接着从bookmis.cpp引入:

#include"bookmis.h"
#include<iostream>
using namespace std;
void LocateBook(BookList L)
{
  Book e;
  int i;
  char n = 0;
  while (1)
  {
    std::cout << "输入1按书号查找,输入2按书名查找,输入3按作者名查找,输入4按序号查找,输入#返回上一级:" << endl;
    std::cin >> n;
    if (n == '#')
      break;
    if (n == '1')
    {
      std::cout << "请输入要查找的书号:";
      std::cin >> e.isbn;
      for (i = 0; i < L.length; i++)
      {
        if (strcmp(L.elem[i].isbn, e.isbn) == 0)
        {
          std::cout << L.elem[i].isbn << "  " << L.elem[i].name << "  " << L.elem[i].author << endl;
          break;
        }
      }
      if (i >= L.length)
        std::cout << "查无此书!请查看输入是否正确" << endl;
    }
    if (n == '2')
    {
      std::cout << "请输入要查找的书名:";
      std::cin >> e.name;
      for (i = 0; i < L.length; i++)
      {
        if (strcmp(L.elem[i].name, e.name) == 0)
        {
          std::cout << L.elem[i].isbn << "  " << L.elem[i].name << "  " << L.elem[i].author << endl;
          break;
        }
      }
      if (i >= L.length)
        std::cout << "查无此书!请查看输入是否正确" << endl;
    }
    if (n == '3')
    {
      std::cout << "请输入要查找的作者:";
      std::cin >> e.author;
      for (i = 0; i < L.length; i++)
      {
        if (strcmp(L.elem[i].author, e.author) == 0)
        {
          std::cout << L.elem[i].isbn << "  " << L.elem[i].name << "  " << L.elem[i].author << endl;
          break;
        }
      }
      if (i >= L.length)
        std::cout << "查无此书!请查看输入是否正确" << endl;
    }
    if (n == '4')
    {
      std::cout << "请输入要查找的序号:";
      std::cin >> i;
      if (i <= L.length)
      {
        std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl;
      }
      if (i > L.length)
        std::cout << "查无此书!请查看输入是否正确" << endl;
    }
  }
}
void Deletebyname(BookList &L)
{
  Book e;
  int i, j;
  char n = 0;
  while (1)
  {
    std::cout << "请输入要删除的书名:";
    std::cin >> e.name;
    for (i = 0; i < L.length; i++)
    {
      if (strcmp(L.elem[i].name, e.name) == 0)
      {
        for (j = i + 1; j <= L.length - 1; j++)
          L.elem[j - 1] = L.elem[j];
        --L.length;
        Printf(L);
      }
    }
  }
}

跟着一步走,补充头文件bookmis.h引入:

我们将在这个头文件里完成图书管理系统的表结构建设,并分别声明三个函数

  1. void LocateBook(BookList L);
  2. void Deletebyname(BookList &L);
  3. void Printf(BookList &L);

三个函数相当于图书管理系统的三个支柱,后序的功能都是靠这三个支柱完成的。

typedef struct
{
  char isbn[20];
  char name[50];
  char author[20];
  int price[100];
}Book;
typedef struct
{
  Book *elem;
  int length;
}BookList; 
void LocateBook(BookList L);
void Deletebyname(BookList &L);
void Printf(BookList &L);

再来最后一步头文件status.h的建立和引入:

建立状态标识符:

#pragma once
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 10000

这个时候我们已经建立并打通了

  • bookmis.cpp
  • bookmis.h
  • main.cpp
  • status.h

四个文件的脉络!

第三开始修建房梁

我们的主干main.cpp的房梁主要由以下几个结构构成:

int InitList(BookList &L);
int GetBook(BookList L, int i, Book &e);
int InsertBook(BookList &L, int i);
void Update(BookList &L);
void Create(BookList &L, int n);
void Printf(BookList &L);

如果说你看不懂这几个函数的功能:

那请你购买邓玉洁版的《算法与数据结构》

-------->点击购买

这是基础之基础,表建立的功能。

对应函数功能补充:

using namespace std;
void Printf(BookList &L);
int InitList(BookList &L)
{
  L.elem = new Book[MAXSIZE];
  if (!L.elem) exit(OVERFLOW);
  L.length = 0;
  return OK;
}
int GetBook(BookList L, int i, Book &e) 
{
  if (i<1 || i>L.length) return ERROR;
  e = L.elem[i - 1];
  return OK;
}
int InsertBook(BookList &L, int i) 
{
  int j = 0;
  if ((i<1) || (i > L.length + 1)) return ERROR;
  if (L.length == MAXSIZE) return ERROR;
  for (j = L.length - 1; j >= i - 1; j--)
    L.elem[j + 1] = L.elem[j];
  std::cout << "请输入书号、书名、作者" << endl;
  std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author;
  ++L.length;
  Printf(L);
  return OK;
}
void Update(BookList &L)
{
  Book e;
  int i;
  char n;
  while (1)
  {
    std::cout << "请输入要修改的书的序号 ,输入0返回上一级:";
    std::cin >> i;
    if (i == 0) break;
    else if ((i<1) || (i>L.length)) std::cout << "输入的序号不正确" << endl;
    else
    {
      std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl;
      std::cout << "请选择要修改的对象,1:书号,2:书名,3:作者 ,输入#返回上一级" << endl;
      std::cin >> n;
      if (n == '#')
        break;
      switch (n)
      {
      case '1':std::cout << "把其修改为:";
        std::cin >> L.elem[i - 1].isbn;
        std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
      case '2':std::cout << "把其修改为:";
        std::cin >> L.elem[i - 1].name;
        std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
      case '3':std::cout << "把其修改为:";
        std::cin >> L.elem[i - 1].author;
        std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
      default:break;
      }
    }
  }
}
void Create(BookList &L, int n) 
{
  int i;
  for (i = 0; i < n; i++)
  {
    std::cout << "请分别输入第" << i + 1 << "本书的书号、书名、作者" << endl;
    std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author;
    L.length++;
  }
}
void Printf(BookList &L)
{
  int i;
  std::cout << "/---------------------  存在以下图书  ----------------------------------/" << endl;
  std::cout << "   " << setw(10) << left << "序号" << setw(10) << left << "书号" << setw(30) << left << "书名" << setw(10) << left << "作者" << endl << endl;
  for (i = 0; i<L.length; i++)
  {
    std::cout << "   " << setw(10) << left << i + 1 << setw(10) << left << L.elem[i].isbn << setw(30) << left << L.elem[i].name << setw(10) << left << L.elem[i].author << endl;
  }
  std::cout << "/-----------------------------------------------------------------------/" << endl;
}

第四主房梁main的创建

我们将在这一步实现函数的调用和菜单设计,把之前的功能进行串联。

void main()
{
  BookList L;
  Book B;
  char n[20];
  int m = 0;
  char s = 0;
  InitList(L);
  std::cout << "/------------------------欢迎进入图书管理系统---------------------------/" << endl;
  std::cout << "创建图书信息" << endl;
  std::cout << "请输入书本数目:";
  std::cin >> m;
  Create(L, m);
  Printf(L);
  while (1)
  {
    std::cout << "请选择要进行的操作 :1:查找  2: 插入  3: 删除  4:修改  0: 显示:  :" << endl;
    std::cin >> s;
    switch (s)
    {
    case '0': Printf(L); break;
    case '1': LocateBook(L); break;
    case '2': InsertBook(L, L.length); break;
    case '4': Update(L); break;
    case '3':Deletebyname(L); break;
    }
  }
  system("pause");
}

第五main.cpp代码完整版

#include <iomanip>
#include "string"
#include"bookmis.h"
#include"status.h"
#include<iostream>
using namespace std;
void Printf(BookList &L);
int InitList(BookList &L)
{
  L.elem = new Book[MAXSIZE];
  if (!L.elem) exit(OVERFLOW);
  L.length = 0;
  return OK;
}
int GetBook(BookList L, int i, Book &e) 
{
  if (i<1 || i>L.length) return ERROR;
  e = L.elem[i - 1];
  return OK;
}
int InsertBook(BookList &L, int i) 
{
  int j = 0;
  if ((i<1) || (i > L.length + 1)) return ERROR;
  if (L.length == MAXSIZE) return ERROR;
  for (j = L.length - 1; j >= i - 1; j--)
    L.elem[j + 1] = L.elem[j];
  std::cout << "请输入书号、书名、作者" << endl;
  std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author;
  ++L.length;
  Printf(L);
  return OK;
}
void Update(BookList &L)
{
  Book e;
  int i;
  char n;
  while (1)
  {
    std::cout << "请输入要修改的书的序号 ,输入0返回上一级:";
    std::cin >> i;
    if (i == 0) break;
    else if ((i<1) || (i>L.length)) std::cout << "输入的序号不正确" << endl;
    else
    {
      std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl;
      std::cout << "请选择要修改的对象,1:书号,2:书名,3:作者 ,输入#返回上一级" << endl;
      std::cin >> n;
      if (n == '#')
        break;
      switch (n)
      {
      case '1':std::cout << "把其修改为:";
        std::cin >> L.elem[i - 1].isbn;
        std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
      case '2':std::cout << "把其修改为:";
        std::cin >> L.elem[i - 1].name;
        std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
      case '3':std::cout << "把其修改为:";
        std::cin >> L.elem[i - 1].author;
        std::cout << L.elem[i - 1].isbn << "  " << L.elem[i - 1].name << "  " << L.elem[i - 1].author << endl; break;
      default:break;
      }
    }
  }
}
void Create(BookList &L, int n) 
{
  int i;
  for (i = 0; i < n; i++)
  {
    std::cout << "请分别输入第" << i + 1 << "本书的书号、书名、作者" << endl;
    std::cin >> L.elem[i].isbn >> L.elem[i].name >> L.elem[i].author;
    L.length++;
  }
}
void Printf(BookList &L)
{
  int i;
  std::cout << "/---------------------  存在以下图书  ----------------------------------/" << endl;
  std::cout << "   " << setw(10) << left << "序号" << setw(10) << left << "书号" << setw(30) << left << "书名" << setw(10) << left << "作者" << endl << endl;
  for (i = 0; i<L.length; i++)
  {
    std::cout << "   " << setw(10) << left << i + 1 << setw(10) << left << L.elem[i].isbn << setw(30) << left << L.elem[i].name << setw(10) << left << L.elem[i].author << endl;
  }
  std::cout << "/-----------------------------------------------------------------------/" << endl;
}
void main()
{
  BookList L;
  Book B;
  char n[20];
  int m = 0;
  char s = 0;
  InitList(L);
  std::cout << "/------------------------欢迎进入图书管理系统---------------------------/" << endl;
  std::cout << "创建图书信息" << endl;
  std::cout << "请输入书本数目:";
  std::cin >> m;
  Create(L, m);
  Printf(L);
  while (1)
  {
    std::cout << "请选择要进行的操作 :1:查找  2: 插入  3: 删除  4:修改  0: 显示:  :" << endl;
    std::cin >> s;
    switch (s)
    {
    case '0': Printf(L); break;
    case '1': LocateBook(L); break;
    case '2': InsertBook(L, L.length); break;
    case '4': Update(L); break;
    case '3':Deletebyname(L); break;
    }
  }
  system("pause");
}

第六执行结果


目录
相关文章
数据结构项目—— 用顺序表制作图书管理系统
数据结构项目—— 用顺序表制作图书管理系统
383 0
数据结构项目—— 用顺序表制作图书管理系统
|
移动开发 Java 网络架构
数据结构(JAVA版本)练习之集合 简易图书管理系统
数据结构(JAVA版本)练习之集合 简易图书管理系统
117 0
|
9天前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
82 64
|
2天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
2天前
初步认识栈和队列
初步认识栈和队列
20 10
|
18天前
|
算法 安全 测试技术
golang 栈数据结构的实现和应用
本文详细介绍了“栈”这一数据结构的特点,并用Golang实现栈。栈是一种FILO(First In Last Out,即先进后出或后进先出)的数据结构。文章展示了如何用slice和链表来实现栈,并通过golang benchmark测试了二者的性能差异。此外,还提供了几个使用栈结构解决的实际算法问题示例,如有效的括号匹配等。
golang 栈数据结构的实现和应用
|
2天前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
14 3
|
21小时前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
12 1
|
3天前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
15 2
|
9天前
|
Go
数据结构之 - 深入了解栈数据结构
数据结构之 - 深入了解栈数据结构
16 5