数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx

上传人:b****4 文档编号:6711693 上传时间:2023-05-07 格式:DOCX 页数:42 大小:51.72KB
下载 相关 举报
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第1页
第1页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第2页
第2页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第3页
第3页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第4页
第4页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第5页
第5页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第6页
第6页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第7页
第7页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第8页
第8页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第9页
第9页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第10页
第10页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第11页
第11页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第12页
第12页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第13页
第13页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第14页
第14页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第15页
第15页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第16页
第16页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第17页
第17页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第18页
第18页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第19页
第19页 / 共42页
数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx_第20页
第20页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx

《数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx(42页珍藏版)》请在冰点文库上搜索。

数据结构徐孝凯编著部分习题参考解答Word文档下载推荐.docx

<

q.a<

"

x**2"

;

if(q.b)

if(q.b>

0)

cout<

+"

q.b<

x"

else

if(q.c)

if(q.c>

0)

q.c;

cout<

endl;

2.(给单号题解答)

(1)charCompare(SimpleTypex1,SimpleTypex2)

if(x1>

x2)return'

>

'

elseif(x1==x2)return'

='

elsereturn'

时间复杂度为O

(1)。

(3)doubleProduct(doublea[],intn)

doublep=1;

for(inti=0;

i<

n;

i++)

p*=a[i];

returnp;

时间复杂度为O(n)。

(5)intCount(inta[],intn,intc[5])

//用数组c[5]保存统计结果

intd[5]={20,50,80,130,201};

//用来保存各统计区间的上限

inti,j;

for(i=0;

i<

5;

i++)c[i]=0;

//给数组c[5]中的每个元素赋初值0

i++)

if(a[i]<

0||a[i]>

200)

return0;

//返回数值0表示数组中数据有错,统计失败。

for(j=0;

j<

j++)//查找a[i]所在的区间

if(a[i]<

d[j])break;

c[j]++;

//使统计相应区间的元素增1

return1;

//返回数值1表示统计成功

时间复杂度为O(n)

3.(给单号题解答)

(1)voidInitSet(intm[])

for(inti=1;

=SETSIZE;

m[i]=0;

(3)voidSetUnion(intm1[],intm2[],intm3[])

InitSet(m3);

if(m1[i]==1||m2[i]==1)m3[i]=1;

(5)intSetIs(intm[],intitem)

if(m[item]==1)return1;

elsereturn0;

(7)intSetDelete(intm[],intitem)

if(m[item]==1){m[item]=0;

}

return0;

第二章集合

2.1选择题

1.C2.B3.A4.A5.C6.B

7.D8.B9.A10.C11.D

2.2填空题(给单号题解答)

1.尾部(或表尾)3.1

5.O(n)7.小于等于

9.O(n1*n2)11.O(n2)

2.3运算题(给单号题解答)

1.S={23,72,12,49,35}

3.S={72,35,49,12,23}

5.{23,12}

7.{12,23}

2.4算法分析题(给单号题解答)

1.

运行结果:

1534716

05

3.运行结果:

163479051

2.5算法设计题(给单号题解答)

boolDeleteSet1(SetSq&

S,ElemTypeitem)

S.len;

if(S.set[i]==item)break;

if(i==S.len)returnfalse;

//删除失败返回假

S.set[i]=S.set[S.len-1];

//最后一个元素移到被删元素位置

S.len--;

//集合长度减1

if(float(S.len)/S.MaxSize<

0.4&

&

S.MaxSize>

10)

{//缩减空间处理

ElemType*p=newElemType[S.MaxSize/2];

//空间减少一半

if(!

p){//分配失败退出运行

cout<

存储空间用完!

exit

(1);

}

for(i=0;

i++)//把原空间内容复制到新空间中

p[i]=S.set[i];

delete[]S.set;

//释放原集合空间

S.set=p;

//使set指向新集合空间

S.MaxSize=S.MaxSize/2;

//把集合空间大小修改为新的长度

returntrue;

//删除成功返回真

3.

ElemTypeMaxValue(SetSq&

S)

{

if(S.len==0){cout<

集合为空!

exit

(1);

ElemTypex=S.set[0];

if(S.set[i]>

x)x=S.set[i];

returnx;

5.

voidDifferenceSet(sNode*&

Head1,sNode*Head2)

sNode*p=Head2;

while(p!

=NULL){

DeleteSet(Head1,p->

data);

p=p->

next;

第三章线性表

3.1单项选择题

1.B2.A3.C4.C5.B

6.A7.C8.D9.B10.B

11.A12.C13.D14.B15.A

3.2填空题(给单号题解答)

1.O(n)O(n)

3.O(n)

5.O(n)O(n2)

7.O

(1)O(n)

9.相同

11.p->

next->

next

13.相同

15.3

17.10(或trueNULL)

3.3算法分析题(给单号题解答)

1.(15,12,8,50,30,5,8,12)

3.(8,9,12,20,26,50)

3.4算法设计题(给单号题解答)

1.

//从顺序存储的线性表上统计出值为x的元素个数的算法。

intCount(LiseSq&

L,ElemTypex)//L可以为值参

inti=0,j;

for(j=0;

j<

L.len;

j++)

if(L.list[j]==x)i++;

returni;

//从带头结点的单链接存储的线性表上统计出值为x的元素个数的算法。

intCount(sNode*HL,ElemTypex)

sNode*p=HL->

//将指向第一个结点的指针赋给p

inti=0;

//用i作为统计变量

if(p->

data==x)i++;

3.

//从顺序存储的线性表上删除所有其值重复的多余元素,使所有元素的值均不同。

voidDelete2(ListSq&

L)

//每循环一次将删除list[i]后面与此值相同的的所有元素

while(i<

L.len){

intj=i+1;

while(j<

L.len)

{

if(L.list[j]==L.list[i]){//从顺序表中删除data[j]元素

intk;

for(k=j+1;

k<

k++)

L.list[k-1]=L.list[k];

L.len--;

}

elsej++;

i++;

//从单链接存储的线性表上删除所有其值重复的多余结点,使所有结点的值均不同。

voidDelete2(sNode*&

HL)

sNode*p=HL;

//p指向第一个结点

//用t2指向待处理的结点,t1指向t2的前驱结点

sNode*t1=p,*t2=p->

//此循环将从p后面的单链表中删除所有与p结点值相同的结点

while(t2!

if(t2->

data==p->

data){//删除t2结点

t1->

next=t2->

deletet2;

t2=t1->

//t2指向新的结点

else{//指针后移,以便处理下一个结点

t1=t2;

t2=t2->

//p指向下一个结点

voidInsert(sNode*&

HL,constElemType&

item)

sNode*newptr;

newptr=newsNode;

newptr->

data=item;

sNode*ap,*cp;

ap=HL;

cp=HL->

while(cp!

=HL)

if(item<

cp->

data)break;

else{ap=cp;

cp=cp->

next=cp;

ap->

next=newptr;

7.

voidJosephus(intn,intm,ints)

//使用带表头附加结点的循环单链表解决约瑟夫问题。

//生成表头附加结点,此时循环单链表为空。

sNode*HL=newsNode;

HL->

next=HL;

inti;

//生成含有n个结点的、结点值依次为1,2,...,n的带表头附加结点

//的循环单链表。

for(i=n;

i>

=1;

i--){

//生成新结点。

sNode*newptr=newsNode;

newptr->

data=i;

//把新结点插入到表头。

next=HL->

HL->

//从表头开始顺序查找出第s个结点,对应第一个开始报数的人

sNode*ap=HL,*cp=HL->

for(i=1;

s;

i++){

//ap和cp指针后移一个位置。

ap=cp;

cp=cp->

//若cp指向了表头附加结点,则仍需后移ap和cp指针,

//使之指向表头结点。

if(cp==HL){ap=HL;

//依次使n-1个人出列。

//顺序查找出待出列的人,即为循环结束后cp所指向的结点

for(intj=1;

m;

j++){

ap=cp;

cp=cp->

if(cp==HL){ap=HL;

//输出cp结点的值,即出列的人

data<

"

//从单链表中删除cp结点

ap->

next=cp->

deletecp;

//使cp指针指向被删除结点的后继结点

cp=ap->

//若cp指向了表头附加结点,则后移ap和cp指针

//使最后一个人出列。

HL->

//删除表头结点和表头附加结点。

deleteHL->

deleteHL;

9.

intFind(GLNode*GL,charch)

//从广义表GL中查找单元素字符等于ch的算法,若查找成功

//则返回数值1,否则返回数值0。

while(GL!

if(GL->

tag==0){//处理单元素结点

if(GL->

data==ch)return1;

//查找成功返回1

elseGL=GL->

//否则继续向后查找

else{//处理子表结点。

intx=Find(GL->

sublist,ch);

//向子表中继续查找。

if(x)//若在子表中查找成功则返回1,否则继续向后查找。

return1;

else

GL=GL->

//当查找到表为空时返回0。

第四章栈和队列

4.1单选题

1.A2.B3.C4.B5.D6.C

7.C8.A9.C10.B11.A12.D

13.D14.A15.C16.D17.B

4.2填空题(给单号题解答)

1.队尾队首

3.栈顶指针写入

5.Q.front==Q.rear(Q.rear+1)%MaxSize==Q.front

7.新结点的指针域栈顶指针

9.top==0

11.3x2+*5-

13.相反次序

15.返回地址

17.pop(S)pop(S)push(S,d)

4.3运算题(给单号题解答)

1.

(1)个序列可以得到,操作过程为:

push(S,A),push(S,B),push(S,C),pop(S),push(S,D),pop(S),pop(S),push(S,E),pop(S),push(S,F),pop(S),pop(S)。

(2)个序列可以得到,操作过程为:

push(S,A),pop(S),push(S,B),pop(S),push(S,C),push(S,D),push(S,E),pop(S),pop(S),push(S,F),pop(S),pop(S)。

第(3)个序列不可以得到,因为按照栈的后进先出或者称先进后出的原则,当A,B,C,D相继入栈,再做两次出栈时,A和B仍在栈中,此后只能B在A前面出栈,而在此序列中出现了A先于B出栈的情况,所以说此序列是错误的。

第(4)个序列不可以得到,因为在某一时刻,C和D同在栈中,并且D是栈顶,此后只能D先于C出栈,而在此序列中出现了C先于D出栈的情况,所以是错误的。

3.

0123456

80

34

23

45

67

rearfront

15

36

48

4.4算法分析题(给单号题解答)

1.求出数组a中n个元素之和。

3.把一个正整数num转换为一个十六进制数输出

4.5算法设计题(给单号题解答)

1.intSquareSum(intn)

if(n==0)return0;

elsereturnn*n+SquareSum(n-1);

3.递归算法为:

intFib(intn)

if(n==1||n==2)returnn-1;

//终止递归条件

elsereturnFib(n-1)+Fib(n-2);

非递归算法为:

intFib1(intn)

inta,b,c;

//c代表当前项,a和b分别代表当前项前面的

//第2项和第1项

a=0;

b=1;

//分别给a和b赋初值

elsefor(inti=3;

=n;

c=a+b;

//求出当前项

a=b;

//把前面第1项赋给前面第2项

b=c;

//把当前项赋给前面第1项

returnc;

//返回所求的第n项

5.参考算法如下:

voidInitStack(BothStack&

BS,intk)

if(k==1)

BS.top1=-1;

elseif(k==2)

BS.top2=MaxSize;

elseif(k==3){

voidClearStack(BothStack&

{//函数体同上

boolStackEmpty(BothStack&

returnBS.top1==-1;

returnBS.top2==MaxSize;

elseif(k==3)

return(BS.top1==-1)&

(BS.top2==MaxSize);

else{

cerr<

k的值不正确!

ElemTypePeek(BothStack&

if(k==1){

if(BS.top1==-1){

Stack1isempty!

returnBS.stack[BS.top1];

elseif(k==2){

if(BS.top2==MaxSize){

Stack2isempty!

returnBS.stack[BS.top2];

voidPush(BothStack&

BS,intk,constElemType&

if(BS.top1==BS.top2-1){

Stackoverflow!

BS.top1++;

BS.stack[BS.top1]=item;

BS.top2--;

BS.stack[BS.top2]=item;

ElemTypePop(BothStack&

BS.top1--;

returnBS.stack[BS.top1+1];

BS.top2++;

returnBS.stack[BS.top2-1];

任何递归算法都可以编写为非递归算法的形式,这通常需要在非递归算法中定义和使用栈。

对于求解迷宫问题同样可以编写出递归算法,为此需要定义栈中的元素类型ElemType为描述迷宫中当前位置的结构类型,该结构类型为:

structitems//定义描述迷宫中当前位置的结构类型

{

intx,y,d;

//x和y分别表示当前位置的行坐标和列坐标,

//d表示移动到下一步的方向

};

求解迷宫的非递归算法如下:

voidSeekPath(intm,intn)

//查找m*n迷宫中从入口(1,1)到出口(m,n)的一条通路

//将入口点访问标记置为1,表示将访问它

mark[1][1]=1;

//定义栈并初始化,栈的元素类型为items

StackSqS;

InitStack(S,5);

//定义temp为进出栈的变量

itemstemp;

//将入口点位置及方向初值-1压入栈

temp.x=1;

temp.y=

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2