数据结构习题有答案.docx
- 文档编号:27378766
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:14
- 大小:75.98KB
数据结构习题有答案.docx
《数据结构习题有答案.docx》由会员分享,可在线阅读,更多相关《数据结构习题有答案.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构习题有答案
第1章绪
有下列几种二元组表示的数据结构,试画出它们分别对应的图形表示,并指出它们分别属于何种结构。
(1)A=(D,R),其中,D={a1,a2,a3,a4},R={}
(2)B=(D,R),其中,D={a,b,c,d,e},R={(a,b),(b,c),(c,d),(d,e)}
(3)C=(D,R),其中,D={a,b,c,d,e,f,g},R={(d,b),(d,g),(b,a),(b,c),(g,e),(e,f)}
(4)K=(D,R),其中,D={1,2,3,4,5,6},R={<1,2>,<2,3>,<2,4>,<3,4>,<3,5>,<3,6>,<4,5>,<4,6>}
(1)集合
(2)线性表
(3)树
(4)图
设n为正整数,求下列各程序段中的下划线语句的执行次数。
@
(1)i=1;k=0
while(i<=n-1)
{
k+=10*i;
i++;
}
(2)for(inti=1;i<=n;i++)
for(intj=1;j<=n;j++)
…
{c[i][j]=0;
for(intk=1;k<=n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j]
}
解:
(1)n-1
(2)
(3)x=0;y=0;
for(inti=1;i<=n;i++)
、
for(intj=1;j<=i;j++)
for(intk=1;k<=j;k++)
x=x+y;
(3)
指出下列个算法的功能,并求其时间复杂度。
(1)intsum1(intn)
{
intp=1,s=0;
for(inti=1;i<=n;i++)
[
{p*=i;s+=p;}
returns;
}
(2)intsum2(intn)
{ints=0;
for(inti=1;i<=n;i++)
{intp=1;
for(intj=1;j<=i;j++)p*=j;
s+=p;
}
…
returns;
}
解:
(1)
T(n)=O(n)
(2)
T(n)=O(n2)
算法设计
有3枚硬币,其中有1枚是假的,伪币与真币重量略有不同。
如何借用一架天平,找出伪币以流程图表示算法。
上机练习题
:
要求:
给出问题分析、算法描述、源程序及运行截图,在线提交。
1.设a,b,c为3个整数,求其中位于中间值的整数。
第2章线性表
1.设计算法:
在顺序表中删除值为e的元素,删除成功,返回1;否则,返回0。
intSqlist
:
DeleteElem(Te)
{for(i=1;i<=length;i++)
分析顺序表中元素定位算法intSqList
:
Locate(Te)的时间复杂度。
】
解:
设表长为n,等概率下,每个元素被定位的概率为:
p=1/n
定位成功第i个元素,需比较i次
3.对于有头结点的单链表,分别写出定位成功时,实现下列定位语句序列。
(1)定位到第i个结点ai;
p=head;j=0;
while(p&&jnext;j++;}
(2)定位到第i个结点的前驱ai-1;
p=head;j=0;
|
while(p&&j
(3)定位到尾结点;
p=head;
while(p->next)p=p->next;
(4)定位到尾结点的前驱。
p=head;
while(p->next->next)p=p->next;
4.描述一下三个概念的区别:
头指针,头结点,首元结点。
并给予图示。
头指针:
是一个指针变量,里面存储的是链表中首结点的地址,并以此来标识一个链表。
头结点:
附加在第一个元素结点之前的一个结点,头指针指向头结点。
;
首元结点:
指链表中的第一个元素结点。
5.对于无头结点单链表,给出删除第i个结点的算法描述。
template
TLinkList
:
Delete(inti)
template
TLinkList
:
Delete(inti){
用教材定义的顺序表的基本操作实现下列操作:
template
intDeleteElem(SqListL,Te)
…
#include““
template
intDeleteElem(SqListL,Te){
已知L是有表头结点的单链表,且P结点既不是首元结点,也不是尾结点,试写出实现下列功能的语句序列。
(1)在P结点后插入S结点;
(2)在P结点前插入S结点;
(3)在表首插入S结点;
(4)在表尾插入S结点.
【解】
(1)s->next=p->next;p->next=s;
(2)~
(3)q=L;
while(q->next!
=p)q=q->next;
s->next=p或q->next;
q->next=s;
(3)s->next=L->next;L->next=s;
(4)q=L;
while(q->next!
=NULL)q=q->next;
s->next=q->next;q->next=s;
上机练习题
.
要求:
给出问题分析、算法描述、源程序及运行截图,在线提交。
编程实现:
删除单链表中值为e的元素。
第3章栈与队列
1.铁路进行列车调度时,常把站台设计成栈式结构的站台,如右图所示。
试问:
若进站的六辆列车顺序如上所述,那么是否能够得到325641和154623的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。
解:
325641可以
154623不可以。
2.简述以下算法的功能(栈的元素类型为int)。
(1)statusalgo_1(SqStackS){
inti,n,A[255];
/
n=0;
while(!
()){n++;A[n]=();}
for(i=1;i<=n;i++)(A[i]);
}
(2)statusalgo_2(SqStackS,inte){
SqStackT;
intd;
while(!
()){
d=();
if(d!
=e)(d);}
、
while(!
()){
d=();
(d);}
}
解:
(1)借助一个数组,将栈中的元素逆置。
(2)借助栈T,将栈S中所有值为e的数据元素删除之。
3.编写一个算法,将一个非负的十进制整数N转换为B进制数,并输出转换后的结果。
当N=248D,B分别为8和16时,转换后的结果为多少
#include“”
intNumTrans(intN,intB){
简述栈和队列的逻辑特点,各举一个应用实例。
;
6.写出下列中缀表达式的后缀表达式。
(1)-A+B-C+D
(2)(A+B)*D+E/(F+A*D)+C
(3)A&&B||!
(E>F)
(1)A-B+C-D+
(2)AB+D*EFAD*+/+C+
(3)AB&&EF!
||
7.计算后缀表达式:
45*32+-的值。
解:
15
8.将下列递推过程改写为递归过程。
}
voidrecursion(intn){
inti=n;
while(i>1){
cout<
}
解:
voidrecurision(intj)
{if(j>1)
{cour< recurision(j-1);} } 。 9..将下列递归过程改写为非递归过程。 voidtest(int&sum){ intx; cin>>x; if(x==0)sum=0; else{ test(sum);sum+=x;} cout< } 解: voidtest(int&sum) / {stackS; 简述以下算法的功能(栈和队列的元素类型均为int)。 voidalgo(Queue&Q) { StackS; 假设以数组se[m]存放循环队列的元素,同时设变量rear和front分别作为队首、队尾指针,且队首指针指向队首前一个位置,队尾指针指向队尾元素处,初始时,rear==fornt==-1。 写出这样设计的循环队列入队、出队的算法。 解: 采用教材队空与队满判别方法。 为了区分队空与队满条件,牺牲一个元素空间。 即: rear==front,为队空;rear==(front+1)%m,为队满。 > template voidEnQueue(TSe[],Te,intm){ 助栈,实现单链表上的逆置运算。 } 第4章串 1.试问执行以下函数会产生怎样的输出结果 voiddemonstrate() { StrAssign(s,'THISISABOOK'); StrRep(s,StrSub(s,3,7),'ESEARE'); StrAssign(t,StrConcat(s,'S')); StrAssign(u,'XYXYXYXYXYXY'); StrAssign(v,StrSub(u,6,3)); [ StrAssign(w,'W'); cout<<“'t=”< cout<<“v=”< cout<<“u=”< } 字符串S=‘aabaabaabaac',P=‘aabaac' 1)给出S和P的next值和nextval值; 2)若S作主串,P作模式串,试给出KMP算法的匹配过程。 ( 1)S的next与nextval值分别为0和0009, p的next与nextval值分别为012123和002003 2)利用KMP算法的匹配过程: 第一趟匹配: aabaabaabaac aabaac(i=6,j=6) 第二趟匹配: aabaabaabaac (aa)baac 第三趟匹配: aabaabaabaac (成功)(aa)baac 3.算法设计 $ 串结构定义如下: structSString { char*data; }; (1)编写一个函数,计算一个子串在一个字符串中出现的次数,如果不出现,则为0。 intstr_count(SStringS,SStringT) | 解: intstr_count(SStringS,SStringT){ inti,j,k,count=0; for(i=0;[i];i++){ for(j=i,k=0;[j]==[k];j++,k++) if(k== count++; } returncount; } (2)编写算法,从串s中删除所有和串t相同的子串。 ? 解: intSubString_Delete(SString&s,SStringt) 已知下列字符串 a='THIS',f='ASAMPLE',c='GOOD',d='NE',b='', s=StrConcat(a,StrConcat(StrSub(f,2,7),StrConcat(b,StrSub(a,3,2)))), t=StrRep(f,StrSub(f,3,6),c), u=StrConcat(StrSub(c,3,1),d),g='IS', { v=StrConcat(s,StrConcat(b,StrConcat(t,StrConcat(b,u)))), 试问: s,t,v,StrLength(s),StrIndex(v,g),StrIndex(u,g)各是什么 已知: s='(XYZ)+*',t='(X+Z)*Y'。 试利用下列运算,将s转化为t。 联接: StrConcat(&S,T) 求子串: (char*)StrSub(S,i,len) 置换: StrRep(&S,T,R) 上机练习题 要求: 给出问题分析、算法描述、源程序及运行截图,在线提交。 " 串结构定义如下: structSString { char*data; }; 求: 串S所含不同字符的总数和每种字符的个数,不区分英文字母的大小写。 第5章数组与压缩矩阵 1.假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。 已知A的起始存储位置(基地址)为1000,计算: 、 (1)数组A的体积(即存储量); (2)数组A的最后一个元素a57的第一个字节的地址; (3)按行存储时,元素a14的第一个字节的地址; (4)按列存储时,元素a47的第一个字节的地址。 解: (1)6×8×6=288Byte (2)1000+288-6=1282; (3)1000+(1×8+4)×6=1072 (4)1000+(7×6+4)×6=1276 2.假设按低下标优先存储整数数组A9×3×5×8时,第一个元素的字节地址是100,每个整数占四个字节。 问下列元素的存储地址是什么 》 (1)a0000 (2)a8247 解: (1)100 (2)100+8×3×5×8+2×5×8+4×8+7=4500 3.一个稀疏矩阵如图所示 (1)给出三元组存储示意图; (2)给出带行指针向量的链式存储示意图; (3)十字链表存储示意图。 (1) (2) (3) % 4.算法设计: 一个按行优先存储的n*n矩阵,就地转置。 解: voidtrans(ElemTypeA[],intn){ inti,j; ElemTypetmp; for(i=0;i for(j=0;j A[i*n+j]A[j*n+i]; } ! } 5.算法设计: 设定整数数组B[m][n]的数据在行列方向上都按从小到大的顺序排列,且整型变量x中的数据在B中存在。 试设计一个算法,找出一对满足B[i][j]==x的i,j值。 要求比较次数不超过m+n。 解: voidfind(intB[][],intx,intm,intn){ inti=0,j=n-1; while(B[i][j]! =x){ if(B[i][j]>x)j--; elsei++; } out<<”i=”< }//# $ 上机练习题 要求: 给出问题分析、算法描述、源程序及运行截图,在线提交。 选用数组作为数据结构,编程求解Josephus问题。 手工推演下列测试用例,并检查程序的正确性。 人数n 开始报数的人s 密码m 、 9 1 5 9 1 0 9 1 10 殷习P302-2 n=,s=1,m=5时, 出局顺序为: 5,1,7,4,3,6,9,2,8 m=0,报错,m=0是无效参数; m=10,时间代价最大 出局顺序为: 1,3,6,2,9,5,7,4,8 源程序 VoidJosephus(inA[],intn,s,m){ inti,j,k,tmp; if(m==0){ cerr<<”m=0是无效的参数! ”< return;} for(i=0;i i=s-1;//报名超始位置 for(k=n;k>=1;k--){//逐个出局,执行n-1次; if(i==k)i=0;//第n个人,下标为0 i=(i+m-1)%k;//寻找出局位置 if(i! =k-1){//把出局者移到最后 tmp=A[i];//保留出局序号 for(j=i;j A[k-1]=tmp;}//出局者移至k-1处 } for(k=0;k A[k]=A[n-k-1]; A[n-k-1]=tmp;} } $
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题 答案