线性表的顺序存储及解决约瑟夫问题
习题二和上机答案

习题二⒉1描述以下四个概念的区别:头指针变量,头指针,头结点,首结点(第一个结点)。
解:头指针变量和头指针是指向链表中第一个结点(头结点或首结点)的指针;在首结点之前附设一个结点称为头结点;首结点是指链表中存储线性表中第一个数据元素的结点。
若单链表中附设头结点,则不管线性表是否为空,头指针均不为空,否则表示空表的链表的头指针为空。
2.2简述线性表的两种存储结构有哪些主要优缺点及各自使用的场合。
解:顺序存储是按索引直接存储数据元素,方便灵活,效率高,但插入、删除操作将引起元素移动,降低了效率;而链式存储的元素存储采用动态分配,利用率高,但须增设表示结点之间有序关系的指针域,存取数据元素不如顺序存储方便,但结点的插入和删除十分简单。
顺序存储适用于线性表中元素数量基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素的情况;而链式存储适用于频繁进行元素动态插入或删除操作的场合。
2.3 在头结点为h的单链表中,把值为b的结点s插入到值为a的结点之前,若不存在a,就把结点s插入到表尾。
Void insert(Lnode *h,int a,int b){Lnode *p,*q,*s;s=(Lnode*)malloc(sizeof(Lnode));s->data=b;p=h->next;while(p->data!=a&&p->next!=NULL){q=p;p=p->next;}if (p->data==a){q->next=s;s->next=p;}else{p->next=s;s->next=NULL;}}2.4 设计一个算法将一个带头结点的单链表A分解成两个带头结点的单链表A和B,使A中含有原链表中序号为奇数的元素,而B中含有原链表中序号为偶数的元素,并且保持元素原有的相对顺序。
Lnode *cf(Lnode *ha){Lnode *p,*q,*s,*hb;int t;p=ha->next;q=ha;t=0;hb=(Lnode*)malloc(sizeof(Lnode));s=hb;while(p->next!=NULL){if (t==0){q=p;p=p->next;t=1;}else{q->next=p->next;p->next=s->next; s->next=p; s=p;p=p->next; t=0;}}s->next=NULL;return (hb);}2.5设线性表中的数据元素是按值非递减有序排列的,试以不同的存储结构,编写一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。
约瑟夫环问题实验报告

约瑟夫问题实验报告背景约瑟夫问题(Josephus Problem)据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
原题:用户输入M,N值,N个人围成一个环,从0号人开始数,数到M,那个人就退出游戏,直到最后一个人求最后一个剩下的人是几号?问题描述设编号为1-n的n(n>0)个人按顺时针方向围成一圈.首先第1个人从1开始顺时针报数.报m的人(m 为正整数).令其出列。
然后再从他的下一个人开始,重新从1顺时针报数,报m的人,再令其出列。
如此下去,直到圈中所有人出列为止。
求出列编号序列。
一.需求分析:(1)基本要求需要基于线性表的基本操作来实现约瑟夫问题需要利用循环链表来实现线性表(2)输入输出格式输入格式:n,m(n,m均为正整数,)输出格式1:在字符界面上输出这n个数的输出序列(3)测试用例(举例)输入:8,4输出:4 8 5 2 1 3 7 6二.概要设计(1)抽象数据类型:数据对象:n个整数数据关系:除第一个和最后一个n外,其余每个整数都有两个元素与该元素相邻。
基本操作:查找,初始化,删除,创建链表循环链表的存储结构:(2).算法的基本思想循环链表基本思想:先把n个整数存入循环链表中,设置第m个数出列,从第一个开始查找,找到第m个时,输出第m个数,并删掉第m个节点,再从下一个数开始查找,重复上一步骤,直到链表为空,结束。
(3).程序的流程程序由三个模块组成:1.输入模块:完成两个正整数的输入,存入变量n和m中2.处理模块:找到第m个数3.输出模块:按找到的顺序把n个数输出到屏幕上三.详细设计首先,设计实现约瑟夫环问题的存储结构。
约瑟夫问题与循环链表解决环状数据结构的应用问题

约瑟夫问题与循环链表解决环状数据结构的应用问题约瑟夫问题是一个经典的数学问题,涉及到环状数据结构的应用。
在这个问题中,有n个人围成一圈,从第一个人开始依次报数,每报到第m个人就出列,直到剩下最后一个人。
本文将介绍约瑟夫问题的背景和解决方法,并探讨循环链表在解决环状数据结构问题中的应用。
一、约瑟夫问题的背景约瑟夫问题最早可追溯到两千多年前。
根据传说,犹太历史学家弗拉维奥·约瑟夫斯(Flavius Josephus)当时被罗马军队围困在一个洞穴中,他和其他39个犹太人决定宁愿自杀也不被俘。
他们决定站成一个圆圈,从第一个人开始,数到第三个人就将他杀死,直到最后一个人留下来。
通过解决这个例子中的问题,人们发现了一种递推模式,即每次被杀的人索引号是前一个被杀人索引号加上一个特定数(m)对人数(n)取余的结果。
二、求解约瑟夫问题1. 暴力法最简单的解法是通过一个数组,将每个人标记为存活或死亡。
然后从第一个人开始,按照指定的m值遍历循环,找到下一个存活的人,直到只剩下最后一个人。
这种方法的问题在于时间复杂度较高,特别是当人数和m值较大时,算法运行效率低下。
2. 循环链表循环链表是解决约瑟夫问题的一种有效数据结构。
在循环链表中,每个节点都包含一个指向下一个节点的指针,最后一个节点指向第一个节点,形成一个闭环。
通过使用循环链表,我们可以轻松地实现约瑟夫问题的求解。
首先,我们将n个人作为节点插入到循环链表中,并将最后一个节点指向第一个节点。
然后,我们从第一个人开始依次报数,每报到第m个人,就将该节点从链表中移除。
此时,链表的结构会自动调整,继续报数直到只剩下最后一个人。
这种方法只需要遍历一次链表,因此时间复杂度为O(n)。
相比暴力法,它的运行效率更高。
三、循环链表解决环状数据结构的应用问题除了约瑟夫问题,循环链表还可以应用于其他环状数据结构的解决方案中。
1. 环形队列环形队列是计算机科学中常用的一种数据结构,它可以实现缓冲区的循环利用。
实验一:约瑟夫问题

实验一:约瑟夫问题问题描述:用数组和链表存储方式实现约瑟夫问题。
约瑟夫问题:n个人围成一个圆圈,首先第1个人从1开始一个人一个人顺时针报数,报到第m个人,令其出列。
然后再从下一个人开始,从1顺时针报数,报到第m个人,再令其出列,…,如此下去,直到圆圈中只剩一个人为止。
此人即为优胜者。
基本要求:用顺序存储和链式存储方式实现。
试验报告内容:1.问题描述:设有n个人围坐在圆桌周围,现从某个位置m(1≤m≤n)上的人开始报数,报数到k 的人就站出来。
下一个人,即原来的第k+1个位置上的人,又从1开始报数,再报数到k的人站出来。
依此重复下去,直到全部的人都站出来为止。
2. 算法描述:可以先建一个单向循环链表;而整个“约瑟夫环”问题的过程,最终是把这个链表删空为止。
但在删时不能顺着删,而是按该问题的方案来删。
3.源程序#include <stdio.h>#include <stdlib.h>#define MAX_NODE_NUM 100#define TRUE 1U#define FALSE 0Utypedef struct NodeType{int id; /* 编号 */int cipher; /* 密码 */struct NodeType *next;} NodeType;/* 创建单向循环链表 */static void CreaList(NodeType **, const int);/* 运行 "约瑟夫环 "问题 */static void StatGame(NodeType **, int);/* 打印循环链表 */static void PrntList(const NodeType *);/* 得到一个结点 */static NodeType *GetNode(const int, const int);/* 测试链表是否为空, 空为TRUE,非空为FALSE */static unsigned EmptyList(const NodeType *);int main(void){int n, m;NodeType *pHead = NULL;while (1){printf( "请输入人数n(最多%d个): ", MAX_NODE_NUM); scanf( "%d ", &n);printf( "和初始密码m: ");scanf( "%d ", &m);if (n > MAX_NODE_NUM){printf( "人数太多,请重新输入!\n ");continue;}elsebreak;}CreaList(&pHead, n);printf( "\n------------ 循环链表原始打印 -------------\n "); PrntList(pHead);printf( "\n-------------- 出队情况打印 ---------------\n "); StatGame(&pHead, m);printf( "\n\ "约瑟夫环\ "问题完成!\n ");return 0;}static void CreaList(NodeType **ppHead, const int n){int i, iCipher;NodeType *pNew, *pCur;for (i = 1; i <= n; i++){printf( "输入第%d个人的密码: ", i);scanf( "%d ", &iCipher);pNew = GetNode(i, iCipher);if (*ppHead == NULL){*ppHead = pCur = pNew;pCur-> next = *ppHead;}else{pNew-> next = pCur-> next;pCur-> next = pNew;pCur = pNew;}}printf( "完成单向循环链表的创建!\n ");}static void StatGame(NodeType **ppHead, int iCipher){int iCounter, iFlag = 1;NodeType *pPrv, *pCur, *pDel;pPrv = pCur = *ppHead;/* 将pPrv初始为指向尾结点,为删除作好准备 */while (pPrv-> next != *ppHead)pPrv = pPrv-> next;while (iFlag) /* 开始搞了! */{/* 这里是记数,无非是移动iCipher-1趟指针! */for (iCounter = 1; iCounter < iCipher; iCounter++) {pPrv = pCur;pCur = pCur-> next;}if (pPrv == pCur) /* 是否为最后一个结点了 */iFlag = 0;pDel = pCur; /* 删除pCur指向的结点,即有人出列 */pPrv-> next = pCur-> next;pCur = pCur-> next;iCipher = pDel-> cipher;printf( "第%d个人出列, 密码: %d\n ",pDel-> id, /* 这个编号标识出列的顺序 */pDel-> cipher);free(pDel);}*ppHead = NULL; /* 没人了!为了安全就给个空值 */}static void PrntList(const NodeType *pHead){const NodeType *pCur = pHead;if (EmptyList(pHead))return;do{printf( "第%d个人, 密码: %d\n ", pCur-> id,pCur-> cipher); pCur = pCur-> next;} while (pCur != pHead);}static NodeType *GetNode(const int iId, const int iCipher){NodeType *pNew;pNew = (NodeType *)malloc(sizeof(NodeType));if (!pNew){printf( "Error, the memory is not enough!\n ");exit(-1);}pNew-> id = iId;pNew-> cipher = iCipher;pNew-> next = NULL;return pNew;}static unsigned EmptyList(const NodeType *pHead){if (!pHead){printf( "The list is empty!\n ");return TRUE;}return FALSE;}4.实验测试数据(要求有多组):第一组测试结果人数n为7, 初始密码m为20第1个人, 密码: 3第2个人, 密码: 1第3个人, 密码: 7第4个人, 密码: 2第5个人, 密码: 4第6个人, 密码: 8第7个人, 密码: 4-------------- 出队情况打印 ---------------第6个人出列, 密码: 8第1个人出列, 密码: 3第4个人出列, 密码: 2第7个人出列, 密码: 4第2个人出列, 密码: 1第3个人出列, 密码: 7第5个人出列, 密码: 4第二组测试结果人数n为8, 初始密码m为15第1个人, 密码: 5第2个人, 密码: 4第3个人, 密码: 3第4个人, 密码: 2第5个人, 密码: 9第6个人, 密码: 1第7个人, 密码: 7第8个人, 密码: 8-------------- 出队情况打印 ---------------第7个人出列, 密码: 7第6个人出列, 密码: 1第8个人出列, 密码: 8第3个人出列, 密码: 3第1个人出列, 密码: 5第4个人出列, 密码: 2第2个人出列, 密码: 4第5个人出列, 密码: 95.总结:1. 通过本次上机实践,对链表存储结构有了更深的理解和把握.2. 通过本次上机实践,应用链表的知识解决和分析问题的能力有了新的提高.3. 通过上机实践,掌握了用高级语言实现算法的基本步骤和方法.(最前面加班级、学号、姓名)。
约瑟夫问题——线性表部分.数据结构实验报告

2010级数据结构实验报告实验名称:实验一——线性表(约瑟夫问题)学生姓名:在这我就不写了班级:**班内序号:**学号:**日期:2010年11月4日1.实验要求一、实验目的通过实现约瑟夫问题,掌握如下内容:1、熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法;2、学习指针、模板类、异常处理的使用;3、掌握线性表的操作实现方法;4、培养使用线性表解决实际问题的能力。
二、实验内容利用循环链表实现约瑟夫问题的求解。
约瑟夫问题如下:有n个人(n>=1)围坐在一个圆桌周围,把这n个人依次编号为1,…,n。
从编号是1的人开始报数,顺时针数到m的那个人出列,他的下一个然后从出列的下一个人重新开始报数,数到第m个人又出列,…,如此反复直到所有的人全部出列。
请问最后一个出列的人的编号。
2. 程序分析对于这个程序来说,首先要确定构造链表时所用的插入方法。
当数到m时一个人就出列,也即删除这个节点,同时建立这个节点的前节点与后节点的联系。
由于是循环计数,所以才采用循环列表这个线性表方式。
在这个程序中解决了存储问题后,之后最大的难点就是关于出列节点的逻辑判断。
由于我插入元素时是将rear指针中也存入了元素值,又增加了一个front指针,实际上是front 指针始终存在而rear指针有可能消除。
这样遇到的问题就是,假设p本身就是rear指针,那当移到下一位时就应该移动两位来跳过front这一个空节点。
这个是程序实现中容易发生逻辑错误的地方。
2.1 存储结构本实验中所用的存储结构为单链表。
以下即为单链表的存储结构示意图:front(2)非空单循环链表2.2 关键算法分析1、关键算法:(1)、插入:在把元素插入到循环链表中时,由于是采用的头插法,所以我保留了front头结点。
在每加入一个节点时,都会直接连接在front后面,从而保证一开始就赋值的rear尾节点不用修改。
伪代码阐释如下:1)、在堆中建立新节点:Node<T> *s=new Node<T>;2)、将a[i]写入到新节点的数据域:s->data=a[i];3)、修改新节点的指针域:s->next=front->next;4)、修改头结点的指针域,将新节点加入到链表中:front->next=s;时间复杂度为:1;(2)、删除:首先通过p指针查找到所要删除的节点的前一个节点,继而通过q=p->next简单地删除掉。
数据结构实验一 约瑟夫环问题实验报告电子版

for(i = 1;i<length;i++){
tmp = (Node *)malloc(sizeof(Node));
tmp->number = num[i];
tmp->pass = pas[i];
pri->next = tmp;
pri = tmp;
pri->next = head;
for(i=0;i<time;i++){ //找到要删除的结点
tmp = tmp->next;
}
printf("%d ",tmp->number);
timeห้องสมุดไป่ตู้= tmp->pass - 1;
deleteFromList(&head,tmp);//删除结点
tmp = tmp->next;//从下一个结点又开始计算
initList(head);
createFromTail(head,num,pas,sizeof(num)/sizeof(num[0]));
p = head;
printf("\n约瑟夫计数前,每个数和他的密码:\n");
for(i = 0;i<sizeof(num)/sizeof(num[0]);i++){
}
}
// 从链表中删除
void deleteFromList(List *head,Node *tmp)
{
Node *tmp1;
Node *tmp2;
tmp1 = *head;
tmp2 = tmp1;
//如果链表剩了一个元素
工作报告之约瑟夫环实验报告总结

约瑟夫环实验报告总结【篇一:约瑟夫环实验报告】实验报告课程名称:数据结构实验名称:顺序表和链表的应用实验编号:实验一指导教师:一、实验目的(1)掌握线性表的基本操作(插入、删除、查找)以及线性表合并等运算在顺序存储结构、链式存储结构上的实现。
重点掌握链式存储结构实现的各种操作。
(2)掌握线性表的链式存储结构的应用。
二、实验内容与实验步骤(1)实验内容:实现约瑟夫环,约瑟夫环(joseph)问题的一种描述是:编号为1、2、3……n的n个人按照顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按照顺时针的方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
设计一个程序求出出列顺序。
(2)抽象数据类型和设计的函数描述,说明解决设想。
首先定义一个链表,用其中的data项存储每个人的编号,用password项存储每个人所持有的密码,并且声明一个指针。
之后使用creatlist_cl函数来创建一个循环链表,在其中的data和password中存入编号和密码,最后使最后一个节点的next指向l,使其能够形成循环队列。
定义了函数display来显示链表当中的内容,以确定存储的数据没有错误。
定义了函数delete_l来实现约瑟夫环中依次删除的功能,依次比较,如果某个人所持的密码和m值相等,则删除这个结点,并且输出此时该结点的编号和密码,实现出列的功能。
(3)简短明确地写出实验所采用的存储结构,并加以说明。
该实验我主要采用的是线性表的链式存储结构,首先定义了链表的结构,其中包括data项和password项,分别存储每个人的编号和所持密码,还声明了指向下一个结点的指针,该指针可以连接各个结点,并且将最后一个结点的指针指向第一个结点使之成为一个循环链表。
三、实验环境操作系统:windows 7调试软件名称:vc++版本号:6.0上机地点:综合楼311四、实验过程与分析(1)主要的函数或操作内部的主要算法,分析这个算法的时、空复杂度,并说明设计的巧班级:学号:姓名:组号:实验成绩:批阅教师签字:实验日期:实验时间:妙之处。
数据结构Java版第二章习题

(按照自己的情况选作部分习题,不要抄袭)第二章习题顺序存储线性表一判断题1.线性表的逻辑顺序与存储顺序总是一致的。
×2.顺序存储的线性表可以按序号随机存取。
√3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
×4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
√5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
×6.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
√二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( A ) 。
(A) 一个有限序列,可以为空; (B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空; (D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。
插入一个元素时平均要移动表中的(A)个元素。
(A) n/2 (B) n+1/2 (C) n -1/2 (D) n三填空题1.在顺序表中做插入操作时首先检查___表是否满了______________。
四算法设计题1.设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。
试写一算法,将x 插入到线性表的适当位置上,以保持线性表的有序性。
并且分析算法的时间复杂度。
2.已知一顺序表A,其元素值非递减有序排列,编写一个函数删除顺序表中多余的值相同的元素。
3.编写一个函数,从一给定的顺序表A中删除值在x~y(x<=y)之间的所有元素,要求以较高的效率来实现。
提示:可以先将顺序表中所有值在x~y之间的元素置成一个特殊的值,并不立即删除它们,然后从最后向前依次扫描,发现具有特殊值的元素后,移动其后面的元素将其删除掉。
4.线性表中有n个元素,每个元素是一个字符,现存于向量R[n]中,试写一算法,使R 中的字符按字母字符、数字字符和其它字符的顺序排列。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线性表的顺序存储
一、实验目的
1.掌握线性表的顺序存储结构。
2.能熟练地利用顺序存储结构实现线性表的基本操作。
3.能熟练地掌握顺序存储结构中算法的实现。
二、实验内容
1.建立含有若干个元素的顺序表,并将结果在屏幕上输出。
2.对刚建立的顺序表实现插入、删除、修改、查找,并将结果在屏幕上输出。
3.解决约瑟夫问题:假设有n个人按1、2、3、…、n的顺序围成一圈,现在,从第s 个人开始按1、2、3、…、m的顺序报数,数到m的人出圈,接着从出圈的下一个人开始重复此过程,直到所有人出圈为止。
试用顺序表解决这个问题。
三、算法描述
1.第1题、第2题的算法提示
对第1题,先定义顺序表的数据类型,然后以1~n的序号建立顺序表,将输出结果单独定义成一个函数,以便后面反复使用它。
对第2题,为操作方便,将插入、删除、修改、查找等操作都定义成单独的子函数形式。
为查看这些操作的效果,可以在调用前后分别输出表的结果。
2.第3题的算法提示
对于第3题,可以将n个人的编号存入一个一维数组中,表的长度就是人数n,因此,就可以用一维数组来代替顺序表。
算法的思想是:先求出出圈人的编号,用一个临时单元保存它,然后从出圈人的后一个开始,直到最后一个,都按顺序向前移动一个位置,再将临时单元中的出圈人编号存入最后。
当这个重复步骤完成后,数组中存放的是出圈人的逆序列。
本题中,围圈的人数n、出圈的报数号m、开始报数的位置s在程序中预先给定为10、3、2。
当然,也可以从键盘临时输入。
四、源程序
第1、2题的源程序及程序清单
#include<iostream>
using namespace std;
const int MaxSize=100;
class List{
public:
List(){length=0;} // 建立一个空表
List(int a[], int n); //建立一个长度为n的顺序表
~List(){}
int Length(){return length;} //求线性表的长度
int Get(int i); //按位查找
int Locate(int x); //按值查找
void Insert(int i, int x); //插入操作
void Delete(int i); //删除操作
void PrintList(); //输出结果private:
int data[MaxSize];
int length;
};
List::List(int a[],int n){
if(n>MaxSize)
cout<<"参数非法"<<endl;
for(int i=0;i<n;i++)
data[i]=a[i];
length=n;
}
int List::Get(int i){
if(i<1&&i>length)
cout<<"查找位置非法"<<endl;
else
cout<<"该位置元素值为:"<<data[i-1]<<endl; return 0;
}
int List::Locate(int x){
for(int i=0;i<length;i++)
if(data[i]==x)
cout<<"该值元素的位置为:"<<i+1<<endl;
return 0;
}
void List::Insert(int i, int x){
if(length>=MaxSize)
cout<<"上溢"<<endl;
if(i<1||i>length+1)
cout<<"位置非法"<<endl;
for(int j=length;j>=i;j--)
data[j]=data[j-1];
data[i-1]=x;
length++;
}
void List::Delete(int i){
if(length==0)
cout<<"下溢"<<endl;
if(i<1||i>length)
cout<<"位置非法"<<endl;
int x=data[i-1];
for(int j=i;j<length;j++)
data[j-1]=data[j];
length--;
cout<<x<<endl;
}
void List::PrintList(){
for(int i=0;i<length;i++){
cout<<data[i]<<endl;
}
}
int main(){
int b[10]={0,1,2,3,4,5,6,7,8,9}; List c(b,10);
int d,e,f,g,h;
cout<<"原顺序表为:"<<endl;
c.PrintList();
cout<<"请输入要查找的位置:"; cin>>d;
c.Get(d);
cout<<"请输入要查找的元素值:"; cin>>e;
c.Locate(e);
cout<<"请输入要插入的位置f和元素值g:";
cin>>f>>g;
c.Insert(f,g);
cout<<"插入数据后的顺序表为:"<<endl;
c.PrintList();
cout<<":请输入待删元素的位置h:";
cin>>h;
c.Delete(h);
cout<<"删除数据后的顺序表为:"<<endl;
c.PrintList();
return 0;
}
程序运行结果:
原顺序表为:0 1 2 3 4 5 6 7 8 9
请输入要查找的位置:3
该位置的元素值为:2
请输入要查找的元素值:6
该元素的位置为:7
请输入要插入的位置f和元素值g:5 7
插入数据后的顺序表为:0 1 2 3 7 4 5 6 7 8 9 请输入待删元素的位置h:6
删除数据后的顺序表为:0 1 2 3 7 5 6 7 8 9
第三题的源程序及程序清单
#include <iostream>
using namespace std;
const int MaxSize=100;
class List{
public:
List(){length=0;}
List(int a[], int n);
~List(){}
int get(int i);
int Length(){return length;}
public:
int data[MaxSize];
int length;
};
//构造函数
List::List(int a[], int n){
if(n>MaxSize)
cout<<"参数非法"<<endl;
for(int i=0;i<n;i++)
data[i]=a[i];
length=n;
}
//查找待出圈的编码
int List::get(int i){
int x=data[i-1];
for(int j=i;j<length;j++)
data[j-1]=data[j];
length--;
return x;
}
int main(){
int a[10]={1,2,3,4,5,6,7,8,9,10};
int b[10];
List L(a,10);
int s, m, n;
cout<<"请输入开始报数的编码:";
cin>>s;
cout<<"请输入待出圈报数的编码:";
cin>>m;
//实现约瑟夫循环
for(int i=0;i<10;i++){
n=s+m;
if(L.Length()>=n){
b[i]=L.get(n);
}
else{
n=n%L.Length();
b[i]=L.get(n);
}
s=n;
}
//输出出圈顺序
cout<<"出圈的顺序为:"<<endl;
for(int k=0;k<10;k++)
cout<<b[k]<<endl;
return 0;
}
程序运行结果:
请输入开始报数的编码:2
请输入待出圈报数的编码:7
出圈的顺序为:
8 5 3 2 4 7 1 6 9 10。