数据结构之图书管理系统

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

绪论:

   昨晚看了女友老师的数据结构题目要求,觉得你们的题还是很有意思的,晚上花了两小时纯写了一下代码,救济一下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");
}

第六执行结果


目录
打赏
0
1
0
1
42
分享
相关文章
数据结构项目—— 用顺序表制作图书管理系统
数据结构项目—— 用顺序表制作图书管理系统
458 0
数据结构项目—— 用顺序表制作图书管理系统
数据结构(JAVA版本)练习之集合 简易图书管理系统
数据结构(JAVA版本)练习之集合 简易图书管理系统
211 0
|
8月前
|
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
756 9
|
8月前
|
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
186 59
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
24 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
6月前
|
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
301 77
|
5月前
|
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
84 11
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
6月前
|
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
222 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问