}
};
boolBST:
:
findhelp(BSTNode*root,doublea){
if(root==NULL)
returnfalse;
if(ait)
returnfindhelp(root->lc,a);
elseif(a>root->it)
returnfindhelp(root->rc,a);
elseif(a==root->it)
returntrue;
}
BSTNode*BST:
:
insethelp(BSTNode*root,doublea){
if(root==NULL)
{cd++;
nodecount++;
returnnewBSTNode(a,NULL,NULL);
}
if(a<=root->it)
{cd++;
root->setlc(insethelp(root->lc,a));
}
elseif(a>root->it)
{cd++;
root->setrc(insethelp(root->rc,a));
}
returnroot;
}
BSTNode*BST:
:
deletemin(BSTNode*rt){
if(rt->lc==NULL)
returnrt->rc;
else{
rt->setlc(deletemin(rt->lc));
returnrt;
}
}
BSTNode*BST:
:
getmin(BSTNode*rt){
if(rt->lc==NULL)
returnrt;
elsereturngetmin(rt->lc);
}
BSTNode*BST:
:
removehelp(BSTNode*rt,doublea){
if(rt==NULL)returnNULL;
elseif(ait)
rt->setlc(removehelp(rt->lc,a));
elseif(a>rt->it)
rt->setrc(removehelp(rt->rc,a));
else{
BSTNode*temp=rt;
if(rt->lc==NULL){
rt=rt->rc;
deletetemp;
}
elseif(rt->rc==NULL){
rt=rt->lc;
deletetemp;
}
else{
BSTNode*temp=getmin(rt->rc);
rt->it=temp->it;
rt->setrc(deletemin(rt->rc));
deletetemp;
}
}
returnrt;
}
voidBST:
:
clearhelp(BSTNode*root){
if(root==NULL)return;
clearhelp(root->lc);
clearhelp(root->rc);
deleteroot;
}
voidBST:
:
printhelp(BSTNode*root,intlevel){
if(root==NULL)return;
printhelp(root->lc,level+1);
cout<it<<"";
printhelp(root->rc,level+1);
}
intmain(){
BSTa;
stringb;
inti;
cout<<"输入数据以\\n结束"<for(;;){
cin>>b;
if(b.at(0)=='\\'){
break;
}
else{
a.inset(atof(b.c_str()));
}
}
a.print();
cout<a.chazhaochangdu();
for(;;){
cout<<"输入要删除的数"<doublex;
cin>>x;
a.remove(x);
a.print();
}
return0;
}
结果:
实验三约瑟夫环
1.问题描述
设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。
开始时任意给出一个报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1报数;如此下去直到所有人全部出列为止
2.基本要求
设计一个程序模拟此过程,给出出列人的编号序列。
3、实现提示:
程序运行之后,首先要求用户指定初始报数的上限值,此题中循环链表可以不设头结点,而且必须注意空表和“非空表”的界限。
如N=20时,若从第一人开始,设每个人的编号依次是1,2,3,……..开始报数,报到20的人出列。
代码:
#include"iostream"
usingnamespacestd;
classLink{
public:
intm;
Link*next;
Link(inta=0,Link*b=NULL){
m=a;
next=b;
}
};
classLList{
private:
Link*head;
Link*tail;
Link*curr;
intcnt;
voidinit(){//初始化链表
curr=tail=head=newLink;
tail->next=head;
cnt=0;
}
voidremoveall(){//清空链表
tail->next=NULL;
while(head!
=NULL){
curr=head;
head=head->next;
deletecurr;
}
}
public:
LList(){init();}
~LList(){removeall();}
voidsethead(inta){//输入头结点
head->m=a;
cnt++;
}
voidprint(){//打印链表中的元素
Link*i1=curr;
Link*i2=curr;
while(i1->next!
=i2){
cout<m<<"";
i1=i1->next;
}
cout<m<<"";
//curr=head;
}
voidlclear(){//清空链表
removeall();
init();
}
voidinset(inta){//插入元素
curr->next=newLink(a,curr->next);
if(tail==curr)tail=curr->next;
cnt++;
}
voidappend(inta){//添加元素
tail=tail->next=newLink(a,NULL);
tail->next=head;
cnt++;
}
intremove(){//删除元素
if(curr->next==NULL){
cout<<"noelement"<return0;
}
inta=curr->next->m;
Link*it=curr->next;
if(curr->next==tail){
tail=curr;
}
curr->next=curr->next->next;
deleteit;
cnt--;
returna;
}
voidprev(){//移动到前一个元素
Link*temp=curr;
while(temp->next!
=curr)
temp=temp->next;
curr=temp;
}
voidnext(){//移动到下一元素
curr=curr->next;
}
intlength()//链表长度
{
returncnt;
}
intcurrpos(){//当前元素的位置
Link*temp=head;
inti=0;
while(temp!
=curr){
temp=temp->next;
i++;
}
returni;
}
voidmovetopos(intpos){//移动到该位置
//Assert((pos>=0)&&)(pos<=cnt),"positionoutofrange");
curr=head;
for(inti=0;icurr=curr->next;
}
}
intgetvalue(){//获取下一个元素的值
//Assert(curr->next!
=NULL,"novalue");
returncurr->next->m;
}
intgetcurr(){
returncurr->m;
}
};
intshaixuan(LList&a,intb){
intc,i;
//cout<
for(i=1;;i++){
if(i==b){
c=a.getcurr();
a.prev();
//cout<<"dq"<cout<a.next();
//cout<<"qqq"<break;
}
//cout<<"changd"<a.next();
}
returnc;
}
intmain(){
LLista;
intb,c;
cout<<"输入首结点"<cin>>b;
a.sethead(b);
cout<<"添加元素结束输入0结束"<inti=1;
for(;;){
cin>>i;
if(i==0){
break;
}
a.append(i);
}
cout<<"输入上限"<cin>>c;
for(;a.length()!
=0;){
c=shaixuan(a,c);
}
return0;
}
结果:
实验四农夫过河问题的求解
1.问题描述
一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸。
他要把这些东西
全部运到北岸。
他面前只有一条小船,船只能容下他和一件物品,另外只有农夫
才能撑船。
如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会
吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,而
狼不吃白菜。
请求出农夫将所有的东西运过河的方案。
2.实现提示
求解这个