数据结构实验报告 精品Word文档下载推荐.docx
- 文档编号:17591309
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:50
- 大小:227.48KB
数据结构实验报告 精品Word文档下载推荐.docx
《数据结构实验报告 精品Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告 精品Word文档下载推荐.docx(50页珍藏版)》请在冰豆网上搜索。
i<
n;
i++)
{
s=newNode<
s->
data=a[i];
code=b[i];
r->
next=s;
r=s;
}
r->
next=first;
}//建立有n个元素的单链表
四.主要算法
(1)顺序表存储时
A、m相同
voidJosephus(inta[],intn,intm)
ints=0;
//length表示表长
cout<
<
setw(3);
for(intlength=n;
length>
=2;
length--)//表示每次减一
{
s=(s+m-1)%length;
cout<
a[s]<
setw(7);
//s为第s个人
for(inti=s+1;
length;
i++)a[i-1]=a[i];
//删除
}
a[0]<
endl;
//最后只剩下一个人
}
B、m不同
voidJosephus(Node<
int>
data[],intn,intm)
ints=0,k;
//k用于保存出圈人的密码
"
个人的编号和密码分别为:
'
\n'
length--)
if(length==n)
s=(s+m-1)%length;
else
s=(s+k-1)%length;
k=data[s].next->
data;
data[s].data<
"
k<
\t'
data[i-1]=data[i];
data[0].data<
data[0].next->
data<
(2)循环单链表存储时
voidJosephus(LinkList<
*d,intm)
*p=d->
first,*pre,*last=d->
first;
intcount;
出队序号为:
while(last->
next!
=d->
first)last=last->
next;
while(p->
=p)
count=m;
if(count==1)
cout<
p->
pre=p;
p=p->
deletepre;
last->
next=p;
}
else
while(--count)
pre=p;
p=p->
pre->
next=p->
deletep;
p=pre->
deletep;
*p,*pre,*last=d->
intcode=m;
p=d->
圈中出队人的编号和密码分别为:
if(code==1)
code<
code=p->
code;
p=last->
while(--code)
deletep;
五.主函数实现
(1)顺序表时
voidmain()
intn,m,a[100];
请输入圈中人的个数n(n<
=100且n>
0)和出圈人的序号m(m>
=0):
cin>
>
n>
m;
while(n>
100||n<
=0||m<
0)
输入有误,请重新输入!
=100)和出圈人的序号m(m>
cin>
出圈人的顺序为:
\n"
for(inti=0;
a[i]=i+1;
第"
i+1<
人"
Josephus(a,n,m);
intn,m;
data[100],code[100];
请输入圈中的总人数n(n<
0)和初始的报数上限m(m>
=0):
输入有误,请重新输入数据!
=100)和初始的报数上限m(m<
=n):
code[i].data=2*(i+1);
code[i].next=NULL;
for(i=0;
data[i].data=i+1;
data[i].next=&
code[i];
Josephus(data,n,m);
(2)单链表时
intm,n,a[100],b[100];
0)和出圈人的编号m(m>
您输入有误,请重新输入数据!
b[i]=m;
LinkList<
data(a,b,n);
Josephus(&
data,m);
inta[100],b[100],m,n;
0)和初始出队数m(m>
0):
=0)
您的输入有误,请按要求输入数据!
b[i]=2*(i+1);
6、运行结果
(1)顺序表实现
(2)单链表实现
2、一元代数多项式求和
1、结点类型PNode.h
structPNode
Tcoef;
Texp;
PNode*next;
2、链表定义LinkList.h
PNode.h"
PNode<
LinkList(Ta[],Tb[],intn);
LinkList<
:
LinkList(Ta[],Tb[],intn)
first=newPNode<
PNode<
s=newPNode<
s->
coef=a[i];
exp=b[i];
r->
r=s;
r->
next=NULL;
3、主函数实现
#include<
iostream.h>
LinkList.h"
*Add(LinkList<
*A,LinkList<
*B)
*pre,*qre,*p,*q,*v;
pre=A->
p=pre->
qre=B->
q=qre->
while(p&
&
q)
if(p->
exp<
q->
exp)
if(p->
exp>
v=q->
next=q;
q->
q=v;
else
p->
coef=p->
coef+q->
coef;
coef==0)
pre->
deletep;
p=pre->
p=p->
qre->
next=q->
deleteq;
q=qre->
if(q)pre->
deleteB->
returnA;
voidSort(LinkList<
*A)//将链表按升序排序
*p,*q,*r,*s;
if(A->
first->
next&
A->
next->
next)
s=A->
q=s->
while(q)
r=A->
p=r->
while(p<
if(p->
=q->
exp){r=p;
else{
q=q->
s->
r->
next=s->
break;
}
if(p==q){s=q;
q=q->
inta1[100],b1[100],a2[100],b2[100],c1[200],c2[200];
intn1,n2;
请输入第一个多项式的项数n1(n1<
=100):
n1;
while(n1>
100)
您输入的项数超出范围,请重新输入!
请输入第二个多项式的项数n2(n2<
n2;
while(n2>
请输入第二个多项式的项数n1(n1<
请分别输入第一个多项式各项的系数和各项对应的指数:
项的系数和指数分别为:
a1[i]>
b1[i];
请分别输入第二个多项式各项的系数和各项对应的指数:
a2[i]>
b2[i];
A(a1,b1,n1),B(a2,b2,n2);
*ADD;
Sort(&
A);
B);
ADD=Add(&
A,&
*x=ADD->
i=0;
while(x->
x=x->
c1[i]=x->
c2[i]=x->
exp;
i++;
第一项和第二项多项式相加后结果多项式的各项的系数和指数分别为:
for(intj=0;
j<
i;
j++)
j+1<
项系数和指数分别为:
"
c1[j]<
c2[j]<
4、运行结果
A(x)=4
+3-7x+5
B(x)=4
+9-8x+6x
A(x)+B(x)=12-15x+4x
+9x
+6x
五、实验心得体会
本次试验使我初步掌握用上机调试线性表的基本方法。
掌握线性表的基本操作,插入,删除,查找,以及线性表
经过本次上机实验,我获得的最大的感受是实验前做好准备工作,准备好实验代码,节约录入的时间,并且在程序录入时要认真,往往一时的马虎得通过较长时间的检查方能找到,要是录入时够认真就可以节约很多,通过数次调试,在运行过程中思考发现具体实现细节,进而能够显示期望的实验结果。
实验二栈和队列:
迷宫问题求解
1、实验目的
2、掌握栈和队列的顺序存储结构;
3、掌握栈和队列的操作特性;
4、掌握基于顺序栈和链队列的基本操作的实现方法。
2、实验内容
1、设计数据结构存储迷宫;
2、设计存储结构保存从入口到出口的通路;
3、设计算法完成迷宫问题的求解;
4、分析算法的时间复杂度。
3、实验实现
1、用栈实现求迷宫从出口到入口的一条路径(不一定是最短路径)
(1)顺序栈结构SeqStack.h
constintStackSize=64;
//10只是示例性的数据,可以根据实际问题具体定义
template<
//定义模板类SeqStack
classSeqStack
public:
SeqStack();
//构造函数,栈的初始化
~SeqStack(){}//析构函数
voidPush(Tx);
//将元素x入栈
TGetTop();
TPop();
//将栈顶元素弹出
intEmpty();
//判断栈是否为空
voidPrint();
//输出栈中元素
private:
Tdata[StackSize];
//存放栈元素的数组
inttop;
//栈顶指针,指示栈顶元素在数组中的下标
SeqStack<
SeqStack()
top=-1;
voidSeqStack<
Push(Tx)
if(top==StackSize-1)throw"
上溢"
top++;
data[top]=x;
TSeqStack<
Pop()
{
Tx;
if(top==-1)throw"
下溢"
x=data[top--];
returnx;
GetTop()
if(top!
=-1)returndata[top];
intSeqStack<
Empty()
if(top==-1)return1;
elsereturn0;
}
Print()
while(top!
=-1)
Ttemp;
temp=Pop();
temp.x<
temp.y<
temp.d<
(2)主函数实现
a、四方向查找
SeqStack.h"
constintN=10;
typedefstruct{
intx,y,d;
}DataType;
structDirectInc{
intdx,dy;
constDirectIncmove[4]={{0,1},{1,0},{0,-1},{-1,0}};
voidmazepath(intmaze[N][N])
DataTypetemp;
intg,h,v,i,j;
SeqStack<
DataType>
S;
//栈(*S)已建立
temp.x=1;
temp.y=1;
temp.d=-1;
//入口位置及方向
maze[1][1]=-1;
S.Push(temp);
while(!
S.Empty())
temp=S.GetTop();
i=temp.x;
j=temp.y;
v=temp.d+1;
if(v==4)S.Pop();
while(v<
4)
g=i+move[v].dx;
h=j+move[v].dy;
if(maze[g][h]==0)
temp.x=g;
temp.y=h;
temp.d=v;
S.Push(temp);
maze[i][j]=-1;
i=g;
j=h;
if(i==N-2&
j==N-2)
{
S.Print();
return;
elsev=0;
else
v++;
if(v==4)S.Pop();
}//endwhile(v<
}//endwhile(!
voidmain(){
intmaze[N][N]={{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}};
从出口到入口的路径为\n(xy代表坐标d代表方向(东0,南1,西2,北3))\nx\ty\td"
mazepath(maze);
运行结果:
b、八方向查找
constDirectIncmove[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
intg,h,v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验报告 精品 数据结构 实验 报告