数据结构 实验 1

题目一:用线性表实现文具店的货品管理问题

问题描述:在文具店的日常经营过程中,存在对各种文具的管理问题。当库存文具不足或缺货时,需要进货。日常销售时需要出库。当盘点货物时,需要查询货物信息。请根据这些要求编写软件完成库存文具的管理功能。

问题分析:通过对问题的抽象,文具信息和文具分类信息可以用表1和表2来表示。可见文具信息和文具分类信息在逻辑上具有线性的关系,因此可以使用线性表来解决这个问题。由于文具信息变动较大,应该使用链式存储结构来进行表示和实现。而文具分类信息变动不大,可以使用顺序存储结构进行表示和实现。

1 文具信息

文具名称

文具类别

文具数量

钢笔

1

400

日记本

2

2000

计算器

3

50

2 文具分类信息

文具类别号

文具类别名

1

文具

2

纸张

3

工具

程序简介:

本程序包含两个模块

1.数据结构的设计

typedef struct    //定义文具分类信息结构,代表一个结点

{

      int TypeNumber;          //文件类别号

      char TypeName[10]; //文具类别名

}Type;

typedef struct    //定义文具分类顺序表

{

      Type *elem;

      int length;  

}sqList;

typedef struct    //文具信息结构

{

      int TypeNumber;      //文件类别号

      char StockName[10];//文具名称

      int amount;//文具数量

}StockType;

typedef struct Lnode      //文具信息链表数据类型

{

      StockType data;

      struct Lnode *next;

}Lnode,*Linklist;

主程序模块

int main( )

{

      CreatTypeList(L);    //创建文具分类顺序表

      CreatList_R(h);     //用尾插法建立文具信息链表

      while(1)

      {

            cout<<"文具店货品管理系统"<<endl;

            cout<<"**********主菜单**********"<<endl;

            cout<<"     (1)文具入库"<<endl;

            cout<<"     (2)文具出库"<<endl;

            cout<<"     (3)查询文具信息"<<endl;

            cout<<"     (4)显示文具信息"<<endl;

            cout<<"     (5)添加新文具类别"<<endl;

            cout<<"     (0)退出系统"<<endl;

            cout<<"请选择(1,2,3,4,5,0):";

            cin>>choice;

            if(choice<0||choice>5)

                  continue;

            switch(choice)

            {

           

                  case 1:

                        AddStock(h);

                        break;

                  case 2:

                        RemoveStock(h);   

                        break;

                  case 3:

                        QueryStock(h);

                        break;

                  case 4:

                        DisplayStock(h);

                        break;

                  case 5:

                        AddType(L);

                        break;

                  case 0:

                        exit(0);

                  default:

                        break;

            }

      }

      system("pause");

      return 0;

}

2.各个函数功能

int CreatTypeList(sqList &L)             //创建文具分类顺序表

void CreatList_R(Linklist &h)           //尾插法建立文具链表

int AddStock(Linklist &h)       //文具入库,如果该文具存在,则修改其数量,如果该文具不存在,则插入到文具链表中。

int RemoveStock(Linklist &h) //文具出库,如果出库数量大于库存数量,则从链表中删除该文具,否则只修改文具数量。

void QueryStock(Linklist h)      //查询文具信息根据文具类别号输出

void DisplayStock(Linklist h)    //显示文具信息  

int AddType(sqList &L)            //添加新文具类别

系统界面显示效果

实验要求:

  • 完善给出的程序框架Test1.cpp,使之能够实现基本的功能。
  • 添加文具类别显示查询出库入库添加排序的功能int SortStock(Linklist &h),要求能够根据文具类别号对文具进行排序。

实验代码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
using namespace std;
#define MAX_TYPE 100typedef struct Type
{int TypeNumber;char TypeName[10];
} Type;typedef struct
{Type *elem;int length;int maxSize;
} sqList;typedef struct StockType
{int TypeNumber;char StockName[10];int amount;
}StockType;typedef struct Lnode
{StockType data;struct Lnode *next;
} Lnode, *Linklist;void CreatTypeList(sqList &L,int max)
{L.length = max;
}void CreatList_R(Linklist &h)
{// 初始化链表头指针为空h = NULL;
}// 文具入库
int AddStock(Linklist &h, int typeNumber, const char *stockName, int amount)
{Linklist p = h, q;while (p != NULL){if (p->data.TypeNumber == typeNumber && strcmp(p->data.StockName, stockName) == 0){p->data.amount += amount;return 1;}q = p;p = p->next;}Linklist newNode = new Lnode;newNode->data.TypeNumber = typeNumber;strcpy(newNode->data.StockName, stockName);newNode->data.amount = amount;newNode->next = NULL;if (h == NULL){h = newNode;}else{q->next = newNode;}return 1;
}// 文具出库
int RemoveStock(Linklist &h, int typeNumber, const char *stockName, int amount) {Linklist p = h, q;while (p != NULL){if (p->data.TypeNumber == typeNumber && strcmp(p->data.StockName, stockName) == 0){if (p->data.amount >= amount){p->data.amount -= amount;if (p->data.amount == 0){if (p == h){h = p->next;}else{q->next = p->next;}delete p;}return 1;}else{return 0;}}q = p;p = p->next;}return 0;
}// 查询文具信息
void QueryStock(Linklist h, int typeNumber)
{Linklist p = h;while (p != NULL){if (p->data.TypeNumber == typeNumber){cout << "文具名称:" << p->data.StockName << ",数量:" << p->data.amount << endl;}p = p->next;}
}// 显示文具信息
void DisplayStock(Linklist h)
{Linklist p = h;while (p != NULL){cout << "文具类别号:" << p->data.TypeNumber << ",文具名称:" << p->data.StockName << ",数量:" << p->data.amount << endl;p = p->next;}
}// 添加新文具类别
int AddType(sqList &L, int typeNumber, const char *typeName)
{if (L.length >= L.maxSize){return 0;}for (int i = 0; i < L.length; i++){if (L.elem[i].TypeNumber == typeNumber){return 0;}}L.elem[L.length].TypeNumber = typeNumber;strcpy(L.elem[L.length].TypeName, typeName);L.length++;return 1;
}
// 根据文具类别号对文具进行排序
void SortStock(Linklist &h)
{if (h == NULL || h->next == NULL)return;Linklist p, q;for (p = h; p->next != NULL; p = p->next){for (q = p->next; q != NULL; q = q->next){if (p->data.TypeNumber > q->data.TypeNumber){StockType temp = p->data;p->data = q->data;q->data = temp;}}}
}
void DisplayTypeList(sqList &L)
{for (int i = 0; i < L.length; i++){cout << "文具类别号:" << L.elem[i].TypeNumber << ",文具类别名称:" << L.elem[i].TypeName << endl;}
}
int main()
{sqList L;Linklist h;CreatTypeList(L, MAX_TYPE); // 创建文具分类顺序表CreatList_R(h);   // 用尾插法建立文具信息链表;int choice;while (1){cout << "文具店货品管理系统" << endl;cout << "**********主菜单**********" << endl;cout << "     (1)文具入库" << endl;cout << "     (2)文具出库" << endl;cout << "     (3)查询文具信息" << endl;cout << "     (4)显示文具信息" << endl;cout << "     (5)添加新文具类别" << endl;cout << "     (6)排序" << endl;cout << "     (7)显示文具类别信息" << endl;cout << "     (0)退出系统" << endl;cout << "请选择(1,2,3,4,5,6,7,0):";cin >> choice;if (choice < 0 || choice > 6)continue;switch (choice){case 1:{int typeNumber, amount;char stockName[10];cout << "请输入文具类别号:";cin >> typeNumber;cout << "请输入文具名称:";cin >> stockName;cout << "请输入文具数量:";cin >> amount;if(AddStock(h, typeNumber, stockName, amount)){cout<<"文具入库成功"<<endl;}break;}case 2:{int typeNumber, amount;char stockName[10];cout << "请输入文具类别号:";cin >> typeNumber;cout << "请输入文具名称:";cin >> stockName;cout << "请输入文具数量:";cin >> amount;if(RemoveStock(h, typeNumber, stockName, amount)){cout<<"出库成功"<<endl;}else{cout<<"出库失败"<<endl;}break;}case 3:{int typeNumber;cout << "请输入文具类别号:";cin >> typeNumber;QueryStock(h, typeNumber);break;}case 4:{DisplayStock(h);break;}case 5:{int typeNumber;char typeName[10];cout << "请输入文具类别号:";cin >> typeNumber;cout << "请输入文具类别名称:";cin >> typeName;AddType(L, typeNumber, typeName);break;}case 6:{SortStock(h);break;}case 7:{DisplayTypeList(L);break;}case 0:{exit(0);break;}default:{break;}}}system("pause");return 0;
}

题目二:单循环链表Josephus问题

一、实验目的

  1. 学会选择合适的数据结构来解决实际问题
  2. 学会如何创建一个单循环链表
  3. 在单循环链表中如何进行查找
  4. 在单循环链表中如何进行删除

二 、实验内容

设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m个的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,…… 如此反复直到所有的人全部出列为止。对于任意给定的n、s和m,求出按出列次序得到的n个人员的序列(要求用链表加以实现)。

三、实验步骤

  1. 创建由n个结点组成的不带头结点的Josephus循环单链表
  2. 找循环链表中的第s个结点
  3. 求第m个应出列的元素删除它

四、实验要求

  1. 绘制流程图描述算法。
  2. 使用“截图加文字方式”描述算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决办法等。

五、实验代码

#include<iostream>
using namespace std;
#include <stdlib.h>typedef struct Node
{int data;struct Node* next;
}Node;void Josephus(int n,int s,int m)
{Node *head = NULL;head = (Node*)malloc(sizeof(Node));if(head==NULL){return;}Node *p=NULL,*a=NULL;head->data=1;head->next=NULL;p=head;for(int i=2;i<=n;i++){a=(Node*)malloc(sizeof(Node)); a->data=i;a->next=NULL;p->next=a;p=a;}p->next=head;p=head;for(int i=1;i<s;i++){p=p->next;}while(p->next!= p){for(int i=1;i<m;i++){a=p;p=p->next;}cout<<p->data<<" ";a->next=p->next;p=p->next;} cout<<p->data<<endl; 
}
int main()
{int n, s, m;cout<<"输入总人数n、第s个人开始报数和报数间隔m:";cin>>n>>s>>m;cout<<"按出列次序得到的人员序列为:";Josephus(n, s, m);return 0;
} 

六、思考题

如何用顺序表解决josephus问题?

代码如下:

#include<iostream>
using namespace std;void Josephus(int n, int s, int m)
{int *arr = new int[n];for (int i = 0; i < n; i++){arr[i] = i + 1;}int count = 0;int index = s - 1;while (count < n - 1){index = (index + m - 1) % (n - count);cout << arr[index] << " ";for (int i = index; i < n - count - 1; i++){arr[i] = arr[i + 1];}count++;}cout << arr[0] << endl;delete[] arr;
}int main()
{int n, s, m;cout << "输入总人数n、第s个人开始报数和报数间隔m:";cin >> n >> s >> m;cout << "按出列次序得到的人员序列为:";Josephus(n, s, m);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用低代码系统的意义与价值主要体现在哪里?

使用低代码系统的意义与价值主要体现在以下几个方面&#xff0c;这些观点基于驰骋低代码设计者的专业洞察和行业经验&#xff1a; 快速原型创建&#xff1a; 低代码平台通过提供图形化界面和预构建的模块&#xff0c;极大地加速了系统原型的创建过程。这意味着企业能够更快地验…

60 关于 SegmentFault 的一些场景 (1)

前言 呵呵 此问题主要是来自于 帖子 月经结贴 -- 《Segmentation Fault in Linux》 这里主要也是 结合了作者的相关 case, 来做的一些 调试分享 当然 很多的情况还是 蛮有意思 本文主要问题如下 1. 访问可执行文件中的 只读数据 2. 访问不存在的虚拟地址 3. 访问内核地址…

嵌入式工程师人生提质的十大成长型思维分享

大家好,作为一名嵌入式开发者,很多时候,需要考虑个人未来的发展,人生旅途复杂多变,时常面临各种各样的挑战。如何在这个复杂多变的社会中稳步向前,不断成长,成为每个人都应该思考的问题。实际上,思维方式的差异决定我们应对挑战的能力与成长的速度。 第一:寻找自我坐…

HNCTF2022 REVERSE

[HNCTF 2022 WEEK2]esy_flower 简单花指令 Nop掉 然后整段u c p然后就反汇编 可能反编译的不太对&#xff0c;&#xff0c;看了别人的wp就是ida反编译的有问题 #include<stdio.h> #include<string.h> int main() {int i,j;char ch[]"c~scvdzKCEoDEZ[^roDICU…

微软远程连接工具:Microsoft Remote Desktop for Mac 中文版

Microsoft Remote Desktop 是一款由微软开发的远程桌面连接软件&#xff0c;它允许用户从远程地点连接到远程计算机或虚拟机&#xff0c;并在远程计算机上使用桌面应用程序和文件。 下载地址&#xff1a;https://www.macz.com/mac/5458.html?idOTI2NjQ5Jl8mMjcuMTg2LjEyNi4yMz…

C++进阶之AVL树+模拟实现

目录 目录 一、AVL树的基本概念 1.1 基本概念 二、AVL树的模拟实现 2.1 AVL树节点的定义 2.2 插入操作 2.3 旋转操作 2.4 具体实现 一、AVL树的基本概念 1.1 基本概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十四)- 微服务(4)

目录 8. http客户端Feign 8.1 feign远程调用 8.2 feign自定义配置 8.3 feign性能优化 8.4 feign最佳实践 8. http客户端Feign 8.1 feign远程调用 RestTemplate存在的问题 &#xff1a; 代码可读性差 参数复杂URL难以维护 Feign是声明式的http客户端 使用步骤 &#xf…

飞书API(11):阿里云MaxCompute分区表入库

一、引入 前面入库阿里云 MaxCompute 的数据都是读取之后直接写入&#xff0c;保留数据最新的状态&#xff0c;如果我要保留历史的状态&#xff0c;怎么办呢&#xff1f;MaxCompute 表有一个分区功能&#xff0c;可以自行定义分区。我们可以使用 MaxCompute 表的分区功能&…

远程自动锁定平面

目录 Ubuntu 系统上 方法一&#xff1a;使用 SSH 重新连接 方法二&#xff1a;解锁当前会话 方法三&#xff1a;通过 SSH 解锁会话 方法四&#xff1a;禁用自动锁屏&#xff08;如果合适&#xff09; windows系统 方法三&#xff1a;修改组策略设置 Ubuntu 系统上 远程…

重生之我要精通JAVA--第七周笔记

文章目录 IO流字符流字符流原理解析flush和close方法 文件拷贝代码文件加密解密修改文件中的数据 缓冲流字节缓冲流字符缓冲流例题 转换流序列化流序列化流/对象操作输出流 反序列化流序列化流/反序列化流的细节汇总打印流字节打印流字符打印流 解压缩流压缩流Commons-io常见方…

网络空间安全数学基础·环

4.1 环与子环 &#xff08;理解&#xff09; 4.2 整环、除环、域 &#xff08;熟练&#xff09; 4.3 环的同态、理想 &#xff08;掌握&#xff09; 4.1 环与子环 定义&#xff1a;设R是一非空集合&#xff0c;在R上定义了加法和乘法两种代数运算&#xff0c; 分别记为ab和a…

java收徒、java面试辅导、java辅导、java就业辅导

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

MMPose-RTMO推理详解及部署实现(下)

目录 前言一、RTMO推理(Python)1. RTMO预测2. RTMO预处理3. RTMO后处理4. RTMO推理 二、RTMO推理(C)1. ONNX导出2. RTMO预处理3. RTMO后处理4. RTMO推理 三、RTMO部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile 3. ONNX导出4. engine生成5. 源码修改6. 运行…

HCP;IDA;ABIDE(孤独症)磁共振数据库下载

ABIDE https://fcon_1000.projects.nitrc.org/indi/abide/abide_II.html 根据研究目的和研究目的选择不同站点的数据—不同站点的数据 HCP-IDE https://ida.loni.usc.edu/project_info.jsp 点击下载-图像集合 选择研究对象 全选-下载

边缘密度分布图 | ggExtra包/aplot拼图/ggpubr包 等的实现方法

概述&#xff1a;aplot 拼图效果好 根据网友探索[1]&#xff0c;总结如下&#xff1a; ggExtra 包的拼图间隙有点大&#xff0c;图例在主图和边缘图之间&#xff0c;除非去掉图例&#xff0c;否则没法看。aplot包的默认拼图间隙很小&#xff0c;比较美观&#xff0c;图例在外…

Cyber Weekly #9

赛博新闻 1、OpenAI&#xff1a;GPTs向全部用户开放&#xff0c;使用GPT-4o OpenAI宣布所有ChatGPT免费用户现在可以在GPT商店中使用GPTs&#xff0c;并且这些GPTs现在使用最新的GPT-4o模型。 2、马斯克 vs. Yann LeCun 这一周&#xff0c;AI圈最热闹的莫过于马斯克和LeCun的…

深入解析智慧互联网医院系统源码:医院小程序开发的架构到实现

本篇文章&#xff0c;小编将深入解析智慧互联网医院系统的源码&#xff0c;重点探讨医院小程序开发的架构和实现&#xff0c;旨在为相关开发人员提供指导和参考。 一、架构设计 智慧互联网医院系统的架构设计是整个开发过程的核心&#xff0c;直接影响到系统的性能、扩展性和维…

ZCU102启动镜像(详细版)

ZCU102启动镜像--详细版本 详细步骤1、安装好Vitis&#xff08;GUI界面&#xff09;、 Vivado、 Petalinux软件然后vivado这边的操作就先结束了 创建Petalinux工程编译镜像打包 详细步骤 B站参考视频链接: link 1、安装好Vitis&#xff08;GUI界面&#xff09;、 Vivado、 Pe…

Nocobase快速上手 - 开发第一个插件

在前面的几篇博文中&#xff0c;记录了在Nocobase中配置collection和界面&#xff0c;这篇文章开始插件的开发。插件可以扩展Nocobase的业务能力&#xff0c;解锁更强大的功能。 环境搭建 创建插件需要配置nocobase的开发环境&#xff0c;笔者采用的是clone 官方代码repo的方…

使用python下载股票数据至sqlite数据库

代码下载地址&#xff1a; https://download.csdn.net/download/weixin_44600457/89389489