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

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

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

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

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

while(n>

=(s+1)*(s+1))

s=s+1;

语句“s=s+1;

”执行次,故该程序段得时间复杂度为O().

13.x=1;

sum=0;

for(i=0;

x=x*i;

sum=sum+x;

语句“x=x*i”与“sum=sum+x;

”各执行n次,故该程序段得时间复杂度为O(n).

14.for(i=1;

i++)

if(3*i<

=n)

for(j=3*i;

j++){

x++;

y=3*x+2;

}

语句“x++”与“y=3*x+2;

15.for(i=1;

for(j=1;

=i;

x=x+1;

}

语句“x=x+1;

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;

++x;

s+=x;

for(j=1;

for(k=1;

k<

k++){

x++;

s=s+x;

语句“++x;

”执行n次,语句“x++;

”与“s=s+x;

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

=NULL

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

A.q->

next=s;

s->

next=pB.p->

next=q

C.s->

next=p->

next;

p->

next=sD.p->

next=s->

next=p

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

A.q=p->

next->

free(q);

B.p=p->

q=p->

p=q->

C.q=p->

p=p->

D.p=p->

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->

D.s->

prior=pE.p->

nextF.p->

prior=p->

prior->

prior

G.p->

prior=sH.p->

next=sI.s->

next

J.q=p->

nextK.q=p->

priorL.free(p)

M.free(q)N.s->

priorO.p->

P.p->

next=pQ.p->

prior=pR.p->

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

voidDeleX(LinkListhead,DataTypex)

{

LinkNode*p,*q,*s;

P=head;

while(q!

=NULL)

if(q->

data==x)

{

s=q;

q=q->

free(s);

p->

next=q;

else

p=q;

三、算法设计题

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

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

SeqListSubtraction(SeqListA,SeqListB)

inti,j,k=0;

//令匹配位置为0

A、Length;

i++){

for(j=k;

B、Length;

j++)//从比较匹配得位置开始查起

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

k=j;

//记录比较到得位置

for(j=i;

A、Length-1;

A、Data[j]=A、Data[j+1];

//删除相同得元素

A、Length--;

break;

returnA;

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

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

voidExchange(LinkListhead,LinkNode*p)

LinkNode*q,*s,*r;

if(q!

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

{

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

head=head->

//头结点指针域所指结点变成新得头结点

s=head->

//记录第2个结点

head->

next=p;

//新得头结点指针域指向原头结点

//原头结点变成第1个结点后指针域指向第2个结点

else{

r=head;

while(r->

=p)

r=r->

//查找p指向结点直接前趋

r->

//p指向结点直接前趋指针域指向p指向结点直接后继

next=q->

//p指向结点指针域指向p指向结点直接后继得直接后继

q->

//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->

data<

q->

data)p=p->

else

if(p->

data>

data)q=q->

else{

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

s->

data=p->

data;

s->

next=NULL;

r->

r=s;

p=p->

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

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

voidInsert(DlinkListhead,DataTypex,DataTypey)

DlistNode*p,*s;

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

data=y;

p=head->

=head&

data!

=x)

p=p->

//查找结点值为x得结点

if(p==head)

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

”);

else

prior;

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<

maxsize-1;

如果要把栈顶元素弹出到x中,需执行下列语句:

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;

n;

push(S,A[i]);

//将数组元素依次压入栈内

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

(2)voidex32(SeqStack*S,intc)

SeqStackT;

intd;

StackEmpty(S)){

d=pop(S);

if(d!

=c)

push(T,d);

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’

//压入’k’,栈内’catk’

//弹出’k’到x,栈内’cat’

push(S,‘s’);

//压入’s’,栈内’cats’

while(!

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