线性表的顺序存储及解决约瑟夫问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

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<<"参数非法"<

for(int i=0;i

data[i]=a[i];

length=n;

}

int List::Get(int i){

if(i<1&&i>length)

cout<<"查找位置非法"<

else

cout<<"该位置元素值为:"<

}

int List::Locate(int x){

for(int i=0;i

if(data[i]==x)

cout<<"该值元素的位置为:"<

return 0;

}

void List::Insert(int i, int x){

if(length>=MaxSize)

cout<<"上溢"<

if(i<1||i>length+1)

cout<<"位置非法"<

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<<"下溢"<

if(i<1||i>length)

cout<<"位置非法"<

int x=data[i-1];

for(int j=i;j

data[j-1]=data[j];

length--;

cout<

}

void List::PrintList(){

for(int i=0;i

cout<

}

}

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<<"原顺序表为:"<

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<<"插入数据后的顺序表为:"<

c.PrintList();

cout<<":请输入待删元素的位置h:";

cin>>h;

c.Delete(h);

cout<<"删除数据后的顺序表为:"<

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

using namespace std;

const int MaxSize=100;

class List{

public:

List(){length=0;}

相关文档
最新文档