数据结构 实验 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 100

typedef 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Crosslink-NX器件应用连载(11): 图像(数据)远程传输

作者&#xff1a;Hello&#xff0c;Panda 大家下午好&#xff0c;晚上好。这里分享一个Lattice Crosslink-NX器件实现图像或数据&#xff08;卫星数据、雷达数据、ToF传感器数据等&#xff09;远程传输的案例&#xff08;因为所描述的内容颇杂&#xff0c;晒图不好晒&#xff…

HCIP的学习(27)

RSTP—802.1W—快速生成树协议 STP缺陷&#xff1a; 1、收敛速度慢----STP的算法是一种被动的算法&#xff0c;依赖于计时器来进行状态变化 2、链路利用率低​ RSTP向下兼容STP协议。&#xff08;STP不兼容RSTP&#xff09; 改进点1—端口角色 802.1D协议---根端口、指定端口…

[数据集][目标检测]猕猴桃检测数据集VOC+YOLO格式1838张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1838 标注数量(xml文件个数)&#xff1a;1838 标注数量(txt文件个数)&#xff1a;1838 标注…

【Java】Java遍历Map方法合集

本文摘要&#xff1a;Java遍历Map方法合集 &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xff1a;洲与AI。 &#x1f913; 欢迎大家关注&am…

如何进入 -MGMTDB目录

想想这个问题&#xff0c;大家可能觉得很简单吧&#xff0c;先不看答案&#xff0c;你试一试如何进去 1.问题现象&#xff1a; 我直接进入&#xff1a; cd -MGMTDB 直接就报错了&#xff1a; [gridhost03 _mgmtdb]$ cd -MGMTDB -bash: cd: -M: invalid option cd: usage: c…

deepin开机取消挂载windows系统磁盘(Win11+deepinV23RC双系统)

目录 一、需求分析二、实现方法 一、需求分析 机器有两块硬盘&#xff0c;硬盘0装的是Win11,硬盘1装的是deepinV23RC,为避免使用deepin系统时对windows分区误操作&#xff0c;因此需要取消windows分区的挂载。 二、实现方法

解决TrueNas Scale部署immich后人脸识别失败,后台模型下载异常,immich更换支持中文搜索的CLIP大模型

这个问题搞了我几天终于解决了&#xff0c;搜遍网上基本没有详细针对TrueNas Scale部署immich应用后&#xff0c;CLIP模型镜像下载超时导致人脸识别失败&#xff0c;以及更换支持中文识别的CLIP模型的博客。 分析 现象&#xff1a;TrueNas Scale安装immich官方镜像应用后&…

记录一次cnvd事件型证书漏洞挖掘

事件起因是因为要搞毕设了&#xff0c;在为这个苦恼&#xff0c;突然负责毕设的老师说得到cnvd下发的证书结合你的漏洞挖掘的过程是可以当成毕设的&#xff0c;当时又学习了一段时间的web渗透方面的知识&#xff0c;于是踏上了废寝忘食的cnvd证书漏洞挖掘的日子。 前言&#x…

动态规划算法:背包问题

背包问题概述 背包问题 (Knapsack problem) 是⼀种组合优化的 NP完全问题 。 问题可以描述为&#xff1a;给定⼀组物品&#xff0c;每种物品都有⾃⼰的重量和价格&#xff0c;在限定的总重量内&#xff0c;我们如何选择&#xff0c;才能使得物品的总价格最⾼。 根据物品的个…

vector实现后半部分

一.迭代器失效 1.定义 指原迭代器在扩容/缩容/修改后指向无效元素或无效地址处 erase的迭代器失效 2.原因&#xff1a; 1.有的编译器实现erase会缩容拷贝 2.删除最后一个后&#xff0c;其指向无效元素 VS中不允许再次使用erase完的迭代器&#xff0c;为了让编写的代码移植…

32位与64位程序下函数调用的异同——计科学习中缺失的内容

前言 今天&#xff0c;通过一个有趣的案例&#xff0c;从反编译的角度看一下C语言中函数参数是如何传递的。 创建main.c文件&#xff0c;将下面实验代码拷贝到main.c文件中。 # main.c #include <stdio.h>int test(int a, int b, int c, int d, int e, int f, int g, …

浔川python社获得全网博主原力月度排名泸州地区第二名!

今日&#xff0c;浔川python社在查看全网博主原力月度排名泸州地区时&#xff0c;一看就震惊啦&#xff01; 全网博主原力月度排名泸州地区排名榜单 全网博主原力月度排名泸州地区第二名为&#xff1a;浔川python社。 感谢粉丝们的支持&#xff01;浔川python社还会继续努力&a…

ubuntu--Linux使用

Linux使用 Linux 系统简介 linux Linux 就是一个操作系统&#xff0c;与 Windows 和 Mac OS 一样是操作系统 。 操作系统在整个计算机系统中的角色 : Linux 主要是 系统调用 和 内核 那两层。使用的操作系统还包含一些在其上运行的应用程序&#xff0c;比如vim、google、vs…

Glow模型【图解版加代码】

论文&#xff1a;Glow: Generative Flow with Invertible 1x1 Convolutions 代码&#xff1a;pytorch版本&#xff1a;rosinality/glow-pytorch: PyTorch implementation of Glow (github.com) 正版是TensorFlow版本 openai的 参考csdn文章&#xff1a;Glow-pytorch复现gith…

spoon工具的常用基础操作

一些常用转换工具 1、emp表输入->excel表输出 emp表输入&#xff0c;可以进行预览查看数据有没有过来excel表输出 成功执行后&#xff0c;可以到保存的excel位置进行查看。 2、excel输入->表输出 运行转换后可以在oracle进行查看是否有成功创建这个表 3、对部门最高…

十_信号11 - 函数sigsetjmp() 和 siglongjmp()

也就是说&#xff0c;正常情况下&#xff0c;当捕捉到一个信号&#xff0c;并调用该信号的信号处理程序时&#xff0c;被捕捉的信号会被加入到当前进程的信号屏蔽字中&#xff0c;以防止在本次信号处理程序还没有完成的时候&#xff0c;再次触发该信号&#xff0c; 发生重入。 …

罕见!史诗级“大堵船”

新加坡港口的停泊延误时间已延长至7天&#xff0c;积压的集装箱数量达到惊人的450000标准箱&#xff0c;远超新冠疫情暴发时期的数轮高点。业内认为&#xff0c;近期东南亚恶劣的天气情况加剧了该区域港口拥堵。 5月31日&#xff0c;上海航运交易所&#xff08;下称“航交所”…

针对硅基氮化镓高电子迁移率晶体管(GaN-HEMT)的准物理等效电路模型,包含基板中射频漏电流的温度依赖性

来源&#xff1a;Quasi-Physical Equivalent Circuit Model of RF Leakage Current in Substrate Including Temperature Dependence for GaN-HEMT on Si&#xff08;TMTT 23年&#xff09; 摘要 该文章提出了一种针对硅基氮化镓高电子迁移率晶体管&#xff08;GaN-HEMT&…

【算法】理解堆排序

堆排序&#xff0c;无疑与堆这种数据结构有关。在了解堆排序之前&#xff0c;我们需要先了解堆的建立与维护方法。 堆 堆&#xff08;二插堆&#xff09;可以用一种近似的完全二叉树来表示&#xff0c;该二叉树除了叶子结点之外&#xff0c;其余节点均具有两个子女&#xff0c…

HCIP--RIP协议的实验 + RIP笔记

RIP实验&#xff1a; 实验思路&#xff1a; 1.规划IP&#xff0c;配置环回&#xff0c;接口IP 2.在3个路由器上跑通rip; 2.在边界路由器上用rip协议 设置缺省路由&#xff1b; [r3]rip [r3-rip-1]default-route originate 3.在r1、r2的主干接口上设置路由汇总 RIPV2手工汇…