08级实验2-05
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
一、实验目的
1、掌握线性表的链式存储结构;
2、熟练地利用存储结构实现线性表的基本操作;
3、能熟练地掌握链式存储结构中的算法的实现。
二、实验内容
1、实现约瑟夫问题,设有n个人按1、
2、
3、……、那的顺序围城一圈,先从第s个人开始按1、2、3、……、m的顺序表报数,数到m的人出圈,接着从下一个人开始重复此过程,直到所有人出圈为止。试用循环链表解决这问题。
2、试设计一个多元多项式的加法运算。
三、实验算法与分析
程序1
首先将n个人的信息建立成一个单循环链表,链表中的每个结点信息就是每个人的的编号(1~n),然后利用循环找到出圈人位置的结点,输出给结点的信息,再在链表中删除该结点,接着从删除的结点的后面重复循环此步骤,直到链表中剩下一个结点时候停止循环,再把链表中的最后一个结点输出。
(1)输入n,s,m;
(2)找到开始报数的位置p,并找到p的前驱;
(3)判断p—>next!=p是否为真,若为真则转(4),否则终止程序,并输出p—>data;
(4)找到出圈的位置p及前驱q,输出出圈位置,删除出圈位置,从出圈位置后开始报数,转(3)。
程序2
一元多项式的相加可以看成相同指数项的系数相加,但此操作是用用链表来实现的,有A=A+B(A、B看成两个链表),相加的结果有3种可能:1、相加的结果不为0,B的结果直接接到A中即可;2、相加的结果为0,则要从A链表中删除此结点;3、原来A某项为0,执行A=A+B后不为0,则必须在A链表中插入一个结点。因此,该算法的步骤为:首先写一个表示多项式的子函数(单链表),然后iu,写一个实现多项式相加的子函数(将B链表加到A链表中),最后,在主函数中两次调用建立多项式的算法,分别生A链表和B链表,最后调用相加子函数。为了能查看相加前。相加后的效果,可以再写个输出多项式的子函数(1)输入多项式A的系数和指数,输入多项式B的系数和指数;
(2)判断A不为空,并且B也不为空为真,则转(3),否则,终止循环;
(3)判断A->exp与B->exp的关系,如大于则转(4),小于则转(5),等于则转(6);
(4)将B的结点插入A中,并将B-exp指向下一位,并转(3);
(5)将A->exp指向下一位,并转(3);
(6)判断A->data+B->data==0,若为真,则转(7),否则,转(8);
(7)在A中删除该结点,并A->exp和B->exp指向下一位,转(3);
(8)在将A->data=A->data+B->data,并A->exp和B->exp指向下一位,转(3);
四、可执行程序及注释
程序1:
/*算法的实现*/
#include
class link{
public:
int data;
link *next;
};
class linklist{
protected:
int n,m,s;
public:
//建立含有n个结点的循环链表
link *creat()
{
link *p,*s,*r;
p=r=new link;
for(int j=1;j<=n;j++)
{
s=new link;
s->data=j;
r->next=s;
r=s;
}
r->next=p->next;
return p;
}
//实现约瑟夫问题
void josephuslink(link *h)
{
link *p,*q;
p=h->next;
for(int i=1;i<=s-1;i++)
p=p->next;//找到开始报数的位置p
q=p->next;
while(q->next!=p)
q=q->next;//找到p的前驱
while(p->next!=p)
{
for(i=1;i { q=p; p=p->next; } cout< q->next=p->next; //删除出圈位置 delete p; p=q->next; //从出圈后面重新报数 } cout < } linklist (int x,int y,int z) //定义构造函数 {n=x;m=y;s=z;} };//类定义结束 void main() { link *head; int n,s,m; cout<<"请输入围圈人数、报数的开始位置、报数的上限"; cin>>n>>s>>m; linklist a(n,m,s); head=a.creat(); a.josephuslink(head); } 程序2: //算法的实现 #include class mploy{ protected: int coef; //多项式的系数 int exp;; //多项式的指数 mploy *next; //下一个元素的地址 public: mploy *creat() //建立多项式链表 { mploy *p,*r,*s; p=r=new mploy; //申请头结点 int x,y; cout<<"输入多项式的系数和指数(系数为0结束,指数从小到大)"; cin>>x>>y; while(x) {