08级实验2-05

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

q->next=p->next; //删除出圈位置

delete p;

p=q->next; //从出圈后面重新报数

}

cout <data<

}

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)

{

相关文档
最新文档