deletep;
}
B、m不同
voidJosephus(LinkList*d,intm)
{
Node*p,*pre,*last=d->first;
intcode=m;
p=d->first;
cout<<"圈中出队人的编号和密码分别为:
"<<'\n';
while(last->next!
=d->first)last=last->next;
while(p->next!
=p)
{
if(code==1)
{
cout<data<<","<code<<'\t';
last->next=p->next;
code=p->code;
deletep;
p=last->next;
}
else
{
while(--code)
{
pre=p;
p=p->next;
}
cout<data<<","<code<<'\t';
code=p->code;
pre->next=p->next;
deletep;
p=pre->next;
}
}
cout<data<<","<code<deletep;
}
五.主函数实现
(1)顺序表时
A、m相同
voidmain()
{
intn,m,a[100];
cout<<"请输入圈中人的个数n(n<=100且n>0)和出圈人的序号m(m>=0):
"<<'\n';
cin>>n>>m;
while(n>100||n<=0||m<0)
{
cout<<"输入有误,请重新输入!
"<<'\n';
cout<<"请输入圈中人的个数n(n<=100)和出圈人的序号m(m>=0):
"<<'\n';
cin>>n>>m;
}
cout<<"出圈人的顺序为:
\n";
for(inti=0;i{
a[i]=i+1;
cout<<"第"<
}
cout<Josephus(a,n,m);
}
B、m不同
voidmain()
{
intn,m;
Nodedata[100],code[100];
cout<<"请输入圈中的总人数n(n<=100且n>0)和初始的报数上限m(m>=0):
"<<'\n';
cin>>n>>m;
while(n>100||n<=0||m<0)
{
cout<<"输入有误,请重新输入数据!
"<<'\n';
cout<<"请输入圈中的总人数n(n<=100)和初始的报数上限m(m<=n):
"<<'\n';
cin>>n>>m;
}
for(inti=0;i{
code[i].data=2*(i+1);
code[i].next=NULL;
}
for(i=0;i{
data[i].data=i+1;
data[i].next=&code[i];
}
Josephus(data,n,m);
}
(2)单链表时
A、m相同
voidmain()
{
intm,n,a[100],b[100];
cout<<"请输入圈中的总人数n(n<=100且n>0)和出圈人的编号m(m>=0):
"<<'\n';
cin>>n>>m;
while(n>100||n<=0||m<0)
{
cout<<"您输入有误,请重新输入数据!
"<<'\n';
cout<<"请输入圈中的总人数n(n<=100且n>0)和出圈人的编号m(m>=0):
"<<'\n';
cin>>n>>m;
}
for(inti=0;i{
a[i]=i+1;
b[i]=m;
}
LinkListdata(a,b,n);
Josephus(&data,m);
}
B、m不同
voidmain()
{
inta[100],b[100],m,n;
cout<<"请输入圈中的总人数n(n<=100且n>0)和初始出队数m(m>0):
"<<'\n';
cin>>n>>m;
while(n>100||n<=0||m<=0)
{
cout<<"您的输入有误,请按要求输入数据!
"<<'\n';
cout<<"请输入圈中的总人数n(n<=100且n>0)和初始出队数m(m>0):
"<<'\n';
cin>>n>>m;
}
for(inti=0;i{
a[i]=i+1;
b[i]=2*(i+1);
}
LinkListdata(a,b,n);
Josephus(&data,m);
}
6、运行结果
(1)顺序表实现
A、m相同
B、m不同
(2)单链表实现
A、m相同
B、m不同
2、一元代数多项式求和
1、结点类型PNode.h
template
structPNode
{
Tcoef;
Texp;
PNode*next;
};
2、链表定义LinkList.h
#include"PNode.h"
template
classLinkList
{
public:
PNode*first;
LinkList(Ta[],Tb[],intn);
};
template
LinkList:
:
LinkList(Ta[],Tb[],intn)
{
first=newPNode;
PNode*r=first,*s;
for(inti=0;i{
s=newPNode;
s->coef=a[i];
s->exp=b[i];
r->next=s;
r=s;
}
r->next=NULL;
}
3、主函数实现
#include
#include"LinkList.h"
LinkList*Add(LinkList*A,LinkList*B)
{
PNode*pre,*qre,*p,*q,*v;
pre=A->first;
p=pre->next;
qre=B->first;
q=qre->next;
while(p&&q)
{
if(p->expexp)
{
pre=p;
p=p->next;
}
else
if(p->exp>q->exp)
{
v=q->next;
pre->next=q;
q->next=p;
q=v;
}
else
{
p->coef=p->coef+q->coef;
if(p->coef==0)
{
pre->next=p->next;
deletep;
p=pre->next;
}
else
{
pre=p;p=p->next;
}
qre->next=q->next;
deleteq;
q=qre->next;
}
}
if(q)pre->next=q;
deleteB->first;
returnA;
}
voidSort(LinkList*A)//将链表按升序排序
{
PNode*p,*q,*r,*s;
if(A->first->next&&A->first->next->next)
{
s=A->first->next;
q=s->next;
while(q)
{
r=A->first;
p=r->next;
while(pif(p->exp<=q->exp){r=p;p=p->next;}
else{
q=q->next;
s->next->next=p;
r->next=s->next;
s->next=q;
break;
}
if(p==q){s=q;q=q->next;}
}
}
}
voidmain()
{
inta1[100],b1[100],a2[100],b2[100],c1[200],c2[200];
intn1,n2;
cout<<"请输入第一个多项式的项数n1(n1<=100):
"<<'\n';
cin>>n1;
while(n1>100)
{
cout<<"您输入的项数超出范围,请重新输入!
"<<'\n';
cout<<"请输入第一个多项式的项数n1(n1<=100):
"<<'\n';
cin>>n1;
}
cout<<"请输入第二个多项式的项数n2(n2<=100):
"<<'\n';
cin>>n2;
while(n2>100)
{
cout<<"您输入的项数超出范围,请重新输入!
"<<'\n';
cout<<"请输入第二个多项式的项数n1(n1<=100):
"<<'\n';
cin>>n2;
}
cout<<"请分别输入第一个多项式各项的系数和各项对应的指数:
"<<'\n';
for(inti=0;i{
cout<<"第"<
";
cin>>a1[i]>>b1[i];
}
cout<<"请分别输入第二个多项式各项的系数和各项对应的指数:
"<<'\n';
for(i=0;i{
cout<<"第"<
";
cin>>a2[i]>>b2[i];
}
LinkListA(a1,b1,n1),B(a2,b2,n2);
LinkList*ADD;
Sort(&A);
Sort(&B);
ADD=Add(&A,&B);
PNode*x=ADD->first;
i=0;
while(x->next)
{
x=x->next;
c1[i]=x->coef;
c2[i]=x->exp;
i++;
}
cout<<"第一项和第二项多项式相加后结果多项式的各项的系数和指数分别为:
"<<'\n';
for(intj=0;j
cout<<"第"<"<}
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;//栈顶指针,指示栈顶元素在数组中的下标
};
template
SeqStack:
:
SeqStack()
{
top=-1;
}
template
voidSeqStack:
:
Push(Tx)
{
if(top==StackSize-1)throw"上溢";
top++;
data[top]=x;
}
template
TSeqStack:
:
Pop()
{
Tx;
if(top==-1)throw"下溢";
x=data[top--];
returnx;
}
template
TSeqStack:
:
GetTop()
{
if(top!
=-1)returndata[top];
}
template
intSeqStack:
:
Empty()
{
if(top==-1)return1;
elsereturn0;
}
template
voidSeqStack:
:
Print()
{
while(top!
=-1)
{
Ttemp;
temp=Pop();
cout<}
}
(2)主函数实现
a、四方向查找
#include
#include"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;
SeqStackS;//栈(*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<4)
}//endwhile(!
S.Empty())
}
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,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}};
cout<<"从出口到入口的路径为\n(xy代表坐标d代表方向(东0,南1,西2,北3))\nx\ty\td"<mazepath(maze);
}
运行结果:
b、八方向查找
#include
#include"SeqStack.h"
constintN=10;
typedefstruct{
intx,y,d;
}DataType;
structDirectInc{
intdx,dy;
};
constDirectIncmove[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
voidmazepath(intmaze[N][N])
{
DataTypetemp;
intg,h,v