算法与数据结构C语言习题参考答案15章.docx

上传人:b****3 文档编号:975331 上传时间:2022-10-14 格式:DOCX 页数:26 大小:31.34KB
下载 相关 举报
算法与数据结构C语言习题参考答案15章.docx_第1页
第1页 / 共26页
算法与数据结构C语言习题参考答案15章.docx_第2页
第2页 / 共26页
算法与数据结构C语言习题参考答案15章.docx_第3页
第3页 / 共26页
算法与数据结构C语言习题参考答案15章.docx_第4页
第4页 / 共26页
算法与数据结构C语言习题参考答案15章.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

算法与数据结构C语言习题参考答案15章.docx

《算法与数据结构C语言习题参考答案15章.docx》由会员分享,可在线阅读,更多相关《算法与数据结构C语言习题参考答案15章.docx(26页珍藏版)》请在冰豆网上搜索。

算法与数据结构C语言习题参考答案15章.docx

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

1.绪论

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

A.2nB.n!

C.n5D.10000E.n*2(n)

【答】10000

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

A.n*2(n)B.n+n2+n3C.24D.n0.5

【答】24

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

A.5n5/2+n2/5B.6*2(n)+9n

C.3n4+n*2(n)D.5n2+n3/2

【答】A:

O(n5/2)B:

O(n)C:

O(n4)D:

O(n2)

4.按照增长率从低到高的顺序排列以下表达式:

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

又n!

应排在第几位?

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

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

n!

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

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

1;

(i<)

{

(“\n”);

1;

}

【答】循环控制变量i从1增加到n,循环体执行n次,第一句i的初始化执行次数为1,第二句执行n次,循环体中第一句执行n次,第二句i从1循环到n,共执行n次。

所以该程序段总的时间代价为:

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

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

1;

(i<)

{

1;

(j<)

{

1;

(k<)

{

(“\n”);

1;

}

1;

}

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.试写一个插入算法(,p,x),在所指顺序表中,下标为p的元素之后,插入一个值为x的元素,返回插入成功与否的标志。

【答】

数据结构

采用2.1.2节中顺序表定义。

(,p,x){

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

q;

(>n>=>){/*溢出*/

(“!

\n”);

0;

}

(p<0p>>1){/*不存在下标为p的元素*/

(“!

\n”);0;

}

(>n-1;q>1;)/*插入位置及之后的元素均后移一个位置*/

>[1]=>[q];

>[1]=x;/*插入元素x*/

>n=>n+1;/*元素个数加1*/

1;

}

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

【答】

数据结构

采用2.1.2节中顺序表定义。

(,p,x){

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

;

(0<)/*查找值为x的元素的下标*/

(>[p]){

(;q<>1;)/*被删除元素之后的元素均前移一个位置*/

>[q]=>[1];

>n=>n-1;/*元素个数减1*/

1;

}

0;

}

3.设有一线性表e=(e0,e1,e2,…,1),其逆线性表定义为e¢=(1,…,e2,e10)。

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

【答】

数据结构

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

思路

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

注意

这种调换的工作只需对数组的前一半元素进行,所以设置整数变量用于存放数组长度的一半的值。

大家可以考虑一下:

为什么不能对整个数组进行如上的对元素“换位置”的工作?

(提示:

这样会将本来已经置逆的线性表又置逆回来,即又变成了原来的表。

顺序表的置逆算法

(){

x;

i;

(>n0>n1);/*空表或只有一个元素,直接返回*/

=>n/2;

(i=0;i<;){/*只需调换半个表的元素*/

x=>[i];

>[i]=>[>n-1-i];

>[>n-1-i]=x;

}

}

代价分析

该算法中包含一个循环,其循环次数为2。

因此,算法的时间代价为O(n)。

4.已知长度为n的线性表A采用顺序存储结构,请写一算法,找出该线性表中值最小的数据元素。

【答】

数据结构

采用2.1.2节中顺序表定义。

思路

设置变量,遍历整个表,不断更新当前已经经历过的元素的最小值即可。

为方便起见,事先假设表不为空。

算法

(){/*求非空顺序表中的最小数据元素*/

;

i;

=>[0];/*初始化*/

(i=1;i<>n;)/*中保存的总是当前的最小数据*/

(>>[i])

=>[i];

;

}

代价分析

该算法访问顺序表中每个元素各一次,时间代价为O(n)。

讨论

读者可以试图对上面的算法进行修改,使返回的值不是最小元素的值而是它的下标。

5.已知线性表A的长度为n,并且采用顺序存储结构。

写一算法,删除线性表中所有值为x的元素。

【答】

数据结构

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

思路

为了减少移动次数,可以采用快速检索的思想,用两个变量i,j记录顺序表中被处理的两端元素的下标,开始时i=0,j=n-1,边检索第i个元素边增加i,直到找到一个元素值等于x,再边检索第j个元素边减少j,直到找到一个元素值不等于x,把下标为j的元素移到下标为i的位置后重复上述过程,直到i≥j。

另用一变量记录删除了多少个元素。

算法

(p,x){

/*删除顺序表中所有值为x的元素,新顺序表可能不保持原有顺序*/

i=0,j=>n-1,=0;/*i定位于顺序表开始处,j定位于顺序表最后*/

(i

(>[i]x){/*找到了一个要删除的元素*/

((>[j]x)(ij)){

/*从后往前找不会被删除的元素,当i,j相等时退出循环,记录从后往前找的过程中遇到了多少个要删的元素*/

j--;

;

}

(i==j){

>n=>n--1;

;

}

{

>[i]=>[j];

;

j--;

}

}

;

}

>n=>n-;

(>[i]x)p->n--;

}

代价分析

该算法访问顺序表中每个元素各一次,时间代价为O(n)。

讨论

这个算法使用了一点技巧使得在中间删除元素时,避免了最后一串元素的移动。

但是,它破坏了原来线性表中元素之间的顺序关系。

如果需要保持原来的顺序应该怎样做?

这里提供一种可行的思路:

从前向后遍历表,如果元素不是x,则继续向后;如果元素是x,则寻找其后第一个不是x的元素,将这两个元素互换。

具体算法请读者自己实现。

6.写一算法,在带头结点的单链表中,p所指结点前面插入值为x的新结点,并返回插入成功与否的标志。

【答】

数据结构

采用2.1.3节中单链表定义。

思想:

由于在单链表中,只有指向后继结点的指针,所以只有首先找到p所指结点的前驱结点,然后才能完成插入。

而找p所指结点的前驱结点,只能从单链表的第一个结点开始,使用与类似的方式进行搜索。

算法:

(x){

/*在带头结点的单链表中,p所指结点前面插入值为x的新结点*/

p1;

()0;

p1;

(p11->)p11->;/*寻找p所指结点的前驱结点*/

(p1)0;

()(())*申请新结点*/

(){(“!

!

!

\n”)0;}

>;

>1->;

p1->;

1;

}

7.写一算法,在带头结点的单链表中,删除p所指的结点,并返回删除成功与否的标志。

【答】

数据结构

采用2.1.3节中单链表定义。

思想:

由于在单链表中,只有指向后继结点的指针,所以只有首先找到p所指结点的前驱结点,然后才能完成删除。

而找p所指结点的前驱结点,只能从单链表的第一个结点开始,使用与类似的方式进行搜索。

(p){

/*在带头结点的单链表中,删除p所指的结点*/

p1;

();

p1;

(p11->)p11->;/*寻找p所指结点的前驱结点*/

(p1)0;

p1->>;

(p);/*删除结点p*/

1;

}

8.已知是指向无头结点的单链表的指针变量,写出删除该链表下标为i的(第1个)结点的算法。

【答】

数据结构

采用2.1.3节中单链表定义。

思路

依次遍历表中的每一个结点并计数,到第1个结点时实行删除。

由于链表是无头结点的,所以在删除第一个结点时要特别注意。

算法

(*,i){

/*删除单链表中下标为i的结点。

删除成功返回,否则返回。

*/

j;

p,q;

((*)i<0);

(i==0){/*如果需要删除第一个结点*/

q=(*);

(*)=(*)->;

(q);

;

}

p=(*);

j=0;

(>j

p=>;

;

}

(>);/*此元素不存在*/

q=>;

>=>;

(q);

;

}

代价分析

该算法访问单链表中前面i个结点,时间代价为O(i),最大不超过O(n)。

讨论

如果函数参数不是*类型而是类型,在删除0的结点时,程序不能正确实现,其原因请读者思考(考虑C语言的参数传递方式)。

如果单链表带表头结点,重写本题的算法。

比较这两个算法,是否能体会到表头结点的作用。

9.已知是指向无头结点的单链表的指针变量,写出删除该链表中从下标为i的(第1个)结点开始的连续k个结点的算法。

【答】

数据结构

采用2.1.3节单链表定义。

思路

这道题与上题相似,只需要增加计数即可。

要注意的是应该判断给出的i和k是否合理,是不是会超出链表长度。

算法

(*,i,k){

/*删除单链表中从下标i开始的k个结点。

删除成功返回,否则返回。

*/

j;

p,q;

((*)i<0k<=0);

(i==0){/*如果需要删除从第一个结点开始的k个结点*/

(j=0;j

q=(*);

(*)=(*)->;

(q);

}

;

}

p=(*);

j=0;

(>j

p=>;

;

}

(>);/*第i个结点不存在*/

(j=0;j;){

q=>;

>=>;

(q);

}

;

}

代价

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 教育学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1