数据结构习题有答案讲解.docx

上传人:b****4 文档编号:5043701 上传时间:2022-12-12 格式:DOCX 页数:18 大小:26.84KB
下载 相关 举报
数据结构习题有答案讲解.docx_第1页
第1页 / 共18页
数据结构习题有答案讲解.docx_第2页
第2页 / 共18页
数据结构习题有答案讲解.docx_第3页
第3页 / 共18页
数据结构习题有答案讲解.docx_第4页
第4页 / 共18页
数据结构习题有答案讲解.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构习题有答案讲解.docx

《数据结构习题有答案讲解.docx》由会员分享,可在线阅读,更多相关《数据结构习题有答案讲解.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构习题有答案讲解.docx

数据结构习题有答案讲解

第1章绪有以下几种二元组表示的数据结构,试画出它们分别对应的图形表示,并指出它们分别属于何种结构。

A=(D,R),其中,D={a1,a2,a3,a4},R={}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>}

设n为正整数,求以下各程序段中的下划线语句的执行次数。

(1)i=1;k=0

(2)for(inti=1;i<=n;i++)while(i<=n-1)for(intj=1;j<=n;j++){{c[i][j]=0;k+=10*i;for(intk=1;k<=n;k++)i++;c[i][j]=c[i][j]+a[i][k]*b[k][j]}}(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;

集合abcde

线性表

1

d

b

g

ac

e

3

(3)树

f

(4)

解:

(1)n-1

n

n

n

(2)

1n3

i1

j1

k1

n

i

j

1

n

i

j

ni(i

1)

1n

i2

1n

i

(3)i1

j

1k

1

i1

j

1

i1

2

2i

1

2i1

n(n1)(n2)6

25461n(n1)(2n1)1n(n1)2622

指出以下个算法的功能,并求其时间复杂度。

(1)intsum1(intn)

(2)intsum2(intn){{ints=0;intp=1,s=0;for(inti=1;i<=n;i++)for(inti=1;i<=n;i++){intp=1;{p*=i;s+=p;}for(intj=1;j<=i;j++)p*=j;returns;s+=p;}}returns;}算法设计有3枚硬币,其中有1枚是假的,伪币与真币重量略有不同。

如何借用一架天平,找出伪币?

以流程图表示算法。

上机练习题要求:

给出问题分析、算法描述、源程序及运行截图,在线提交。

1.设a,b,c为3个整数,求其中位于中间值的整数。

解:

n

(1)

i!

T(n)=O(n)

i

1

n

T(n)=O(n2)

(2)

i!

i

1

开始

A=B?

C是伪币

A=C?

B是伪币

A是伪币

结束

第2章线性表

1.设计算法:

在顺序表中删除值为

e的元素,删除成功,返回1;intSqlist:

:

DeleteElem(Te)

否那么,返回0。

{for(i=1;i<=length;i++)//

按值顺序查找

*i可从0开始

if(elem[i-1]==e)

//

找到,进行删除操作

{for(j=i;j

//ai至an依次前移

Elem[j-1]=elem[j];

length--;

//表长减一

return1;

//删除成功,返回

1

}

return

0;

//未找到,删除不成功,返回

0

}

2.分析顺序表中元素定位算法

intSqList:

:

Locate(Te)解:

设表长为

n,等概率下,每个元素被定位的概率为:

p=1/n

的时间复杂度。

定位成功第i

个元素,需比拟i次

nf(n)i1

1

i

1

n

i

1

n(n1)

n1

n

n

i1

n

2

2

3.对于有头结点的单链表,分别写出定位成功时,实现以下定位语句序列。

(2)定位到第i个结点ai;定位到第i个结点的前驱ai-1;

p=head;j=0;while(p&&jnext;j++;}p=head;j=0;while(p&&jnext;j++;}

(3)定位到尾结点;

p=head;

while(p->next)

p=p->next;

(4)定位到尾结点的前驱。

p=head;while(p->next->next)

p=p->next;

4.描述一下三个概念的区别:

头指针,头结点,首元结点。

并给

头指针:

是一个指针变量,里面存储的是链表中首结点的地址,并以此来标识一个链表。

予图示。

头结点:

附加在第一个元素结点之前的一个结点,头指针指向头结点。

首元结点:

指链表中的第一个元素结点。

头指针

头结点

(元)结点

尾(元)结点

⋯...an^

a

1

a2

5.

对于无头结点单链表,给出删除第

i个结点的算法描述。

template

template

TLinkList:

:

Delete(inti)

{//在单链表上删除第

i个数据元素

TLinkList:

:

Delete(inti)

if(head==NULL)throw

“表空!

〞;//空表,不能删

elseif(i==1)

{//删除第

1个元素

p=Head;x=p->data;

//

保存被删元素值

Head=p->next;

deletep;

}

else{//元素定位到第ai-1

p=Head;j=1;//

定位查找起始位置

while{p->next&&j

p=p->next;j++;}

if(!

p->next||j>i-1);//

定位失败

throw“删除位置不合理〞;

else{//定位成功,进行结点删除

q=p->next;

x=p>data;

p->next=q->next;

deleteq;

}

retrunx;//返回被删除元素值

}//#

6.

用教材定义的顺序表的根本操作实现以下操作:

#include““

template

template

intDeleteElem(SqListL,Te)

intDeleteElem(SqListL,Te){//

i=L.LocateElem(e);//按值查找

7.L是有表头结点的单链表,且P结点既不是首元结点,也不是尾结点,试写出实现以下功能的语句序列。

在P结点后插入S结点;在P结点前插入S结点;在表首插入S结点;在表尾插入S结点.上机练习题要求:

给出问题分析、算法描述、源程序及运行截图,在线提交。

编程实现:

删除单链表中值为e的元素。

if(!

i)//未找到

return0;else//找到delete(i);//删除被找到的元素}【解】s->next=p->next;p->next=s;q=L;while(q->next!

=p)q=q->next;s->next=p或q->next;->next=s;s->next=L->next;L->next=s;q=L;while(q->next!

=NULL)q=q->next;s->next=q->next;q->next=s;

第3章栈与队列铁路进行列车调度时,常把站台设计成栈式结构的站台,如右图所示。

试问:

假设进站的六辆列车顺序如上所述,那么是否能够得到325641和154623的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。

解:

325641可以

154623不可以。

123456

2.简述以下算法的功能〔栈的元素类型为

int〕。

解:

(1)借助一个数组,将栈中的元素逆置。

(1)statusalgo_1(SqStackS){

inti,n,A[255];

n=0;

while

(!

S.StackEmpty())

{n++;A[n]=S.Pop();

}

(2)借助栈T,将栈S中所有值为e的数据元素删除之。

for(i=1;i<=n;i++)S.Push(A[i]);

}

(2)statusalgo_2(SqStackS,inte){

SqStackT;

intd;

while

(!

S.tackEmpty())

{

d=S.Pop();

if

(d!

=e)T.Push(d);

}

while

(!

T.StackEmpty())

{

d=T.Pop();T.Push(d);}}

3.编写一个算法,将一个非负的十进制整数N转换为B进制数,并输出转换后的结果。

当N=248D,B分别为8和16时,转换后的结果为多少?

#include“〞intNumTrans(intN,intB){//十进制整数N转换为B进制数stackS;//建立一个栈

while(N!

=0){//N非零i=N%B;//从低到高,依次求得各位

N=N/B;

S.push(i);

}//各位入栈

while(!

S.StackEmpty()){//

栈不空

{i=S.pop();

If(i>9)i=

’A’+10-i;

cout<

}

}//#

4借且栈,设计算法:

假设一个算术表达式中包含

“(、〞“)括〞号,解:

以字符串存储表达式,也可以边输入边判断。

对一个合法的数学表达式来说,括号

“(和〞“)应〞是相互匹配的。

顺序扫描表达式,左括号,入栈;右括号,如果此时栈空,表示多右括号,不匹

假设匹配,返回1;否那么,返回0。

配;如果栈不空,出栈一个左括号。

扫描结束,如果栈空,表示括号匹配;否那么,括

号不匹配,多左括号。

intblank_match(char*exp)

{

用字符串存表达式

SqStack

s;

//

创立一个栈

char*p=exp;//

工作指针p指向表达式首

while(*p!

=’=’)

{//

不是表达式结束符

switch(p){

case’(’:

//左括号,入栈

s.push(ch);

break;

case’)’//右括号

if(s.StackEmpty())

return0;//栈空,不匹配,多右括号

else{s.Pop();break;}//左括号出栈

}//switch

p++;//取表达式下一个字符}//whileif(!

s.StackEmpty())//表达式结束,栈不空

return0;//不匹配,多左括号elsereturn1;//匹配}//#简述栈和队列的逻辑特点,各举一个应用实例。

6.写出以下中缀表达式的后缀表达式。

(1)

A-B+C-D+

(1)-A+B-C+D

(2)

AB+D*EFAD*+/+C+

(2)(A+B)*D+E/(F+A*D)+C

(3)

AB&&EF!

||

(3)A&&B||!

(E>F)

7.计算后缀表达式:

45*32+-

的值。

解:

15

8.将以下递推过程改写为递归过程。

解:

voidrecurision(intj)

voidrecursion(intn){inti=n;while(i>1){

{if(j>1){cour<

}

cout<

}

}

9..将以下递归过程改写为非递归过程。

解:

voidtest(int&sum)

voidtest(int&sum){

{stackS;//借助一个栈

intx;

intx;

cin>>x;

cin>>x;

if(x==0)sum=0;

while(x){

else{

S.push(x);

test(sum);sum+=x;}

cin>>x;}

cout<

sum=0;

}

cout<

while(x=S.pop()){

sum+=x;cout<

}//

10.简述以下算法的功能〔栈和队列的元素类型均为int〕。

解:

利用栈,将队列中的元素逆置

voidalgo(Queue&Q){StackS;//创立一个栈intd;while(!

Q.QueueEmpty()){d=DeQueue(Q);S.Push(d);}while(!

S.StackEmpty()){d=S.Pop();Q.EnQueue(d);}}12.假设以数组se[m]存放循环队列的元素,同时设变量rear和front分别作为队首、队尾指针,且队首指针指向队首前一个位置,队尾指针指向队尾元素处,初始时,rear==fornt==-1。

写出这样设计的循环队列入队、出队的算法。

解:

采用教材队空与队满判别方法。

为了区分队空与队满条件,牺牲一个元素空间。

即:

rear==front,为队空;rear==(front+1)%m,为队满。

templatevoidEnQueue(TSe[],Te,intm){//入队if(rear+1)%m=fornt){//队满,不能插入throw“队满,不能插入!

〞else{rear=(rear+1)%m;//队尾指针后移se[rear]=e;//元素入队return;}}//#

templateTDnQueue(TSe[],intm){//出队if(rear==fornt)//队空,不能出队!

throw“队空,不能出队!

else{front=(front+1)%m;//指针后移,指向队首元素e=se[front];//取队首元素returne;}}//#

上机练习题要求:

给出问题分析、算法描述、源程序及运行截图,在线提交。

1.借助栈,实现单链表上的逆置运算。

第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=〞<

算法设计串结构定义如下:

structSString

解:

t=THESEAREBOOKS

v=YXYw=XWXWXW

1〕S的next与nextval

值分别为

和002002002021,

p的next与nextval

值分别为

012123和002003

2〕利用KMP算法的匹配过程:

第一趟匹配:

aabaabaabaacaabaac(i=6,j=6)第二趟匹配:

aabaabaabaac(aa)baac第三趟匹配:

aabaabaabaac(成功)(aa)baac

{char*data;//串首址intlen;//串长intStrSize;//存放数组的最大长度.};编写一个函数,计算一个子串在一个字符串中出现的次数,如果不出现,那么为0。

intstr_count(SStringS,SStringT)

(2)编写算法,从串s中删除所有和串t相同的子串。

解:

intstr_count(SStringS,SStringT){

inti,j,k,count=0;for(i=0;S.data[i];i++){for(j=i,k=0;(S.data[j]==T.data[k];j++,k++)if(k==T.len-1)count++;}returncount;}解:

intSubString_Delete(SString&s,SStringt)//从串s中删除所有与t相同的子串,并返回删除次数{for(n=0,i=0;i<=s.len-t.len;i++){for(j=0;&&s[i+j]==t[i];j++);if(j>t.len)//找到了与t匹配的子串{for(k=i;k

编写一个函数,求串s和串t的一个最长公共子串。

voidmaxcomstr(SString*s,SString*t)

;

n++;//被删除次数增1}}//forreturnn;}//Delete_SubString解:

voidmaxcomstr(SString*s,SString*t){intindex=0,len1=0,i,j,k,len2;i=0;//作为扫描s的指针while(i

=NULL;k++)len2++;if(len2>len1){//将较大长度者给index和len1index=i;len1=len2;}j+=len2;}//ifelsej++;}//whilecout<<〞最长公共子串:

〞for(i=0;i

cout<

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;

//串首址

intlen;intStrSize;

//串长//存放数组的最大长度

.

};

求:

S所含不同字符的总数和每种字符的个数,

不区分英文字

母的大小写。

第5章数组与压缩矩阵

1.假设有二维数组A6×8,每个元素用相邻的6

个字节存储,存储器按

解:

(1〕6×8×6=288Byte

字节编址。

A的起始存储位置(基地址)为

1000,计算:

(2〕1000+288-6=1282;

(1)

数组A

的体积〔即存储量〕

;

(3〕1000+(1×8+4)×6=1072

(2)

数组A

的最后一个元素

a57

的第一个字节的地址;

(4〕1000+(7×6+4)×6=1276

(3)

按行存储时,元素a14

的第一个字节的地址

;

(4)

按列存储时,元素a47

的第一个字节的地址。

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.一个稀疏矩阵如下图

0

3

0

0

0

0

(1)

0

2

0

5

0

0

给出三元组存储示意图;

A=

0

0

0

0

0

(2)

给出带行指针向量的链式存储示意图;

0

9

0

0

0

0

1

4×6

(3)十字链表存储示意图。

M.data[]

i

j

e

0

0

1

3

1

1

1

2

2

1

3

5

3

3

0

9

4

3

5

1

4

6

5

(2)

(1)

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

当前位置:首页 > 高中教育 > 初中教育

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

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