算法与数据结构C语言习题参考答案1-5章

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.绪论

1.将下列复杂度由小到大重新排序:

A.2nB.n!C.n5

【答】10 000

2(n)

2.将下列复杂度由小到大重新排序:

A.n*log

2(n)B.n+n2+n3

【答】24

2(n)

3.用大“O”表示法描述下列复杂度:

A.5n5/2+n2/5

C.3n4+n* log

2(n)

【答】A:O (n5/2)B:O (n)D.10 000E.n*log

2(n)C.24D.n0.5B.6*log

2(n) + 9n

D.5n2+n3/2

C:O (n4)D:O (n2)4.按照增长率从低到高的顺序排列以下表达式:4n2,log3n,3n,20n,2000,log2n,n2/3。又n!应排在第几位?

【答】按照增长率从低到高依次为:2000, log

3n, log

2n,n2/3, 20n, 4n2, 3n。

n!的增长率比它们中的每一个都要大,应排在最后一位。

5.计算下列程序片断的时间代价:

int i=1;

while(i<=n)

{

printf(“i=%d\n”,i);

i=i+1;

}

【答】循环控制变量i从1增加到n,循环体执行n次,第一句i的初始化执行次数为1,第二句执行n次,循环体中第一句printf执行n次,第二句i从1循环到n,共执行n次。所以该程序段总的时间代价为:

T(n) = 1 +n+ 2n= 3n+ 1 =O(n)

6.计算下列程序片断的时间代价:

int i=1;

while(i<=n)

{

int j=1;

while(j<=n)

{

int k=1;

while(k<=n)

{

printf(“i=%d,j=%d,k=%d\n”,I,j,k);

k=k+1;

}

j=j+1;

}

i=i+1;

}

【答】循环控制变量i从1增加到n,最外层循环体执行n次,循环控制变量j从1增加到n,中间层循环体执行n次,循环控制变量k从1增加到n,最内层循环体执行n次,所以该程序段总的时间代价为:

T(n) = 1 +n+n{1 +n+n[1 +n+ 2n+1] +1 +1}+ 1

= 3n3+ 3n2+4n+2

=O(n3)

2.线性表

1.试写一个插入算法int insertPost_seq(palist, p, x ),在palist所指顺序表中,下标为p的元素之后,插入一个值为x的元素,返回插入成功与否的标志。

【答】

数据结构

采用2.1.2节中顺序表定义。

int insertPost_seq(PseqList palist, int p, DataType x ){

/*在palist所指顺序表中下标为p的元素之后插入元素x */

int q;

if ( palist->n >= palist-> MAXNUM ) {

pri ntf(“Overflow!\n”);

return0;

}

if (p<0||p>palist->n-1 ){

printf(“Not exist! \n”);return 0;

}

for(q=palist->n - 1; q>=p+1; q--)/*插入位置及之后的元素均后移一个位置*/ palist->element[q+1] = palist->element[q];

palist->element[p+1] = x;

palist->n = palist->n + 1;

return 1;

}/*插入元素x */

/*元素个数加1 */

/*不存在下标为p的元素*/

/*溢出*/

2试写一个删除算法deleteV_seq(palist, x ),在palist所指顺序表中,删除一个值为x的元素,返回删除成功与否的标志。

【答】

数据结构

采用2.1.2节中顺序表定义。

intdeleteV_seq(PseqList palist, p, DataType x ) {

/*在palist所指顺序表中删除值为x的元素*/

int p,q;

for(p=0;p

if(x==palist->element[p]){

for(q=p; qn-1; q++) /*被删除元素之后的元素均前移一个位置*/ palist->element[q] = palist->element[q+1];

palist->n = palist->n - 1;

return 1 ;/*元素个数减1 */

}

return 0;

}

3.设有一线性表e = (e

0, e

1, e

2,…, e

n1),其逆线性表定义为e= (e

n1,…, e

2, e

1,e

0)。

请设计一个算法,将用顺序表表示的线性表置逆,要求逆线性表仍占用原线性表的空间。

【答】

数据结构

采用2.1.2节中顺序表的定义。

思路

考虑对数组element[ ]进行置逆,即把第一个元素和最后一个元素换位置,把第二个元素和倒数第二个元素换位置……。

注意

这种调换的工作只需对数组的前一半元素进行,所以设置整数变量count 用于存放数组长度的一半的值。大家可以考虑一下:为什么不能对整个数组进行如上的对元素“换位置”的工作?(提示:这样会将本来已经置逆的线性表又置逆回来,即又变成了原来的表。)顺序表的置逆算法

void rev_seq(PSeqList palist){

DataType x;

int count, i;

if (palist->n == 0 || palist->n == 1) return;

count = palist->n / 2;

for ( i = 0; i < count; i++){

x = palist->element[i];

相关文档
最新文档