02331数据结构课后练习题.docx

上传人:b****7 文档编号:9429798 上传时间:2023-02-04 格式:DOCX 页数:53 大小:264.42KB
下载 相关 举报
02331数据结构课后练习题.docx_第1页
第1页 / 共53页
02331数据结构课后练习题.docx_第2页
第2页 / 共53页
02331数据结构课后练习题.docx_第3页
第3页 / 共53页
02331数据结构课后练习题.docx_第4页
第4页 / 共53页
02331数据结构课后练习题.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

02331数据结构课后练习题.docx

《02331数据结构课后练习题.docx》由会员分享,可在线阅读,更多相关《02331数据结构课后练习题.docx(53页珍藏版)》请在冰豆网上搜索。

02331数据结构课后练习题.docx

02331数据结构课后练习题

第1章概论

练习题

一、单项选择题

1.在数据结构中,从逻辑上可以把数据结构分为(B)

A.紧凑结构与非紧凑结构B.线性结构与非线性结构

C.内部结构与外部结构D.动态结构与静态结构

2.若结点得存储地址与其关键字之间存在某种映射关系,则称这种存储结构为(D)

A.顺序存储结构B.链式存储结构

C.索引存储结构D.散列存储结构

3.算法分析得两个主要方面就是(B)

A.正确性与简明性B.时间复杂性与空间复杂性

C.可读性与可维护性D.数据复杂性与程序复杂性

4.线性表采用链式存储结构时,要求内存中可用存储单元地址(A)

A.不一定连续得B.部分地址必须就是连续得

C.必须就是连续得D.一定就是不连续得

5.算法指得就是(C)

A.计算机程序B.解决问题得计算方法

C.解决问题得有限运算序列D.排序算法

二、填空题

6.数据结构一般包括逻辑结构、存储结构与数据运算三个方面得内容.

7.数据得逻辑结构可分为线性结构、非线性结构两大类.

8.数据得存储结构(物理结构)一般可以用顺序存储结构、链式存储结构、索引存储结构及散列存储结构等四种存储方法表示.

9.在选用求解一个问题得算法时,除了首先考虑算法就是“正确得”之外,还主要考虑执行算法所需要得时间、执行算法所需要得存储空间及算法应易于理解、易于编程、易于调试等三点。

10.设有一批数据元素,为了最快地存取某元素,宜用顺序结构存储,为了方便得插入一个元素,宜用链式结构存储.

三、应用题

设n为正整数,利用大“O”记号,写出下列各程序段得时间复杂度.

11.for(i=1;i<=n;i++){

y=y+1;

for(j=1;j<=2*n;j++)

x=x+1;

}

分析:

语句“y=y+1;”执行n次,语句“x=x+1;”各执行次,故该程序段得时间复杂度为O().

12.s=0;

while(n>=(s+1)*(s+1))

s=s+1;

分析:

语句“s=s+1;”执行次,故该程序段得时间复杂度为O().

13.x=1;

sum=0;

for(i=0;i<=n;i++){

x=x*i;

sum=sum+x;

}

分析:

语句“x=x*i”与“sum=sum+x;”各执行n次,故该程序段得时间复杂度为O(n).

14.for(i=1;i<=n;i++)

if(3*i<=n)

for(j=3*i;j<=n;j++){

x++;

y=3*x+2;

}

分析:

语句“x++”与“y=3*x+2;”各执行次,故该程序段得时间复杂度为O().

15.for(i=1;i<=n;i++)

for(j=1;j<=i;j++){

x=x+1;

}

分析:

语句“x=x+1;”执行次,故该程序段得时间复杂度为O().

16.sum=0;i=0;

while(i<=100){

sum=sum+i;

i++;

}

分析:

语句“sum=sum+i;”与“i++;”各执行100次,故该程序段得时间复杂度为O

(1).

17.x=1;

s=0;

for(i=1;i<=n;i++){

++x;

s+=x;

}

for(j=1;j<=n;j++)

for(k=1;k<=n;k++){

x++;

s=s+x;

}

分析:

语句“++x;”执行n次,语句“x++;”与“s=s+x;”各执行次,故该程序段得时间复杂度为O().

第2章线性表

练习题

一、单项选择题

1.在长度为n得顺序表得第i个位置上插入一个元素,元素得移动次数为(A)

A.B.C.D.

2.若一个顺序表中第一个元素得存储地址为1000,每个元素占4个地址单元,那么,第6个元素得存储地址应就是(A)

A.1020B.1010C.1016D.1024

3.带头结点得单链表(以head为头指针)为空得判断条件就是(C)

A.head!

=NULLB.head->next==head

C.head->next==NULLD.head==NULL

4.在单循环链表中,p指向表任一结点,判断表不就是访问结束得条件就是(B)

A.p!

=NULLB.p!

=headC.p->next!

=headD.p->next!

=NULL

5.在一个单链表中,已知q指向p所指向结点得前趋结点,若在p、q所指结点之间插入一个s所指向得新结点,则执行得操作就是(A)

A.q->next=s;s->next=pB.p->next=s;s->next=q

C.s->next=p->next;p->next=sD.p->next=s->next;s->next=p

6.在一个单链表中,若删除p指向结点得后继结点,则执行得操作就是(A)

A.q=p->next;p->next=p->next->next;free(q);

B.p=p->next;q=p->next;p=q->next;free(q);

C.q=p->next->next;p=p->next;free(q);

D.p=p->next->next;q=p->next;free(q);

二、填空题

7.在一个长度为n得顺序表中删除第i个元素,需要向前移动n-i个元素.

8.在顺序表中插入或删除一个元素,需要平均移动表长得一半个元素,具体移动得元素个数与插入或删除得位置有关.

9.顺序表中逻辑上相邻得元素在物理存储位置上一定相邻,链表结构中逻辑上相邻得元素在物理位置上不一定相邻.

10.已知顺序表中一个元素得存储位置就是x,每个元素占c个字节,求其后继元素位置计算公式为x+c,而已知单链表中某一结点由p指向,求此后继结点存储地址得操作为p->next.

11.在用p指针访问单链表时,判断不就是访问结束得条件就是p!

=NULL;在访问单循环链表时,判断不就是访问表结束得条件就是p!

=head.

12.已知p指向双向链表得中间某个结点,从给定得操作语句中选择合适得填空.

(1)在p结点后插入s结点得语句序列就是I、G、A、D.

(2)在p结点前插入s结点得语句序列就是C、N、H、B.

(3)删除p结点得直接后继结点得语句序列就是J、Q、E、M.

(4)删除p结点得直接前趋结点得语句序列就是K、P、F、M.

(5)删除p结点得语句序列就是O、R、L.

A.p->next=sB.p->prior=sC.s->next=p

D.s->prior=pE.p->next=p->next->nextF.p->prior=p->prior->prior

G.p->next->prior=sH.p->prior->next=sI.s->next=p->next

J.q=p->nextK.q=p->priorL.free(p)

M.free(q)N.s->prior=p->priorO.p->prior->next=p->next

P.p->prior->prior->next=pQ.p->next->next->prior=pR.p->next->prior=p->prior

13.下面就是一个在带头结点得单链表head中删除所有数据域值为x得结点得算法,但不完善,请在相应得地方填上适当得语句,使之成为完整得算法.

voidDeleX(LinkListhead,DataTypex)

{

LinkNode*p,*q,*s;

P=head;

q=p->next;

while(q!

=NULL)

if(q->data==x)

{

s=q;

q=q->next;

free(s);

p->next=q;

}

else

{

p=q;

q=q->next;

}

}

三、算法设计题

14.设有两个顺序表A与B,且都递增有序。

试写一算法,从A中删除与B中相同得那些元素(即计算A-B).

SeqListSubtraction(SeqListA,SeqListB)

{

inti,j,k=0;//令匹配位置为0

for(i=0;i

for(j=k;j

if(A、Data[i]==B、Data[j])

{

k=j;//记录比较到得位置

for(j=i;j

A、Data[j]=A、Data[j+1];//删除相同得元素

A、Length--;

break;

}

}

returnA;

}

15.已知head就是指向一个带头结点得单链表得头指针,p指向该链表得任一结点。

试写一算法,将p所指向得结点与其后继结点交换位置.

voidExchange(LinkListhead,LinkNode*p)

{

LinkNode*q,*s,*r;

q=p->next;

if(q!

=NULL)//判断所指结点就是否就是最后一个结点

{

if(p==head)//判断所指结点就是否就是头结点

{

head=head->next;//头结点指针域所指结点变成新得头结点

s=head->next;//记录第2个结点

head->next=p;//新得头结点指针域指向原头结点

p->next=s;//原头结点变成第1个结点后指针域指向第2个结点

}

else{

r=head;

while(r->next!

=p)

r=r->next;//查找p指向结点直接前趋

r->next=q;//p指向结点直接前趋指针域指向p指向结点直接后继

p->next=q->next;//p指向结点指针域指向p指向结点直接后继得直接后继

q->next=p;//p指向结点直接后继指针域指向p

}

}

elseprintf(“p指向得结点无后继节点!

”)

}

16.已知两条单链表A与B分别表示两个集合,其元素值递增有序。

试写一算法,求A与B得交集C,要求C同样以元素值递增得单链表形式存储.

LinkListIntersection(LinkListA,LinkListB)

{

LinkNode*p,*q,*r,*s;

LinkListC=(LinkNode*)malloc(SizeOf(LinkNode));

r=C;p=A;s=B;

while(p!

=null&&q!

=null){

if(p->datadata)p=p->next;

else

if(p->data>q->data)q=q->next;

else{

s=(LinkNode*)malloc(SizeOf(LinkNode));

s->data=p->data;s->next=NULL;r->next=s;

r=s;p=p->next;q=q->next;

}

}

}

17.设有一个带头结点得双向循环链表,head为链表得头指针。

试写一算法,实现在值为x得结点之前插入一个值为y得结点.

voidInsert(DlinkListhead,DataTypex,DataTypey)

{

DlistNode*p,*s;

s=(DlistNode*)malloc(SizeOf(DlistNode));

s->data=y;

p=head->next;

while(p!

=head&&p->data!

=x)

p=p->next;//查找结点值为x得结点

if(p==head)

printf(“没有值为x得结点!

”);

else

{

s->next=p;

s->prior=p->prior;

p->prior->next=s;

p->prior=s;

}

}

第3章栈与队列

练习题

一、单项选择题

1.栈得操作原则就是(C)

A.顺序进出B.后进后出C.后进先出D.先进先出

2.进栈序列为a,b,c,则通过入出栈操作可能得到得a,b,c得不同排列个数为(B)

A.4B.5C.6D.7

3.按字母a,b,c,d,e顺序入栈,则出栈得输出序列不可能就是(B)

A.decbaB.dceabC.abcdeD.edcba

4.判断一个顺序栈st(最多元素为StackSize)为栈满得条件表达式就是(D)

A.st、top!

=StackSizeB.st、top!

=0C.st、top!

=-1D.st、top==StackSize-1

5.在向顺序栈中压入元素时(C)

A.先存入元素,后移动栈顶指针B.谁先谁后无关紧要

C.先移动栈顶指针,后压入元素D.同时进行

6.一个队列得入队序列就是1,3,5,7,9,则出队得输出序列只能就是(B)

A.9,7,5,3,1B.1,3,5,7,9

C.1,5,9,3,7D.9,5,1,7,3

7.判断一个顺序队列sq(最多元素为QueueSize)为空队列得条件表达式为(A)

A.sq、rear==sq、frontB.sq、rear==0

C.sq、front==QueueSizeD.sq、rear==QueueSize+1

8.判断一个循环队列cq(最多元素为QueueSize)为满队列得条件表达式为(C)

A.cq、rear==cq、frontB.cq、rear==QueueSize

C.(cq、rear+1)%QueueSize==cq、frontD.cq、rear%QueueSize+1==cq、front

二、填空题

9.假设以S与X分别表示进栈与退栈操作,则对输入序列a,b,c,d,e进行一系列栈操作SSXSXSSXXX之后,得到得输出序列为b、c、e、d、a.

10.假设S、data[maxsize]为一个顺序存储得栈,变量top指示栈顶元素得位置。

能做进栈操作得条件就是S、top

x=S、data[S、top--].

11.设顺序栈存放在S、data[maxsize]中,栈底位置就是maxsize-1,则栈空条件就是S、top==maxsize,栈满条件就是S、top==0.

12.若循环队列用数组data[m]存储元素值,用front与rear分别作为头尾指针,则当前元素个数为(rear-front+m)%m.

13.栈与队列都就是线性结构;对于栈,只能在栈顶插入与删除元素;对于队列,只能在队尾插入元素,在队头删除元素.

14.从循环队列中删除一个元素时,其操作就是先取出队头元素,后移动队头指针.

三、解答题

15.如果编号为1,2,3得3辆列车进入一个栈式结构得站台,那么可能得到得3辆列车得出栈序列有哪些?

不可能出现得序列就是什么?

答:

可能出现得出栈序列有1、2、3,1、3、2,2、1、3,2、3、1,3、2、1,不可能出现得序列就是3、1、2。

16.假设输入栈得元素为a、b、c,在栈S得输出端得到一个输出序列为a、b、c,试写出在输入端所有可能得输入序列.

答:

可能得输入序列有a、b、c,a、c、b,b、a、c,c、b、a,c、a、b.

17.简述下面所给算法得功能(假设栈元素为整数类型).

(1)voidex31(SeqStack*S)

{

intA[80],i,n=0;

while(!

empty(s)){

A[n]=pop(s);//将栈内元素依次存入数组

n++;

}

for(i=0;i

push(S,A[i]);//将数组元素依次压入栈内

}

答:

该算法得功能就是将通过一个数组将栈内得所有元素逆序存放.

(2)voidex32(SeqStack*S,intc)

{

SeqStackT;

intd;

while(!

StackEmpty(S)){

d=pop(S);

if(d!

=c)

push(T,d);

}

while(!

StackEmpty(T)){

d=pop(T);

push(S,d);

}

}

答:

该算法得功能就是通过一个中间栈,删除栈S中所有值为c得元素.

18.写出下列程序段得输出结果(栈结点数据域为字符型char).

SeqStackS;

charx=‘c’,y=‘k’;

push(S,x);//压入’c’,栈内’c’

push(S,‘a’);//压入’a’,栈内’ca’

push(S,y);//压入’k’,栈内’cak’

x=pop(S);//弹出’k’到x,栈内’ca’

push(S,‘t’);//压入’t’,栈内’cat’

push(S,x);//压入’k’,栈内’catk’

x=pop(S);//弹出’k’到x,栈内’cat’

push(S,‘s’);//压入’s’,栈内’cats’

while(!

StackEmpty(S)){

y=pop(S);

putchar(y);//依次弹出并输出栈内元素

}

putchar(x);//输出/k/

答:

程序段得输出结果就是stack.

19.在循环队列得顺序存储结构下,分别写出入队(插入元素)、出队(删除元素)时修改队尾、队头指针得操作语句以及求队列长度得公式.

答:

入队时修改队尾指针得语句为cq、rear=(cq、rear+1)%QueueSize,出队时修改队头指针得操作语句为cq、front=(cq、front+1)%QueueSize,求队列长度得公式为(cq、rear-cq、front+QueueSize)%Queue.

四、算法设计题

20.利用两个栈S1与S2模拟一个队列,如何用栈得运算来实现队列得插入与删除运算?

试写出算法.

设模拟得队列如下图所示.top1为队头指针,top2为队尾指针:

voidInsert(DataTypex,SeqStack*S1,SeqStack*S2)

{

if(top2==S2、Size)printf(“QueueFull!

”);

top2++;

if(top2>0)

S2、data[top2]=x;

elseS1、data[top2]=x;

}

DataTypeDelete(SeqStack*S1,SeqStack*S2)

{

if(top1>=top2)printf(“QueueEmpty”);

if(top1<1)x=S1、data[top1];

elsex=S2、data[top1];

top1++;

returnx;

}

21.试设计一个算法,实现输入一字符串并检查字符串中就是否含有圆括号,当圆括号匹配时输出括号内得字符串,否则给出出错信息(提示:

利用栈记录左括号出现后得字符).

stringMatch()

{

InitStack(S);、//初始化栈

ch=getchar();//读取第一个字符

while(ch!

=‘\n’){//当前字符不为结束字符时,进入循环

if(ch==‘(‘){//检测到左括号

push(S,ch);//将左括号压入栈中

ch=getchar();//读取下一个字符

while(ch!

=‘\n’&&ch!

=‘)’){//字符不为结束字符与右括号时,进入循环

push(S,ch);//将字符压入栈中

ch=getchar();//读取下一个字符

}

}

elseif(ch==’)’){//读取到得字符为右括号时,进入循环

while((!

StackEmpty(S))&&GetTop(S)!

=‘(‘)//栈不空且栈顶元素不为左括号,进入循环

putchar(pop(S));//退栈并输出退栈得字符

if(StackEmpty)

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

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

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

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