02331数据结构课后练习题Word下载.docx
- 文档编号:22565851
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:53
- 大小:264.42KB
02331数据结构课后练习题Word下载.docx
《02331数据结构课后练习题Word下载.docx》由会员分享,可在线阅读,更多相关《02331数据结构课后练习题Word下载.docx(53页珍藏版)》请在冰豆网上搜索。
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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 02331 数据结构 课后 练习题