文档库 最新最全的文档下载
当前位置:文档库 › CC++数据结构一点经典题目

CC++数据结构一点经典题目

CC++数据结构一点经典题目
CC++数据结构一点经典题目

Test2-4 个人所得税的计算(if-else-if)

#include

using namespace std;

//个人所得税的计算

int main()

{

float income,taxable,tax;

cout<<"Please input the Monthly Income:";

cin>>income;

taxable=income-3500;

if(taxable<=0) tax=0;

else if(taxable<=1500) tax=taxable*0.03;

else if(taxable<=4500) tax=taxable*0.1-105;

else if(taxable<=9000) tax=taxable*0.2-555;

else if(taxable<=35000) tax=taxable*0.25-1005;

else if(taxable<=55000) tax=taxable*0.3-2755;

else if(taxable<=80000) tax=taxable*0.35-5505;

else tax=taxable*0.45-13505;

cout<<"Tax libility is "<

return 0;

}

Test2-5 今天星期几(switch case)

1>算出year这一年元旦星期几

2>根据mouth和day,计算该日期是year这一年的第几天

#include

using namespace std;

//计算某天是星期几

int main()

{

int year,mouth,day,week,d;

cout<<"请按年月日的方式输入一个日期:"<

cin>>year>>mouth>>day;

d = year+(year-1)/4-(year-1)/100+(year-1)/400;

week=d%7;

d=0;

switch(mouth-1)

{

case 11:d+=30;

case 10:d+=31;

case 9:d+=30;

case 8:d+=31;

case 7:d+=31;

case 6:d+=30;

case 5:d+=31;

case 4:d+=30;

case 3:d+=31;

case 2:d+=28;

if(year%4==0 && year%100!=0 || year%400!=0) d++; //判断是否是闰年case 1:d+=31;

}

d+=day;

week=(week+(d-1)%7)%7;

if(week==0)

cout<

else

cout<

return 0;

}

Test2-6 找到最小值和最大值(for)

#include

using namespace std;

//找最大数和最小数(循环)

int main()

{

int x,max,min;

cout<<"请依次输入5个数(空格隔开):"<

cin>>x; //输入一个数

max=min=x;

for(int i=2;i<=5;i++) //循环从2开始

{

cin>>x;

if(max

if(min>x) min=x;

}

cout<<"最大值为MAX="<

}

cin>>sele;

}

num=zhang+li+wang+nosele+other; //请问弃权和无效的票算不算其中

float z,l,w;

z=zhang/(float)num;

l=li/(float)num;

w=wang/(float)num;

cout<<"zhang:"<

cout<<"li:"<

cout<<"wang:"<

}

Test2-8 逆序数(do-while)

#include

using namespace std;

//逆序数的输出(第一个do-while判断是否为非负整数,第二个do-while进行逆序数的转换)int main()

{

int number,digit;

do

{

cout<<"请输入一个非负整数:";

cin>>number;

}

while(number<0);

cout<

do

{

digit=number%10;

number/=10;

cout<

}

while(number>0);

cout<

return 0;

}

Test2-9 求出最小爱因斯坦阶梯数-方式1(do-while)

#include

using namespace std;

//判断最小的爱因斯坦阶梯数

int main()

{

int x=1;

do{x++;}

while(!(x%2==1 && x%3==2 && x%4==3 && x%5==4 && x%6==5 && x%7==0)); //非常综合的式子

cout<<"爱因斯坦的阶梯数为:"<

return 0;

}

Test2-9-1 求出最小爱因斯坦阶梯数-方式2(while、if-else)

#include

using namespace std;

//判断最小的爱因斯坦及阶梯数-方式2

int main()

{

int x=7;

while(1)

{

if(x%2==1 && x%3==2 && x%4==3 && x%5==4 && x%6==5 && x%7==0) break;

else x+=7;

}

cout<<"爱因斯坦的阶梯数为:"<

return 0;

}

Test2-10 z字排列的数表,输入一个数,找出改位置的数(for)

#include

using namespace std;

//z字排列的数表,输入一个数,找出改位置的数

int main()

{

int i,n,k;

cin>>n;

for(i=1;i<=n;i++)

{

for(int j=1;j<=n;j++)

cout<

cout<

}

for(i=1;i*(i+1)/2

k=n-(i*(i-1)/2);

if(i%2!=0)

cout<

else

cout<

return 0;

}

Test2-11 将1元兑换成1分,2分,5分的硬币,共有多少种兑换的方法(for两层)#include

using namespace std;

//人民币兑换(将1元兑换成1分,2分,5分的硬币,共有多少种兑换的方法)

int main()

{

int five,two,count;

count=0;

for(five=0;five<=100/5;five++)

{

for(two=0;two<=(100-5*five)/2;two++)

count++;

}

cout<<"共有"<

return 0;

}

Test2-12 分解质因数(while、if-else)

#include

using namespace std;

//分解质因数

int main()

{

int n,i;

cout<<"Please input a number:";

cin>>n;

cout<

i=2;

while(i

{

if(n%i==0)

{

cout<

n=n/i;

}

else i++;

}

cout<

return 0;

}

Test2-13 10000内完全数的枚举(for)

#include

#include

using namespace std;

//求10000以内的完全数(真因子之和为次数本身)int main()

{

int i,n,s,cnt=0;

for(n=2;n<=10000;n++)

{

s=1;

for(i=2;i<=sqrt(n);i++)

if(n%i==0)

if(i!=n%i) s=s+i+n/i;

else s+=i;

if(s==n)

{

cnt++;

cout<<"第"<

cout<

for(i=2;i<=sqrt(n);i++)

if(n%i==0)

cout<<"+"<

cout<

}

}

return 0;

}

Test2-14 求[100,200]之间质数

#include

#include

//求[100,200]之间的质数

using namespace std;

int main()

{

int i,k,m,s;

for(m=101;m<=200;m=m+2)

{

k=sqrt(m);

s=0;

for(i=2;i<=k;i++)

if(m%i==0){s=1;break;}

if(s==0) cout<

}

cout<

return 0;

}

*Test2-15 乘积全是1(do-while)

#include

using namespace std;

//键盘输入一个奇数p(末尾不是5),总有一个数t使得p*t=1111 (111)

int main()

{

int p,a,b,r,t,n;

while(1) //判断输入的数是否满足要求

{

cout<<"输入自然数p,最后一位是3或5或7或9:"<

cout<<"p=";

cin>>p;

if(p%2!=0&&p%5!=0) break;

}

a=0; n=0;

while(a=p的一个全为1的数a

{

a=a*10+1;n++;

}

t=0;

cout<<"s=";

do //此处代码深奥,王细细理解(以p=3为例){

b=a/p;

cout<

t++;

if(t%50==0) cout<

r=a % p;

a=r * 10+1;

n++;

}

while(r>0);

cout<

return 0;

}

*Test2-16 尼科彻斯定理:(for)

#include

using namespace std;

//尼科彻斯定理:任何一个整数的立方都可以表示为一连串连续的奇数之和int main()

{

int n,num,sum,i,j,flag;

cout<<"请输入一个待验证的自然数:";

cin>>n;

num = n*n*n;

flag=0;

for(i=1;i

{

sum=0;

for(j=i;j

{

sum+=j;

if(sum == num)

{

cout<

flag=1;

break;

}

else if(sum > num) break;

}

}

return 0;

}

Test2-17 末尾0的个数:(for-while)

#include

using namespace std;

//对任意给定的正整数你,求n!中末尾0的个数

int main()

{

int i,j,k=0,n;

cin>>n;

for(i=5;i<=n;i=i+5)

{

j=i;

while(j%5==0)

{

k++; j=j/5;

}

}

cout<

return 0;

}

递推算法:包括顺推(条件-->结果)和逆推(结果-->条件)

Test2-18 走楼梯(for)

#include

using namespace std;

//走楼梯,按照1,2,3的阶梯数走完n个阶梯的方法有多少种。

int main()

{

int a,b,c,d,i,n;

cout<<"请输入楼梯阶数:";

cin>>n;

a=1; b=2; c=4;

if(n<=0)

cout<<"楼梯阶数应为正整数,输入错误!"<

else

{

if(n==1) d=a;

else if(n==2) d=b;

else if(n==3) d=c;

else

for(i=4;i<=n;i++) //当阶数>=4时,满足以下条件,

{

d=a+b+c;

a=b; b=c; c=d;

}

cout<<"走完"<

}

return 0;

}

Test2-19 RPG涂色问题

#include

using namespace std;

//RPG涂色问题:一行n个方格,用红、粉、绿涂色,每个格子一色,

//相邻不能同色,首尾不能同色(0

int main()

{

int i,n,f1,f2,f3,num;

cout<<"请输入方格数目n(0

cin>>n;

if(n==1) num=3;

else if(n==2||n==3) num=6;

else

{

f1=6; f2=6;

for(i=4;i<=n;i++) //当n>=4时,会有如下方法

{

f3=2*f1+f2;

f1=f2; f2=f3;

}

num=f3;

}

cout<

int j,m,f[31];

f[0]=0; f[1]=3; f[2]=f[3]=6;

for(j=4;j<31;j++)

f[j]=f[j-1]*2+f[j-2];

cout<<"请输入方格数目m(m<=30):";

cin>>m;

cout<

return 0;

}

**Test2-20 马的行走路径

#include

using namespace std;

//马行走的路径:规则:1.>马走日字;2.>马只能向右走

int main()

{

int dx[5]={0,2,2,1,1},dy[5]={0,1,-1,2,-2};

struct point

{

int x;int y;

};

point a[51][51];

int i,j,n,m,k;

for(i=0;i<51;i++)

for(j=0;j<51;j++)

a[i][j].x=a[i][j].y=0;

cout<<"请输入终点的位置坐标:";

cin>>n>>m;

a[n][m].x=-1; //标记为终点

a[n][m].y=-1;

for(i=n;i>=2;i--) //倒推

for(j=1;j<=m;j++)

if(a[i][j].x!=0)

for(k=1;k<=4;k++)

{

a[i-dx[k]][j-dy[k]].x=i;

a[i-dx[k]][j-dy[k]].y=j;

}

if(a[1][1].x==0)

cout<<"No!"<

else //存在路径

{

i=1; j=1;

cout<<"("<

while(a[i][j].x!=-1)

{

k=i;

i=a[i][j].x; j=a[k][j].y;

cout<<"->("<

}

}

cout<

return 0;

}

Test2-21 储油点

#include

using namespace std;

//穿过1000km沙漠,储油点的选择

int main()

{

int k; //储油点位置序号

float d,d1; //d为终点至当前储油点的距离,d1:i=n至始点的距离float oil[10],dis[10]; //dis为各储油点到终点的距离

int i;

cout<<"序号\t离出发点距离(km)\t储油量(L)"<

k=1;

d=500; //从i=1处开始向始点倒推

dis[1]=500; oil[1]=500; //离终点最近的储油点作为递推的开始

do

{

k+=1; d+=500/(2*k-1);

dis[k] = d;

oil[k] = oil[k-1]+500;

}

while (d<1000); //递推结束条件为储油点到终点的距离超过1000 dis[k]=1000; //置始点至终点的距离值

d1=1000-dis[k-1]; //求储油点k处至始点的距离

oil[k] = d1*(2*k+1)+oil[k-1]; //求始点藏油量

for(i=0;i

cout<

return 0;

}

*Test2-22 乘火车(看懂看,看不懂算)

#include

#include

using namespace std;

//测试数据:10 15 530

#define MAXS 101

int main()

{

int a,n,m,k,i;

int p[MAXS],down[MAXS],up[MAXS];

cout<<"请输入车站数n,始发站上车人数a和终点站下车人数m:"<

cin>>n>>a>>m;

up[1]=a; down[1]=0; p[1]=a;

k=1;

do

{

up[2]=k;down[2]=k;p[2]=p[1]; //枚举第二站的上下车人数和车上人数

for(i=3;i

{

up[i]=up[i-1]+up[i-2];

down[i]=up[i-1];

p[i]=p[i-1]+up[i-2];

}

if(p[n-1]==m) //若n-1站车上人数为m,则输出从各站开出时车上的人数

{

up[n]=0; down[n]=m; p[n]=0;

cout<<"上车情况如下:"<

cout<<"车站编号:";

for(i=1;i<=n;i++)

cout<

cout<

cout<<"上车人数:";

for(i=1;i<=n;i++)

cout<

cout<

cout<<"下车人数:";

for(i=1;i<=n;i++)

cout<

cout<

cout<<"车上人数:";

for(i=1;i<=n;i++)

cout<

cout<

break;

}

k=k+1; //第二站上车人数增加1

}

while(p[n-1]

if(p[n-1]>m) cout<<"No Answer!"<

return 0;

}

迭代法又称为辗转法:不断用变量的旧值推出新值

1.确定迭代变量;

2.建立迭代关系;

3.对迭代进行控制。

Test2-23 验证“谷角猜想”(while)

#include

using namespace std;

//验证“谷角猜想”:一个自然数n,n为偶数/2给n(循环),n为奇数*3+1;//再/2,(循环),总可以得到自然数1

int main()

{

unsigned int data;

cout<<"请输入一个自然数:";

cin>>data;

while(data!=1)

{

if((data%2==0))

{

cout<

cin>>a>>b;

cout<

a=a*c-b;

b=b*c;

}

cout<<"1/"<

return 0;

}

Test2-25 求平方根

#include

#include

using namespace std;

//求平方根

int main()

{

double x0,x1,a;

cin>>a;

x0=a/2; //迭代初值

x1=0.5*(x0+a/x0);

do

{

x0=x1; //为下一次迭代做准备

x1=0.5*(x0+a/x0);

}

while(fabs(x1-x0)>0.000001);

cout<

return 0;

}

Test2-26 迭代求解方程的根

#include

#include

using namespace std;

//迭代法求方程根

int main()

{

//解法一(二分迭代)

double x1,x2,x3;

x1=0; x2=2; //初始区间

do

{

x3=(x1+x2)/2;

if((x1*x1*x1-x1-1)*(x3*x3*x3-x3-1)>0)

x1=x3; //改变区间

else x2=x3; //改变区间

}while(fabs(x2-x1)>0.000001); //判断是否满足精度要求cout<

//解法二(牛顿迭代)

double y1,y2;

y1=y2=2; //初始点2

do

{

y1=y2;

y2=y1-(y1*y1*y1-y1-1)/(3*y1*y1-1);

}while(fabs(y2-y1)>0.000001);//判断是否满足精度要求cout<<"方程的一个根为:"<

//解法三(弦截法)

double z0,z1,z,f0,f1;

z1=0; z=2;

do

{

z0=z1; z1=z;

f0=z0*z0*z0-z0-1; f1=z1*z1*z1-z1-1;

z=z1-f1/(f1-f0)*(z1-z0);

}while(fabs(z-z1)>0.000001);

cout<<"方程的一个根为:"<

return 0;

}

Test2-27 水手分椰子(递推和迭代的比较)

#include

using namespace std;

//当然也可以用倒推和迭代的方法(以下为顺推)

int main()

{

int i,k,x,y[7];

k=4; y[1]=k;

i=2;

while(i<=6)

{

if((4*y[i-1]-1)%5!=0)

{

k+=5; y[1]=k; i=2;

}

else

{

y[i]=(4*y[i-1]-1)/5; i++;

}

}

x=5*y[1]+1;

cout<<"原有的椰子至少"<

for(i=1;i<=5;i++)

cout<<"第"<

cout<<"最后一起分时有椰子"<<5*y[6]+1<<"个,每人分得"<

return 0;

}

穷举法:举例全部可能情况,逐个判断哪些符合问题的求解(例:test2-9)

Test2-28 百钱买百鸡(穷举)

#include

using namespace std;

//百钱买百鸡(公鸡/5,母鸡/3,雏鸡3个/1)

int main()

{

int x,y,z,cnt;

cnt=0;

for(x=0;x<=100/5;x++)

for(y=0;y<=(100-5*x)/3;y++)

{

z=100-x-y;

if(z%3!=0) continue;

if(5*x+3*y+z/3==100)

{

cout<

cnt++;

}

}

cout<<"共有买法"<

return 0;

}

Test2-29 水仙花数(穷举)

#include

using namespace std;

//找出(100,1000)之间的水仙花数(n的各位数立方之和=n)

int main()

{

//解法一

int n,a,b,c;

for(n=100;n<1000;n++)

{

a=n/100;

b=n/10%10;

c=n%10;

if(a*a*a+b*b*b+c*c*c==n)

cout<

}

cout<

//解法二

for(a=1;a<=9;a++)

for(b=0;b<=9;b++)

for(c=0;c<=9;c++)

{

n=100*a+10*b+c;

if(a*a*a+b*b*b+c*c*c==n)

cout<

}

cout<

return 0;

}

Test2-30 4位分段和平方数(穷举法)

#include

#include

using namespace std;

//四位分段和平方数:例子:2025=(20+25)*(20+25) int main()

{

//解法一

int a,b,n;

cout<<"解法一(穷举法):";

for(n=1000;n<=9999;n++)

{

a=n/100;

b=n%100;

if((a+b)*(a+b)==n)

cout<

}cout<

//解法二

int a1,n1,x,y;

cout<<"解法二(自己看):";

for(a=(int)sqrt(1000);a<=(int)sqrt(9999);a++)

{

n1=a*a; x=n1/100; y=n1%100;

if(a==x+y)

cout<

}

cout<

return 0;

}

Test2-31 疑案分析(穷举法中的逻辑推理)

#include

using namespace std;

//逻辑推理(01)

int main()

{

int a,b,c,d,e,f,cc1,cc2,cc3,cc4,cc5,cc6,g;

for(a=0;a<=1;a++) //for是为了穷举64种情况(2的6次方)for(b=0;b<=1;b++)

for(c=0;c<=1;c++)

for(d=0;d<=1;d++)

for(e=0;e<=1;e++)

for(f=0;f<=1;f++)

{ //满足的判断条件

cc1=a||b;

cc2=!(a&&d);

cc3=(a&&e)||(a&&f)||(e&&f);

cc4=(b&&c)||(!b&&!c);

cc5=(c&&!d)||(!c&&d);

cc6=d||(!e);

/*全部为真*/ if(cc1+cc2+cc3+cc4+cc5+cc6==6)

{

cout<<"These man are ";

if(a==1) cout<<"A ";

if(b==1) cout<<"B ";

if(c==1) cout<<"C ";

if(d==1) cout<<"D ";

if(e==1) cout<<"E ";

if(f==1) cout<<"F ";cout<

/*让有解标志为1*/ g=1;

}

}

if(g!=1) cout<<"Can't found!"<

return 0;

}

Test2-32 比赛预测(穷举法中的逻辑推理)

#include

using namespace std;

//比赛预判

int main()

{

int a,b,c,d,e,cc1,cc2,cc3,cc4,cc5,g;

for(a=1;a<=5;a++)

for(b=1;b<=5;b++)

for(c=1;c<=5;c++)

for(d=1;d<=5;d++)

{

e=15-(a+b+c+d); //4位选手没取的名次就是e的名次

if(e<1||e>5) continue;//e的名次必须在[1,5]

if(a*b*c*d*e!=120) continue;//5位选手的名次必须各不相同

cc1=((b==2)+(a==3))==1;

cc2=((b==2)+(e==4))==1;

cc3=((c==1)+(d==2))==1;

cc4=((c==5)+(d==3))==1;

cc5=((e==4)+(a==1))==1;

if(cc1+cc2+cc3+cc4+cc5==5)//全部为真

{

cout<<"A is "<

cout<<"B is "<

cout<<"C is "<

cout<<"D is "<

cout<<"E is "<

g=1; //有解标志位

}

}

if(g!=1) cout<<"Can't found!"<

return 0;

}

Test2-33 数学趣题:四方定理(穷举法)

#include

using namespace std;

//四方定理:所有自然数至多只要四个数的平方和就可以表示

int main()

{

int a,b,c,d,n;

cout<<"请输入一个待验证自然数:";

cin>>n;

for(a=1;a<=n/2;a++) //对a,b,c,d进行穷举

for(b=0;b<=a;b++)

for(c=0;c<=b;c++)

for(d=0;d<=c;d++)

{

if((a*a+b*b+c*c+d*d)==n)

{

cout<

cout<

}

}

return 0;

}

Test2-34 对调数(穷举)

#include

using namespace std;

//对调数:(两位数个位与十位对调产生的新数)

int main()

{

int n,n1,a,b,a1,b1,z,z1,cnt=0;

while(1) //判断输入时都正确

{

cout<<"输入一个两位正整数(个位数不为0):";

cin>>n;

if(n%10==0 || n<=10||n>=100)

{

cout<<"输入错误!"<

continue; //直接走while循环

}

else{

a=n/10; b=n%10; z=b*10+a;

break; //跳出循环

}

}

for(n1=11;n1<=99;n1++) //穷举

{

if(n1%10==0) continue; //排除个位=0的

a1=n1/10; b1=n1%10; z1=b1*10+a1;

if((n+n1)==(z+z1) && n!=z1)

{

cout<

cnt++;

}

}

cout<<"共有"<

if(cnt==0)

cout<<"所求的对调数不存在!"<

return 0;

}

数据结构经典例题

数据结构例题(及答案) 项目一习题(答案) 一选择题 1. 算法的计算量的大小称为计算的(B )。 A( 效率 B. 复杂性 C. 现实性 D. 难度 2.算法的时间复杂度取决于(C ) A(问题的规模 B. 待处理数据的初态 C. A和B 3(从逻辑上可以把数据结构分为(C )两大类。 A(动态结构、静态结构 B(顺序结构、链式结构 C(线性结构、非线性结构 D(初等结构、构造型结构 4(连续存储设计时,存储单元的地址(A )。 A(一定连续 B(一定不连续 C(不一定连续 D(部分连续,部分不连续 5. 以下属于逻辑结构的是(C )。 A(顺序表 B. 哈希表 C.有序表 D. 单链表 二、判断题 1. 数据元素是数据的最小单位。(×) 2. 记录是数据处理的最小单位。(×) 3. 数据的逻辑结构是指数据的各数据项之间的逻辑关系;(×) 4(程序一定是算法。(×) 5. 在顺序存储结构中,有时也存储数据结构中元素之间的关系。(×) 6. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。(×) 7. 数据结构的基本操作的设置的最重要的准则是,实现应用程序与存储结构的独立。(?)

8. 数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的储存结构. (×) 三、填空 1(数据的物理结构包括数据元素的表示和数据元素间关系的表示。 2. 对于给定的n个元素,可以构造出的逻辑结构有集合,线性结构,树形 结构,图状结构或网状结构四种。 3(数据的逻辑结构是指数据的组织形式,即数据元素之间逻辑关系的总体。而 逻辑关系是指数据元素之间的关联方式或称“邻接关系”。 4(一个数据结构在计算机中表示(又称映像) 称为存储结构。 5(抽象数据类型的定义仅取决于它的一组逻辑特性,而与在计算机内部如何表 示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响 其外部使用。 6(数据结构中评价算法的两个重要指标是算法的时间复杂度和空间复杂度。 7. 数据结构是研讨数据的逻辑结构和物理结构,以及它们之间的相互 关系,并对与这种结构定义相应的操作(运算),设计出相应的算法。 ( 一个算法具有5个特性: 有穷性、确定性、可行性,有零个或多个输入、 有一个或多个输8 出。 四、应用题 1. 1. 数据结构是一门研究什么内容的学科, 答:数据结构是一门研究在非数值计算的程序设计问题中,计算机的操作对象 及对象间的关系和施加于对象的操作等的学科 2. 2. 数据元素之间的关系在计算机中有几种表示方法,各有什么特点, 答:四 种表示方法

经典数据结构面试题(含答案)

栈和队列的共同特点是__________________________ .栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是 __________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是 ____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

数据结构模拟卷(含答案)经典习题培训讲学

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位10. 下列图示的顺序存储结构表示的二叉树是( )

经典数据结构面试题(含答案)

.栈通常采用的两种存储结构是______________________ .用链表表示线性表的优点是_______________________ 8.在单链表中,增加头结点的目的是___________________ 9.循环链表的主要优点是________________________- 12.线性表的顺序存储结构和线性表的链式存储结构分别是__________________________ 13.树是结点的集合,它的根结点数目是_____________________ 14.在深度为5的满二叉树中,叶子结点的个数为_______________ 15.具有3个结点的二叉树有(_____________________ 16.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为____________________ 17.已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是____________________________ 18.已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH和DBGEACHF,则该二叉树的后序遍历为______________________ 19.若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是_______________________ 20.数据库保护分为:安全性控制、完整性控制、并发性控制和数据的恢复。 在计算机中,算法是指_______________________ 算法一般都可以用哪几种控制结构组合而成_____________________ .算法的时间复杂度是指______________________ 5. 算法的空间复杂度是指__________________________ 6. 算法分析的目的是__________________________

大数据结构经典复习题(仅供参考)

一、选择题(20分) 1.下面关于线性表的叙述错误的是(D )。 (A) 线性表采用顺序存储必须占用一片连续的存储空间 (B) 线性表采用链式存储不必占用一片连续的存储空间 (C) 线性表采用链式存储便于插入和删除操作的实现 (D) 线性表采用顺序存储便于插入和删除操作的实现 2.设某棵二叉树的中序遍历序列为ABCD,前序遍历序列为CABD,则后序遍历该二叉树得到序列为(A )。 (A) BADC (B) BCDA (C) CDAB (D) CBDA 3.设某棵二叉树中有2000个结点,则该二叉树的最小高度为(C )。 (A) 9 (B) 10 (C) 11 (D) 12 4.设二叉排序树中有n个结点,则在二叉排序树的平均平均查找长度为(B )。 (A) O(1) (B) O(log2n) (C) (D) O(n2) 5.设有5000个待排序的记录关键字,如果需要用最快的方法选出其中最小的10个记录关键字,则用下列(B )方法可以达到此目的。 (A) 快速排序(B) 堆排序(C) 归并排序(D) 插入排序 第9小题分析:9快速排序、归并排序和插入排序必须等到整个排序结束后才能够求出最小的10个数,而堆排序只需要在初始堆的基础上再进行10次筛选即可,每次筛选的时间复杂度为O(log2n)。 6.下列四种排序中(D )的空间复杂度最大。 (A) 插入排序(B) 冒泡排序(C) 堆排序(D) 归并排序

7.设一维数组中有n个数组元素,则读取第i个数组元素的平均时间复杂度为(C )。 (A) O(n) (B) O(nlog2n) (C) O(1) (D) O(n2) 8.设一棵二叉树的深度为k,则该二叉树中最多有(D )个结点。 (A) 2k-1 (B) 2k(C) 2k-1(D) 2k-1 9.在二叉排序树中插入一个结点的时间复杂度为(B )。 (A) O(1) (B) O(n) (C) O(log2n) (D) O(n2) 10.设用链表作为栈的存储结构则退栈操作(B )。 (A) 必须判别栈是否为满(B) 必须判别栈是否为空 (C) 判别栈元素的类型(D) 对栈不作任何判别 11.下列四种排序中(A )的空间复杂度最大。 (A) 快速排序(B) 冒泡排序(C) 希尔排序(D) 堆 12.设某二叉树中度数为0的结点数为N0,度数为1的结点数为N l,度数为2的结点数为N2,则下列等式成立的是(C )。 (A) N0=N1+1 (B) N0=N l+N2(C) N0=N2+1 (D) N0=2N1+l 13.设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不 超过(A )。 (A) log2n+1 (B) log2n-1 (C) log2n (D) log2(n+1) 14.数据的最小单位是(A )。 (A) 数据项(B) 数据类型(C) 数据元素(D) 数据变量 15.设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为(D )。 (A) O(log2n) (B) O(1) (C) O(n2) (D) O(n)

数据结构模拟卷(含答案)经典习题

练习题 一、单项选择题 1. 若将数据结构形式定义为二元组(K,R),其中K是数据元素的有限集合,则R是K上( ) A. 操作的有限集合 B. 映象的有限集合 C. 类型的有限集合 D. 关系的有限集合 2. 在长度为n的顺序表中删除第i个元素(1≤i≤n)时,元素移动的次数为( ) A. n-i+1 B. i C. i+1 D. n-i 3. 若不带头结点的单链表的指针为head,则该链表为空的判定条件是( ) A. head==NULL B. head->next==NULL C. head!=NULL D. head->next==head 4. 引起循环队列队头位置发生变化的操作是( ) A. 出队 B. 入队 C. 取队头元素 D. 取队尾元素 5. 若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则不.可能出现的出栈序列是( ) A. 2,4,3,1,5,6 B. 3,2,4,1,6,5 C. 4,3,2,1,5,6 D. 2,3,5,1,6,4 1

6. 字符串通常采用的两种存储方式是( ) A. 散列存储和索引存储 B. 索引存储和链式存储 C. 顺序存储和链式存储 D. 散列存储和顺序存储 7. 数据结构是() A.一种数据类型 B.数据的存储结构 C.一组性质相同的数据元素的集合 D.相互之间存在一种或多种特定关系的数据元素的集合 8. 算法分析的目的是() A.辨别数据结构的合理性 B.评价算法的效率 C.研究算法中输入与输出的关系 D.鉴别算法的可读性 9. 在线性表的下列运算中,不.改变数据元素之间结构关系的运算是 () A.插入B.删除 C.排序D.定位 10. 下列图示的顺序存储结构表示的二叉树是( ) 2

数据结构经典例题

数据结构经典例题 1.设计一个算法将L拆分成两个带头节点的单链表L1和L2。 void split(LinkList *&L,LinkList *&L1,LinkList *&L2) { LinkList *p=L->next,*q,*r1; //p指向第1个数据节点 L1=L; //L1利用原来L的头节点 r1=L1; //r1始终指向L1的尾节点 L2=(LinkList *)malloc(sizeof(LinkList));//创建L2的头节点 L2->next=NULL; //置L2的指针域为NULL while (p!=NULL) { r1->next=p; //采用尾插法将*p(data值为ai)插入L1中 r1=p; p=p->next; //p移向下一个节点(data值为bi) q=p->next; //由于头插法修改p的next域,故用q保存*p的后继节点 p->next=L2->next; //采用头插法将*p插入L2中 L2->next=p; p=q; //p重新指向ai+1的节点 } r1->next=NULL; //尾节点next置空 } 2.查找链表中倒数第k个位置上的节点(k为正整数)。若查找成功,算法输出该节点的data域的值,并返回1;否则,只返回0。 typedef struct LNode {int data; struct LNode *link; } *LinkList; int Searchk(LinkList list,int k) { LinkList p,q; int count=0; p=q=list->link; while (p!=NULL) { if (countlink; p=p->link; } if (count

经典数据结构上机题_答案解析

数据结构上机实验题目 实验一线性表的顺序存储结构 实验学时 2学时 背景知识:顺序表的插入、删除及应用。 目的要求: 1.掌握顺序存储结构的特点。 2.掌握顺序存储结构的常见算法。 实验容 1.输入一组整型元素序列,建立顺序表。 2.实现该顺序表的遍历。 3.在该顺序表中进行顺序查找某一元素,查找成功返回1,否则返回0。4.判断该顺序表中元素是否对称,对称返回1,否则返回0。 5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数。 6.输入整型元素序列利用有序表插入算法建立一个有序表。 7.利用算法6建立两个非递减有序表并把它们合并成一个非递减有序表。 8. 利用该顺序结构实现循环队列的入队、出队操作。 8.编写一个主函数,调试上述算法。 #include #include

#define OVERFLOW 0 #define MAXSIZE 100 typedef int ElemType; typedef struct list {ElemType elem[MAXSIZE]; int length; }Sqlist; void Creatlist(Sqlist &L) {int i; printf("请输入顺序表的长度:"); //输入一组整型元素序列,建立一个顺序表。 scanf("%d",&L.length); for(i=0;i

数据结构典型例题

基本概念典型例题 一、单项选择题 [例6-1]数据结构用集合的观点可以表示为一个二元组DS=(D,R)。其中,D是( ①)的有穷集合,R是D上( ②)的有限集合。 ①A.算法B. 数据元素C. 数据操作D. 逻辑结构 ②A. 操作B. 映像C. 存储D.关系 解析:由数据结构的集合形式化定义可知,本题答案为:①B;②D。 [例6-2]数据的常用存储结构中不包括( )。 A.顺序存储结构B.线性结构C.索引存储结构D.散列存储结构 解析:数据通常有四种基本的存储方法,即顺序存储方法、链式存储方法、索引存储 方法和散列存储方法。由此可知,本题答案为:B。 [例6-3] 算法指的是( ①),它必须具备( ②)这三个特性。 ①A.计算方法B.排序方法C.解决问题的步骤序列D.调度方法 ②A.可执行性、可移植性、可扩充性B.可执行性、确定性、有穷性 C.确定性、有穷性、稳定性D.易读性、稳定性、安全性 解析:算法是对特定问题求解步骤的一种描述,是由若于条指令组成的有限序列。它 必须满足以下性质:输人性、输出性、有穷性、确定性、无二义性和可行性。由此可知,本 题答案为:①㈠②B。 [例6-4] 在下面的程序段中,对x的赋值语句的执行频度为( )。 for(i=0;i

数据结构经典题目c语言代码

《数据结构》课程设计题目 (程序实现采用C语言) 题目1:猴子选王(学时:3) 一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。 要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。 //链表 #include #include // 链表节点 typedef struct _RingNode { int pos; struct _RingNode *next; }RingNode, *RingNodePtr; // 创建约瑟夫环,pHead:链表头指针,count:链表元素个数 void CreateRing(RingNodePtr pHead, int count) { RingNodePtr pCurr = NULL, pPrev = NULL; int i = 1; pPrev = pHead; while(--count > 0)

{ pCurr = (RingNodePtr)malloc(sizeof(RingNode)); i++; pCurr->pos = i; pPrev->next = pCurr; pPrev = pCurr; } pCurr->next = pHead; // 构成环状链表 } void KickFromRing(RingNodePtr pHead, int n) { RingNodePtr pCurr, pPrev; int i = 1; // 计数 pCurr = pPrev = pHead; while(pCurr != NULL) { if (i == n) { // 踢出环 printf("\n%d", pCurr->pos); // 显示出圈循序 pPrev->next = pCurr->next; free(pCurr); pCurr = pPrev->next; i = 1; } pPrev = pCurr;

数据结构(C语言)【经典题库】含标准答案

《数据结构与算法》复习题 选择题 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构 B.数据结构 C.数据的逻辑结构 D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑 B.存储 C.逻辑和存储 D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。A.数据的处理方法 B.数据元素的类型 C.数据元素之间的关系 D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何 B.结点个数的多少 C.对数据有哪些运算 D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位

C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。(1)A.找出数据结构的合理性 B.研究算法中的输入和输出的关系C.分析算法的效率以求改进 C.分析算法的易读性和文档性(2)A.空间复杂度和时间复杂度 B.正确性和简明性 C.可读性和文档性 D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是 O(n2) 。 s =0; for( I =0; i

数据结构经典算法试题

1.假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。【北京大学1998 三、1 (5分)】 LinkedList Union(LinkedList la,lb) { pa=la->next; pb=lb->next; la->next=null; while(pa!=null && pb!=null) ∥当两链表均不为空时作 if(pa->data<=pb->data) { r=pa->next; pa->next=la->next; ∥将pa结点链于结果表中,同时逆置。 la->next=pa; pa=r; } else {r=pb->next; pb->next=la->next; ∥将pb结点链于结果表中,同时逆置。 la->next=pb; pb=r; } while(pa!=null) ∥将la表的剩余部分链入结果表,并逆置。 {r=pa->next; pa->next=la->next; la->next=pa; pa=r; } while(pb!=null) {r=pb->next; pb->next=la->next; la->next=pb; pb=r; } }

1)设有两个无头结点的单链表,头指针分别为ha,hb,链中有数据域data,链域next,两链表的数据都按递增序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏。【南京理工大学1997 四、3(15分)】 LinkedList Union(LinkedList ha, hb)∥ha和hb是两个无头结点的数据域值递增有序的单链 {LinkedList 表,本算法将hb中并不出现在ha中的数据合并到ha中,合并中不能破坏hb链表。 la; la=(LinkedList)malloc(sizeof(LNode)); la->next=ha; pa=ha; pb=hb; pre=la; while(pa&&pb) if(pa->datadata)∥处理ha中数据 {pre->next=pa;pre=pa;pa=pa->next;} else if(pa->data>pb->data)∥处理hb中数据。 {r=(LinkedList)malloc(sizeof(LNode)); r->data=pb->data; pre->next=r; pre=r; pb=pb->next;} Else∥处理pa- >data=pb->data; {pre->next=pa; pre=pa; pa=pa->next;∥两结点数据相等时,只将ha的数据链入。 pb=pb->next; } if(pa!=null)pre->next=pa;∥将两链表中剩余部分链入结果链表。 else pre->next=pb; free(la); }

数据结构上机例题及答案

习题二 ⒉1描述以下四个概念的区别:头指针变量,头指针,头结点,首结点(第一个结点)。解:头指针变量和头指针是指向链表中第一个结点(头结点或首结点)的指针;在首结点之前附设一个结点称为头结点;首结点是指链表中存储线性表中第一个数据元素的结点。若单链表中附设头结点,则不管线性表是否为空,头指针均不为空,否则表示空表的链表的头指针为空。 2.2简述线性表的两种存储结构有哪些主要优缺点及各自使用的场合。 解:顺序存储是按索引直接存储数据元素,方便灵活,效率高,但插入、删除操作将引起元素移动,降低了效率;而链式存储的元素存储采用动态分配,利用率高,但须增设表示结点之间有序关系的指针域,存取数据元素不如顺序存储方便,但结点的插入和删除十分简单。顺序存储适用于线性表中元素数量基本稳定,且很少进行插入和删除,但要求以最快的速度存取线性表中的元素的情况;而链式存储适用于频繁进行元素动态插入或删除操作的场合。 2.3 在头结点为h的单链表中,把值为b的结点s插入到值为a的结点之前,若不存在a,就把结点s插入到表尾。 Void insert(Lnode *h,int a,int b) {Lnode *p,*q,*s; s=(Lnode*)malloc(sizeof(Lnode)); s->data=b; p=h->next; while(p->data!=a&&p->next!=NULL) {q=p; p=p->next; } if (p->data==a) {q->next=s; s->next=p;} else

{p->next=s; s->next=NULL; } } 2.4 设计一个算法将一个带头结点的单链表A分解成两个带头结点的单链表A和B,使A中含有原链表中序号为奇数的元素,而B中含有原链表中序号为偶数的元素,并且保持元素原有的相对顺序。 Lnode *cf(Lnode *ha) {Lnode *p,*q,*s,*hb; int t; p=ha->next; q=ha; t=0; hb=(Lnode*)malloc(sizeof(Lnode)); s=hb; while(p->next!=NULL) {if (t==0) {q=p;p=p->next;t=1;} else {q->next=p->next; p->next=s->next; s->next=p; s=p; p=p->next; t=0; } } s->next=NULL; return (hb); }

数据结构课后习题详解(超完整,超经典)

第1章 绪论 1.1 简述下列术语:数据,数据元素、数据对象、数据结构、存储结构、数据类型和抽象数据类型。 解:数据是对客观事物的符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 数据对象是性质相同的数据元素的集合,是数据的一个子集。 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 存储结构是数据结构在计算机中的表示。 数据类型是一个值的集合和定义在这个值集上的一组操作的总称。 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。是对一般数据类型的扩展。 1.2 试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。 解:抽象数据类型包含一般数据类型的概念,但含义比一般数据类型更广、更抽象。一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,因此称它们为预定义数据类型。抽象数据类型通常由编程者定义,包括定义它所使用的数据和在这些数据上所进行的操作。在定义抽象数据类型中的数据部分和操作部分时,要求只定义到数据的逻辑结构和操作说明,不考虑数据的存储结构和操作的具体实现,这样抽象层次更高,更能为其他用户提供良好的使用接口。 1.3 设有数据结构(D,R),其中 {}4,3,2,1d d d d D =,{}r R =,()()(){}4,3,3,2,2,1d d d d d d r = 试按图论中图的画法惯例画出其逻辑结构图。 解: 1.4 试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。 解: ADT Complex{ 数据对象:D={r,i|r,i 为实数} 数据关系:R={} 基本操作: InitComplex(&C,re,im) 操作结果:构造一个复数C ,其实部和虚部分别为re 和im DestroyCmoplex(&C) 操作结果:销毁复数C Get(C,k,&e) 操作结果:用e 返回复数C 的第k 元的值 Put(&C,k,e) 操作结果:改变复数C 的第k 元的值为e IsAscending(C) 操作结果:如果复数C 的两个元素按升序排列,则返回1,否则返回0

数据结构练习题及

数据结构练习题及参考答案

《数据结构》练习题 一、解答题(共50分) 1、(8分)假设用于通讯的电文字符集及其出现的频率如下表所 请为这8个字符设计哈夫曼编码,并画出其哈夫曼树,计算 WPL。 2.(8分)若一棵二叉树中序遍历和后序遍历序列分别为: DBEHGAFIC和DHGEBIFCA。试画出这棵二叉树,并写出其 先序遍历和层序遍历序列。 3.(16分)以下无向网络以邻接表为存储结构(假设邻接表的 顶点表按字母a、b、c、d、e、f、g、h的顺序依次存储,邻接表 的边表结点按顶点的下标由小到大链接)。请画出其邻接表,并 写出从顶点f出发,分别进行深度和广度优先遍历的序列,写出用Prime方法从顶点c 开始产生最小生成树的边的序列。 4.(8分)已知键值序列为(44,39,67,25,52,59,43,84,54,58,15,26,12,73,92,69),取填充因子α=0.8,采用线性探查法处理冲突,试构造散列表。 ⒌(5分)已知一组记录为(67,88,15,12,60,37,7,31,45,81),用希尔排序方法进行排序,d1=5,d2=3,d3=1,则第二趟的排序结果是()。 ⒍(5分)已知一组记录为(67,88,15,12,60,37,7,31,45,81) ,用堆(大根堆)排序方法进 行排序,第一趟的排序结果是()。

二、完善程序(共20分,每空2分) 1.假设一组递减有序的原始数据存储在数组r中,存放元素的下标下限为low,下标上限为high,以下是在数组中查找数值为k的折半查找算法。请填空完善程序。 int BinSearch(int r[ ], int low,int high,int k) { int l,h,m; l= low; h= high; while ( ⑴) { m= ⑵; if (k < r[m]) ⑶; else if (k > r[m]) ⑷; else return m; } return 0; } 2. 以下程序功能是将数组r中,从下标first到end之间的元素进行快速排序的分区。请填空,完善程序。 int Partition(int r[ ], int first, int end) { int i,j,t; i=first; j=end; //初始化 while ( ⑸) { while (i

数据结构课后习题及解析第六章

第六章习题 1.试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。 2.对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。 3.已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,……,n k个度为k的结点,则该树中有多少个叶子结点并证明之。 4.假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。5.已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个? 6.给出满足下列条件的所有二叉树: ①前序和后序相同 ②中序和后序相同 ③前序和后序相同 7.n个结点的K叉树,若用具有k个child域的等长链结点存储树的一个结点,则空的Child域有多少个? 8.画出与下列已知序列对应的树T: 树的先根次序访问序列为GFKDAIEBCHJ; 树的后根次序访问序列为DIAEKFCJHBG。

9.假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为: 0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10 请为这8个字母设计哈夫曼编码。 10.已知二叉树采用二叉链表存放,要求返回二叉树T的后序序列中的第一个结点指针,是否可不用递归且不用栈来完成?请简述原因. 11. 画出和下列树对应的二叉树: 12.已知二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目。 13.编写递归算法:对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。 14.分别写函数完成:在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。 15.分别写出算法,实现在中序线索二叉树中查找给定结点*p在中序序列中的前驱与后继。16.编写算法,对一棵以孩子-兄弟链表表示的树统计其叶子的个数。

[IT认证]全国计算机等级考试《数据结构》典型试题

典型题目分类 §1 概述 [全真模拟试卷3选择题3]数据结构中,与计算机无关的是数据的 A存储结构B物理结构C逻辑结构D物理和存储结构 答案:C [全真模拟试卷5选择题1]数据结构作为计算机的一门学科,主要研究数据的逻辑结构、对各种数据结构进行的运算,以及A数据的存储结构B计算方法C数据映象D逻辑存储 答案:A [全真模拟试卷5选择题3]在计算机中,算法是指 A加工方法B解决方案的准确而完整的描述 C排序方法D查询方法 答案:B [全真模拟试卷1填空题1]算法的基本特征是可行性、确定性、和拥有足够的情报。 答案:有穷性 [全真模拟试卷6选择题2]算法分析的目的是 A找出数据结构的合理性B找出算法中输入和输出之间的关系C分析算法的易懂性和可靠性D分析算法的效率以求改进 答案:D [全真模拟试卷6填空题1]在算法正确的前提下,评价一个算法的两个标准是。答案:时间复杂度和空间复杂度[专家预测试卷3填空题1]算法的工作量大小和实现算法所需的存储单元多少分别称为算法的。 答案:时间复杂度和空间复杂度 [全真模拟试卷3选择题1]算法的空间复杂度是指 A算法程序的长度B算法程序中的指令条数 C算法程序所占的存储空间D执行过程中所需要的存储空间答案:D §2 线性表 [全真模拟试卷6选择题3]线性表L=(a1,a2,……,a i,……,a n),下列说法正确的是 A每个元素都有一个直接前件和直接后件 B线性表中至少要有一个元素

C表中诸元素的排列顺序必须是由小到大或由大到小 D除第一个元素和最后一个元素外,其余每个元素都有且只有一个直接前件和一个直接后件 答案:D [全真模拟试卷7选择题1]下列叙述正确的是 A线性表是线性结构B栈和队列是非线性结构 C线性链表是非线性结构D二叉树是线性结构 答案:A [专家预测试卷3选择题1]根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分成 A动态结构和静态结构B紧凑结构和非紧凑结构 C线性结构和非线性结构D内部结构和外部结构 答案:C [全真模拟试卷3填空题1]数据的逻辑结构有线性结构和两大类。 答案:非线性结构 [专家预测试卷1选择题3]线性表的顺序存储结构和线性表的链式存储结构分别是 A顺序存取的存储结构,顺序存取的存储结构 B随机存取的存储结构,顺序存取的存储结构 C随机存取的存储结构,随机存取的存储结构 D任意存取的存储结构,任意存取的存储结构 答案:B [全真模拟试卷5填空题1]长度为n的顺序存储线性表中,当在任何位置上插入一个元素概率都相等时,插入一个元素所需移动元素的平均个数为。 答案:n/2 §3 栈和队列 [全真模拟试卷1选择题1]栈和队列的共同特点是 A都是先进先出B都是后进先出 C只允许在端点处插入和删除元素D没有共同点 答案:C [全真模拟试卷2选择题3]如果进栈序列为e1,e2,e3,e4,则可

《算法设计综合实训》题目讲解

算法设计综合实训题目 0.逆序数字(借助栈) 编写一个函数,接收一个4位整数值,返回这个数中数字逆序后的结果值。例如,给定数7631,函数返回1367. 输入: 第一行一个正整数T(T<=10),表示有T组测试数据; 以下T行,每行一个非负的整数N。 输出: 共T行,对于每组输入数据输出一行,即数字逆序后的结果值。 样本输入: 3 7631 1018 5158 样本输出: 1367 8101 8515 1.人见人爱A+B 这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。 输入: 输入数据有多行组成,首先是一个整数N,表示测试实例的个数,然后是N行数据,每行有6个整数AH,AM,AS,BH,BM,BS,分别表示时间A和B所对应的时分秒。题目保证所有的数据合法。 输出: 对于每个测试实例,输出A+B,每个输出结果也是由时分秒3部分组成,同时也要满足时间的规则(即:分和秒的取值范围在0-59),每个输出占一行,并且所有的部分都可以用32位整数表示。 样本输入: 2 1 2 3 4 5 6 34 45 56 12 23 34 样本输出: 5 7 9 47 9 30 2.敲七 【问题描述】 输出7和7的倍数,还有包含7的数字例如(17,27,37...70,71,72,73...)

【要求】 【数据输入】一个整数N。(N不大于30000) 【数据输出】从小到大排列的不大于N的与7有关的数字,每行一个。 【样例输入】 20 【样例输出】 7 14 17 3.统计同成绩学生人数问题 【问题描述】 读入N名学生的成绩,将获得某一给定分数的学生人数输出。 【要求】 【数据输入】测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的成绩,相邻两数字用一个空格间隔。 第3行:给定分数 当读到N=0时输入结束。其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。 【数据输出】对每个测试用例,将获得给定分数的学生人数输出。 【样例输出】 3 80 60 90 60 2 85 66 5 60 75 90 55 75 75 【样例输出】 1 2 4.高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210。后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日。

数据结构经典案例教学文案

数据结构经典案例

1.停车场问题 停车场管理员的任务就是帮助车主把车停放在停车场中,或者是帮助车主将车开出乘车场。然后停车场中能够停放的车辆数目很多,这就使得让莫辆车开出停车场变得复杂。比如:要开走一辆车,则管理员需要把他前面的车全部暂时清除,然后等这辆车开出后再将这些车重新放入停车场。当然了,这个时候腾出了一个空位置,此位置由后面的车占据。 任务:编程模拟这样的情况,这里假设停车场最多可停放5辆车。data.txt记录了某一时间段内,该停车场车辆的到来与离开记录,刚开始,停车场是空的。其中大写字母A--P是车辆的代号,arrives--到来,departs---离开。 程序需要从data.txt中读取这些信息,并且用这些数据来模拟停车场的车辆调度情况。 data.txt内容如下: A arrives A departs B arrives C arrives D arrives C departs E arrives F arrives

G arrives B departs H arrives D departs E departs I arrives I departs J arrives F departs K arrives L arrives M arrives H departs N arrives J departs K departs O arrives P arrives P departs O departs L departs 实现代码如下: 模拟停车场问题.cpp(没有再继续分.h文件,混为一体了,主要.h文件过于简单)

相关文档
相关文档 最新文档