数据结构 实验 1

server/2024/9/19 18:46:30/ 标签: 数据结构, 线性表, c++, c语言, 实验

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

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

问题分析:通过对问题的抽象,文具信息和文具分类信息可以用表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.ppmy.cn/server/46936.html

相关文章

曲面细分技术在AI去衣中的创新应用

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;其在图像处理领域的应用日益广泛。其中&#xff0c;AI去衣技术因其独特的应用场景而备受瞩目。在这一技术的发展过程中&#xff0c;曲面细分技术发挥了至关重要的作用。本文将深入探讨曲面细分技术在AI去衣中的作用及其…

容器是什么,通俗易懂的方式带你了解它!

在当今的软件开发领域&#xff0c;容器已经成为了一个热门话题。作为一名开发者&#xff0c;我经常听到人们谈论容器&#xff0c;那么容器到底是什么呢&#xff1f; 简单来说&#xff0c;容器是一种轻量级的虚拟化技术&#xff0c;它允许我们打包应用程序及其依赖环境&#xff…

Python知识点4---循环语句

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python支持两种循环for和while&#xff0c;但是他们和其他的语言有些…

前端Vue小兔鲜儿电商项目实战Day03

一、Home - 整体结构搭建和分类实现 1. 页面结构 ①按照结构新增5个组件&#xff0c;准备最简单的模板&#xff0c;分别在Home模块的入口组件中引入 src/views/Home/components/ HomeCategory.vue HomeBanner.vue HomeNew.vue HomeHot.vue HomeProduct.vue <script …

jupyter notebook更改位置

1.找到jupyer的配置文件 一般在c盘用户的.jupter文件夹下 2. 用记事本打开这个配置文件&#xff0c;定位到c.NotebookApp.notebook_dir /path_to_your_directory 替换你的位置 3.找到jupyer图标的位置&#xff0c;打开属性 添加要存放的位置在目标文件的末尾&#xff0c;重新…

Web安全:软件开发的安全问题与解决方案

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

创建shell脚本文件自动加头部注释信息

每次创建脚本文件都要加头部注释&#xff0c;这样十分麻烦 &#xff0c;使用如下方法&#xff0c;在每次使用vim创建.sh结尾的脚本文件时&#xff0c;可自动添加自定义头部信息注释。 效果图&#xff1a; 方法如下&#xff1a; 一.所有用户可用&#xff0c;系统级配置 1. 编辑配…

以sqlilabs靶场为例,讲解SQL注入攻击原理【25-31关】

【Less-25】 首先分析源码 发现把 SQL语句中的 or、and 替换成了空格&#xff0c;这就导致无法使用之前的sql注入方式。 解决方案&#xff1a;用 && 代替 and &#xff0c; 用 || 代替 or &#xff0c; 而且&在url中有特殊含义&#xff0c;如果直接使用会有问题&a…

web前端三大主流框架详细介绍

1.Angular Angular是一个由Google开发的用于构建Web应用的开源JavaScript框架。Angular使用TypeScript语言编写&#xff0c;它是一种由Microsoft开发的JavaScript超集&#xff0c;可以提供更丰富的功能和更严格的类型检查。Angular是MVC&#xff08;Model-View-Controller&…

W25Q64CV SPI Flash Memory

SPI简介 SPI是一种同步串行通信接口规范&#xff0c;用于短距离通信&#xff0c;主要应用于嵌入式系统。SPI通信由一个主设备和一个或多个从设备组成&#xff0c;其中主设备生成时钟信号并控制通信的开始和结束。 SPI通信的基本组成 四个基本信号 SCK (Serial Clock) - 时钟…

Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】

Bug&#xff1a;Linux用户拥有r权限但无法打开文件【Linux权限体系】 0 问题描述&解决 问题描述&#xff1a; 通过go编写了一个程序&#xff0c;产生的/var/log/xx日志文件发现普通用户无权限打开 - 查看文件权限发现该文件所有者、所有者组、其他用户均有r权限 - 查看该日…

Linux命令篇(一):文件管理部分

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 1、cat命令常用参…

Chromebook Plus中添加了Gemini?

Chromebook Plus中添加了Gemini&#xff1f; 前言 就在5月29日&#xff0c;谷歌宣布了一项重大更新&#xff0c;将其Gemini人工智能技术集成到Chromebook Plus笔记本电脑中。这项技术此前已应用于谷歌的其他设备。华硕和惠普已经在市场上销售的Chromebook Plus机型&#xff0c;…

OJ1230进制的转换

答案&#xff1a; #include <bits/stdc.h> using namespace std; using lllong long; const int N10; int a[10]; char ch[]{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}; void solve() {int n,m;cin>>n>>m;string str;cin>>str;for(int i0;i<str.size();i)…

飞致云开源社区月度动态报告(2024年5月)

自2023年6月起&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…

GPT-4o:引领人工智能新时代的强大引擎

前言 GPT-4o的推出&#xff0c;让我们再次感受到了人工智能技术的魅力。它不仅在技术上取得了显著突破&#xff0c;还为我们带来了广泛的应用前景。下面&#xff0c;我将从几个方面来谈谈GPT-4o的魅力。 一、技术突破&#xff0c;令人惊叹 1. 多模态处理能力的飞跃&#xff…

十_信号7-信号集

int sigemptyset(sigset_t *set); 清空信号集 int sigfillset(sigset_t *set); 填充满 信号集 int sigaddset(sigset_t *set, int signum); 向信号集中添加信号 int sigdelset(sigset_t *set, int signum); 从型号集中删除信号 int sigismember(const sigset_t *set, int s…

电脑世界的大冒险:用人体比喻让孩子轻松理解电脑20240603

电脑世界的大冒险&#xff1a;用人体比喻让孩子轻松理解电脑 作为一名在IT行业的老程序猿&#xff0c;我见证了电脑技术的飞速发展&#xff0c;也亲身体验了科技给生活带来的翻天覆地的变化。然而&#xff0c;在这个日新月异的数字时代&#xff0c;我意识到&#xff0c;与孩子…

CSRF跨站请求伪造漏洞

CSRF跨站请求伪造漏洞 1.CSRF漏洞概述2.防御CSRF攻击3.CSRF防御绕过CSRF令牌未绑定到用户会话自定义标头令牌绕过绕过Referer检查关键词绕过 4.利用示例使用HTML标签进行GET表单 GET 请求表单POST请求通过 iframe 发送表单 POST 请求Ajax POST 请求 5.CSRF BP 验证方法6.CSRF测…

STM32作业实现(四)光敏传感器

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…