约瑟夫(Josephu)环C++课程设计数据结构.doc
文本预览下载声明
目录
1 前言 1
1.1背景和意义 1
1.2设计的原理、方法和主要内容 1
2 正文 1
2.1设计的目的和意义 1
2.2目标与总体方案 2
2.3设计方法和内容 2
2.3.1Josphu链表的实现 2
2.3.2设计程序 3
2.4设计创新和关键技术 8
2.4.1设计创新 8
2.4.2关键技术 8
2.5结论 8
3 致谢 9
参考文献 9
附录A 源程序的清单 9
前言
1.1背景和意义
数据是计算机化的信息,它是计算机可以直接处理的最基本和最重要的对象。无论是进行科学计算或数据处理、过程控制以及对文件的存储和检索及数据库技术应用等,都是对数据进行加工处理的过程。因此,要设计出一个结构好效率高的程序,必须研究数据的特性及数据间的相互关系及其对应的存储表示,并利用这些特性putin()函数。JosephuLink()函数能构造一个空链表而putin()函数则往其中放入初始值。
template class T
JosephuLinkT::JosephuLink() //利用头插法定义构造函数
{
head=new NodeT;
}
template class T
void JosephuLinkT::putin()
{
int i;
cinn;
if(n1)
cout输入参数错误!endl;
head-data=1;
tail=head;
for(i=2;i=n;i++)
{
p=new NodeT;
p-data=i;
tail-next=p;
tail=p;
}
cout构建的Josephu链表为:endl;
tail-next=head;
p=head;
for(i=1;i=n;i++)
{
coutp-data ;
p=p-next;
}
coutendl;
}
如图2-3所示:
图2-3 程序图
(2).插入操作
插入操作较为简单只是对以前链表的该操作做了一些简单的修改就能运用于该程序,插入操作用的是Insert()函数。
template class T
bool JosephuLinkT::Insert() //插入
{
int loc;
T x;
cout输入要插入位子:;
cinloc;
cout请输入要插入的数:;
cinx;
if(loc1) //判断位置是否合法
{
cout输入参数错误,插入失败!endl;
return false;
}
NodeT*p=head-next;
for(int i=1;iloc-1;i++)
p=p-next;
NodeT*m=new NodeT;
m-data=x;
if(loc-1!=0)
{
m-next=p-next;
p-next=m;
}
else
{
m-next=head-next;
head-next=m;
}
cout新的数列为:;
n++;
return true;
}
(3).删除操作
同插入操作一样删除操作也是利用的以前对链表的操作加以简单改编而成,在本程序中删除操作为Delete函数template class T
bool JosephuLinkT::Delete() //删除
{
int loc;
T x;
cout请输入要删除的位子:;
cinloc;
if(loc1||head==NULL) //判断位置是否合法
return false;
NodeT*p=head;
if(loc==1)
head=head-next;
else
{
NodeT*q=head;
for(int i=0;iloc-1;i++)
q=q-next;
p=q-next;
q-next=p-next;
}
x=p-data;
delete p;
n--;
return true;
}
(4).Josephu操作
Josephu操作为本程序的重点,在本程序中我是利用了一个Josephu函数来解决该问题的,该函数是通过不断的循环、淘汰、再循环、再淘汰直到将Josephu链表中的所有元素被删除。函数如下:
template class T
int JosephuLinkT:: Josephu()
{
int m, k;
int i;
cout请输入执行中的每隔几位数淘汰一个元素:endl;
cinm;
cout请输入从第几个数开始执行:endl;
cink;
p=head;
for(i=1;ik;i++)
p=
显示全部