数据结构徐孝凯编著部分习题参考解答.docx
- 文档编号:10828020
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:42
- 大小:51.72KB
数据结构徐孝凯编著部分习题参考解答.docx
《数据结构徐孝凯编著部分习题参考解答.docx》由会员分享,可在线阅读,更多相关《数据结构徐孝凯编著部分习题参考解答.docx(42页珍藏版)》请在冰豆网上搜索。
数据结构徐孝凯编著部分习题参考解答
数据结构(徐孝凯编著)部分习题参考解答
第一章绪论
1.1单选题
1.A2.D3.B4.C5.D6.B7.D
1.2填空题(给单号题解答)
1.集合结构,线性结构,树结构,图结构(次序无先后)
3.1:
1,1:
N,M:
N(或者1对1,1对N,M对N)
5.引用
7.实参,值
9.sizeof(a),a+i(或者&a[i],或者(char*)a+i*sizeof(a[i]))
11.n,n(n+1)/2,O(n2)
13.O(n3)
15.35/12
提示:
在含有n个元素的数表中顺序查找任一元素的平均比较次数为
,pi为查找第i个元素的概率,ci是查找第i个元素时需要比较的元素数,查找所有元素的概率之和为1,若查找每个元素的概率相同,则平均查找长度的计算公式可简化为
。
计算此题的计算式为
1.4算法分析题(给单号题解答)
1.判断n是否是一个素数,若是则返回数值1,否则返回0。
该算法的时间复杂度为O(
)。
3.计算
的值。
时间复杂度为O(n2)。
5.打印出一个具有n行的乘法表,第i行(1≤i≤n)中有n-i+1个乘法项,每个乘法项为i与j(i≤j≤n)的乘积。
时间复杂度为O(n2)。
7.矩阵相乘,即a[M][N]×b[N][L]→c[M][L]。
时间复杂度为O(M×N×L)。
1.5算法设计题
1.(给单号题解答)
(1)voidInitQuadratic(Quadratic&q,floataa,floatbb,floatcc)
{
q.a=aa;
q.b=bb;
q.c=cc;
}
(3)floatEval(Quadratic&q,floatx)
{
return(q.a*x*x+q.b*x+q.c);
}
(5)voidPrint(Quadratic&q)
{
if(q.a)cout< if(q.b) if(q.b>0) cout<<"+"< else cout< if(q.c) if(q.c>0) cout<<"+"< else cout< cout< } 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 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 for(i=0;i { if(a[i]<0||a[i]>200) return0;//返回数值0表示数组中数据有错,统计失败。 for(j=0;j<5;j++)//查找a[i]所在的区间 if(a[i] c[j]++;//使统计相应区间的元素增1 } return1;//返回数值1表示统计成功 } 时间复杂度为O(n) 3.(给单号题解答) (1)voidInitSet(intm[]) { for(inti=1;i<=SETSIZE;i++) m[i]=0; } (3)voidSetUnion(intm1[],intm2[],intm3[]) { InitSet(m3); for(inti=1;i<=SETSIZE;i++) 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;return1;} 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算法设计题(给单号题解答) 1. boolDeleteSet1(SetSq&S,ElemTypeitem) { for(inti=0;i 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<<"集合为空! "< (1);} ElemTypex=S.set[0]; for(inti=1;i 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 if(L.list[j]==x)i++; returni; } //从带头结点的单链接存储的线性表上统计出值为x的元素个数的算法。 intCount(sNode*HL,ElemTypex) { sNode*p=HL->next;//将指向第一个结点的指针赋给p inti=0;//用i作为统计变量 while(p! =NULL){ if(p->data==x)i++; p=p->next; } returni; } 3. //从顺序存储的线性表上删除所有其值重复的多余元素,使所有元素的值均不同。 voidDelete2(ListSq&L) { inti=0; //每循环一次将删除list[i]后面与此值相同的的所有元素 while(i intj=i+1; while(j { if(L.list[j]==L.list[i]){//从顺序表中删除data[j]元素 intk; for(k=j+1;k L.list[k-1]=L.list[k]; L.len--; } elsej++; } i++; } } //从单链接存储的线性表上删除所有其值重复的多余结点,使所有结点的值均不同。 voidDelete2(sNode*&HL) { sNode*p=HL;//p指向第一个结点 while(p! =NULL){ //用t2指向待处理的结点,t1指向t2的前驱结点 sNode*t1=p,*t2=p->next; //此循环将从p后面的单链表中删除所有与p结点值相同的结点 while(t2! =NULL){ if(t2->data==p->data){//删除t2结点 t1->next=t2->next; deletet2; t2=t1->next;//t2指向新的结点 } else{//指针后移,以便处理下一个结点 t1=t2;t2=t2->next; } } p=p->next;//p指向下一个结点 } } 5. voidInsert(sNode*&HL,constElemType&item) { sNode*newptr; newptr=newsNode; newptr->data=item; sNode*ap,*cp; ap=HL;cp=HL->next; while(cp! =HL) if(item else{ap=cp;cp=cp->next;} newptr->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; //把新结点插入到表头。 newptr->next=HL->next; HL->next=newptr; } //从表头开始顺序查找出第s个结点,对应第一个开始报数的人 sNode*ap=HL,*cp=HL->next; for(i=1;i //ap和cp指针后移一个位置。 ap=cp; cp=cp->next; //若cp指向了表头附加结点,则仍需后移ap和cp指针, //使之指向表头结点。 if(cp==HL){ap=HL;cp=HL->next;} } //依次使n-1个人出列。 for(i=1;i //顺序查找出待出列的人,即为循环结束后cp所指向的结点 for(intj=1;j ap=cp; cp=cp->next; if(cp==HL){ap=HL;cp=HL->next;} } //输出cp结点的值,即出列的人 cout< //从单链表中删除cp结点 ap->next=cp->next; deletecp; //使cp指针指向被删除结点的后继结点 cp=ap->next; //若cp指向了表头附加结点,则后移ap和cp指针 if(cp==HL){ap=HL;cp=HL->next;} } //使最后一个人出列。 cout< //删除表头结点和表头附加结点。 deleteHL->next; deleteHL; } 9. intFind(GLNode*GL,charch) //从广义表GL中查找单元素字符等于ch的算法,若查找成功 //则返回数值1,否则返回数值0。 { while(GL! =NULL){ if(GL->tag==0){//处理单元素结点 if(GL->data==ch)return1;//查找成功返回1 elseGL=GL->next;//否则继续向后查找 } else{//处理子表结点。 intx=Find(GL->sublist,ch);//向子表中继续查找。 if(x)//若在子表中查找成功则返回1,否则继续向后查找。 return1; else GL=GL->next; } } return0;//当查找到表为空时返回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 0123456 34 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赋初值 if(n==1||n==2)returnn-1; elsefor(inti=3;i<=n;i++){ 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){ BS.top1=-1; BS.top2=MaxSize; } } voidClearStack(BothStack&BS,intk) {//函数体同上 } boolStackEmpty(BothStack&BS,intk) { if(k==1) returnBS.top1==-1; elseif(k==2) returnBS.top2==MaxSize; elseif(k==3) return(BS.top1==-1)&&(BS.top2==MaxSize); else{ cerr<<"k的值不正确! "; exit (1); } } ElemTypePeek(BothStack&BS,intk) { if(k==1){ if(BS.top1==-1){ cerr<<"Stack1isempty! "< exit (1); } returnBS.stack[BS.top1]; } elseif(k==2){ if(BS.top2==MaxSize){ cerr<<"Stack2isempty! "< exit (1); } returnBS.stack[BS.top2]; } else{ cerr<<"k的值不正确! "; exit (1); } } voidPush(BothStack&BS,intk,constElemType&item) { if(BS.top1==BS.top2-1){ cerr<<"Stackoverflow! "< exit (1); } if(k==1){ BS.top1++; BS.stack[BS.top1]=item; } elseif(k==2){ BS.top2--; BS.stack[BS.top2]=item; } } ElemTypePop(BothStack&BS,intk) { if(k==1){ if(BS.top1==-1){ cerr<<"Stack1isempty! "< exit (1); } BS.top1--; returnBS.stack[BS.top1+1]; } elseif(k==2){ if(BS.top2==MaxSize){ cerr<<"Stack2isempty! "< exit (1); } BS.top2++; returnBS.stack[BS.top2-1]; } else{ cerr<<"k的值不正确! "; exit (1); } } 7. 任何递归算法都可以编写为非递归算法的形式,这通常需要在非递归算法中定义和使用栈。 对于求解迷宫问题同样可以编写出递归算法,为此需要定义栈中的元素类型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=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 徐孝凯 编著 部分 习题 参考 解答
![提示](https://static.bdocx.com/images/bang_tan.gif)