《数据结构算法与应用--C++语言描述》第一章习题解答


<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->1.1
#include<iostream>
usingnamespacestd;
constintMAX_TRY=3;
template<classT>
boolInput(T&data)
{
intn_trys=0;
do
{
cout<<"请输入一个数:";
cin>>data;
if(data>=0)
{
returntrue;
}
else
{
cout<<"输入非法,请重新输入."<<endl;
n_trys++;
}
}while(n_trys<MAX_TRY);
returnfalse;
}
intmain(void)
{
doublenum;
if(Input(num))
{
cout<<"你输入的数是:"<<num<<endl;
}
else
{
cout<<"已经输入次了,你失败了

}
cin>>num;
return0;
}
1.2
#include<iostream>
usingnamespacestd;
template<classT>
boolIsAsscendArray(constT*a,intn)
{//测试数组是否升序排列
boolisAsscend=true;
for(inti=0;i<n;++i)
{
if(a[i]>a[i+1])
{
isAsscend=false;
}
}
returnisAsscend;
}
intmain(void)
{
inta[]={1,0,3,4},tmp;
cout<<IsAsscendArray(a,4)<<endl;
cin>>tmp;
return0;
}
1.3
#include<iostream>
usingnamespacestd;
longdoublejiecheng(intn)
{
longdoubleresult=n;
for(inti=n-1;i>=1;--i)
{
result*=i;
}
returnresult;
}
intmain(void)
{
inttmp,num;
longdoubleresult=0;
cout<<"输入阶层数:";
cin>>num;
cout<<"结果:"<<jiecheng(num)<<endl;
cin>>tmp;
return0;
}
1.4
#include<iostream>
usingnamespacestd;
longfibo(intn)
{
if(n==1||n==2)
{
return1;
}
else
{
returnfibo(n-1)+fibo(n-2);
}
}
longfibo2(intn)
{
inta1=1,a2=1,tmp;
if(n==1||n==2)
return1;
else
{
for(inti=3;i<=n;++i)
{
tmp=a1+a2;
a1=a2;
a2=tmp;
}
returntmp;
}
}
intmain(void)
{
inttmp;
intnum;
cout<<"输入fibo数:";
cin>>num;
cout<<"结果:"<<fibo2(num)<<endl;
cin>>tmp;
return0;
}
1.5,求子集合
#include<iostream>
usingnamespacestd;
chara[]={'a','b','c','d'};
constintMAX=sizeof(a)/sizeof(char);
boolused[MAX]={false},first=false;
voidsub(intn)
{
if(n==MAX)
{
if(first==false)
{
cout<<"空集"<<endl;
first=true;
return;
}
for(inti=0;i<MAX;++i)
{
if(used[i]==true)
{
cout<<a[i];
}
}
cout<<endl;
return;
}
else
{
used[n]=false;//不选中
sub(n+1);
used[n]=true;//选中
sub(n+1);
}
}
intmain()
{
sub(0);//从第一个元素开始挑选
return0;
}
1.6
#include<iostream>
usingnamespacestd;
inta[]={1,2,3,4};
constintsize=sizeof(a)/sizeof(int);
boolcontain(inta[],intnum,intn)
{
if(n==0)
{
if(num==a[n])
returntrue;
else
returnfalse;
}
else
{
if(a[n-1]==num)
returntrue;
else
returncontain(a,num,n-1);
}
}
intmain()
{
intm;
do
{
cout<<"输入一个数:";
cin>>m;
cout<<"结果是:"<<contain(a,m,size)<<endl;
}while(m!=-1);
return0;
}
1.3节示例
#include<iostream>
usingnamespacestd;
template<classT>
boolMake2DArray(T**&x,introws,intcols)
{
try
{
x=newT*[rows];
for(inti=0;i<rows;++i)
{
x[i]=newT[cols];
}
returntrue;
}
catch(stringex)
{
cout<<"erroroccurwhenmalloc"<<endl;
returnfalse;
}
}
template<classT>
voidDeleteArray(T**&x,introws)
{
cout<<"enterdeletearray";
for(inti=0;i<rows;++i)
{
delete[]x[i];
}
delete[]x;
}
template<classT>
voidDisplay(T**&x,introws,intcols)
{
for(inti=0;i<rows;++i)
{
for(intj=0;j<cols;++j)
{
cout<<x[i][j]<<'/t';
}
cout<<endl;
}
}
template<classT>
voidEnterData(T**&x,introws,intcols)
{
cout<<"请输入数据:"<<endl;
for(inti=0;i<rows;++i)
{
for(intj=0;j<cols;++j)
{
cin>>x[i][j];
}
}
}
intmain(void)
{
introws,cols;
int**a;
cout<<"输入行数和列数:";
cin>>rows>>cols;
if(Make2DArray(a,rows,cols))
{
EnterData(a,rows,cols);
}
Display(a,rows,cols);
DeleteArray(a,rows);
cout<<endl;
return0;
}
1.7
template<classT>
voidChangeSize1D(T*&a,intsize,T*&b,inttoSize)
{//将数组a的大小从size变成toSize
b=newT[toSize];
for(inti=0;i<toSize;i++)
{
b[i]=a[i];
}
delete[]a;
}
intmain(void)
{
intn;
int*a=newint[4];
for(inti=0;i<4;i++)
{
a[i]=i;
}
int*b;
ChangeSize1D(a,4,b,3);
intsize=sizeof(b)/sizeof(int);
for(inti=0;i<3;i++)
{
cout<<b[i];
}
cout<<endl;
cin>>n;
return0;
}
1.8
#include<iostream>
usingnamespacestd;
template<classT>
boolMake2DArray(T**&x,introws,intcols)
{
try
{
x=newT*[rows];
for(inti=0;i<rows;++i)
{
x[i]=newT[cols];
}
returntrue;
}
catch(stringex)
{
cout<<"erroroccurwhenmalloc"<<endl;
returnfalse;
}
}
template<classT>
voidDeleteArray(T**&x,introws)
{
cout<<"enterdeletearray/n";
for(inti=0;i<rows;++i)
{
delete[]x[i];
}
delete[]x;
}
template<classT>
voidDisplay(T**&x,introws,intcols)
{
for(inti=0;i<rows;++i)
{
for(intj=0;j<cols;++j)
{
cout<<x[i][j]<<'/t';
}
cout<<endl;
}
}
template<classT>
voidEnterData(T**&x,introws,intcols)
{
cout<<"请输入数据:"<<endl;
for(inti=0;i<rows;++i)
{
for(intj=0;j<cols;++j)
{
cin>>x[i][j];
}
}
}
template<classT>
voidChangeSize2D(T**&a,intoldRows,intoldCols,T**&b,intnewRows,intnewCols)
{
Make2DArray(b,newRows,newCols);//构造新的数组
for(inti=0;i<newRows;++i)
{
for(intj=0;j<newCols;++j)
{
b[i][j]=a[i][j];
}
}
DeleteArray(a,oldRows);//删除旧数组
}
intmain(void)
{
intn;
int**a,**b;
Make2DArray(a,3,3);
EnterData(a,3,3);
Display(a,3,3);
ChangeSize2D(a,3,3,b,2,2);
Display(b,2,2);
cin>>n;
return0;
}