9月份考试数据结构第三次作业.docx
《9月份考试数据结构第三次作业.docx》由会员分享,可在线阅读,更多相关《9月份考试数据结构第三次作业.docx(7页珍藏版)》请在冰豆网上搜索。
![9月份考试数据结构第三次作业.docx](https://file1.bdocx.com/fileroot1/2022-10/7/abd77eb7-80d0-4bbc-b56a-11b9d3105baa/abd77eb7-80d0-4bbc-b56a-11b9d3105baa1.gif)
2014年9月份考试数据结构第三次作业
一、填空题(本大题共10分,共5小题,每小题2分)
1.数据结构包括数据的______和数据的______。
2.在无头结点的单链表中,第1个结点的地址存放在头指针中,其他结点的存储地址存放在______结点的next域中。
3.为了实现逐层访问,算法中使用了一个______,以记忆正在访问的这一层和上一层的顶点,以便于向下一层访问。
4.在一个循环队列中,队首指针指向队首元素的______位置。
5.弗洛伊德Floyd算法的时间复杂度为______。
二、名词解释题(本大题共10分,共2小题,每小题5分)
1.请解释名词“头指针”
2.请解释名词“目标串”
三、程序阅读题(本大题共20分,共2小题,每小题10分)
1.指出下述程序段的功能是什么?
voidDemo2(SeqStack*S,intm)
{//设DataType为int型
SeqStackT;inti;
InitStack(&T);
while(!
StackEmpty(S))
if((i=Pop(S))!
=m)Push(&T,i);
while(!
StackEmpty(&T))
{ i=Pop(&T);Push(S,i); } }
2.下述算法的功能是什么?
LinkListDemo(LinkListL){//L是无头结点单链表ListNode*Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while(P->next)P=P->next;P->next=Q;Q->next=NULL;}returnL;}//Demo
四、简答题(本大题共20分,共4小题,每小题5分)
1.如何判别循环队列的空和满?
2.实际中,需根据不同的情况采用不同的哈希函数。
通常,考虑的因素有那些?
3.以关键字序列(265,301,751,129,937,863,742,694,076,438)为例,写出执行直接选择排序算法的各趟排序结束时,关键字序列的状态。
4.在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?
若可以,其时间复杂度各为多少?
五、程序设计题(本大题共40分,共4小题,每小题10分)
1.编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接表。
2.编写算法,在串的定长顺序存储结构上实现串的基本操作REPLACE(&S,T,V)
3.假设以结点大小为1(且附设头结点)的链表结构表示串。
试编写实现下列6种串的基本操作StrAssign,StrCopy,StrCompare,StrLength,Concat和SubString的函数。
4.设顺序表中关键字是递增有序的,试写一顺序查找算法,将哨兵设在表的高下标端。
然后求出等概率情况下查找成功与失败时的ASL。
答案:
一、填空题(10分,共5题,每小题2分)
1.
参考答案:
逻辑结构,存储结构
解题方案:
评分标准:
每空2分
2.
参考答案:
前趋
解题方案:
评分标准:
每空2分
3.
参考答案:
队列
解题方案:
评分标准:
每空2分
4.
参考答案:
前一个
解题方案:
评分标准:
每空2分
5.
参考答案:
O(n3)
解题方案:
评分标准:
每空2分
二、名词解释题(10分,共2题,每小题5分)
1.
参考答案:
头指针是一指向链表开始结点的指针(没有头结点时)。
解题方案:
评分标准:
2.
参考答案:
在串匹配运算过程中,将主串称为目标串。
解题方案:
评分标准:
三、程序阅读题(20分,共2题,每小题10分)
1.
参考答案:
程序段的功能是利用栈T,将一个非空栈S中值等于m的元素全部删去。
解题方案:
评分标准:
2.
参考答案:
答:
该算法的功能是:
将开始结点摘下链接到终端结点之后成为新的终端结点,而原来的第二个结点成为新的开始结点,返回新链表的头指针。
解题方案:
答:
该算法的功能是:
将开始结点摘下链接到终端结点之后成为新的终端结点,而原来的第二个结点成为新的开始结点,返回新链表的头指针。
评分标准:
5
四、简答题(20分,共4题,每小题5分)
1.
参考答案:
判别循环队列的"空"或"满"不能以头尾指针是否相等来确定,一般是通过以下几种方法:
一是另设一布尔变量来区别队列的空和满。
二是少用一个元素的空间,每次入队前测试入队后头尾指针是否会重合,如果会重合就认为队列已满。
三是设置一计数器记录队列中元素总数,不仅可判别空或满,还可以得到队列中元素的个数。
解题方案:
评分标准:
2.
参考答案:
答:
(1)计算哈希函数所需时间;
(2)关键字的长度;哈希表的大小;关键字的分布情况;(5)记录的查找频率;
解题方案:
答:
(1)计算哈希函数所需时间;
(2)关键字的长度;哈希表的大小;关键字的分布情况;(5)记录的查找频率;
评分标准:
21111
3.
参考答案:
直接选择排序:
(方括号为无序区)
初始态 [265301751129937863742694076438]
第一趟:
076[301751129937863742694265438]
第二趟:
076129[751301937863742694265438]
第三趟:
076129265[301937863742694751438]
第四趟:
076129265301[937863742694751438]
第五趟:
076129265301438[863742694751937]
第六趟:
076129265301438694[742751863937]
第七趟:
076129265301438694742[751863937]
第八趟:
076129265301438694742751[937863]
第九趟:
076129265301438694742751863937
解题方案:
评分标准:
4.
参考答案:
答:
下面分别讨论三种链表的情况。
1)单链表。
若指针p指向某结点时,能够根据该指针找到其直接后继,能够顺后继指针链找到*p结点后的结点。
但是由于不知道其头指针,所以无法访问到p指针指向的结点的直接前趋。
因此无法删去该结点。
2)双链表。
由于这样的链表提供双向指针,根据*p结点的前趋指针和后继指针可以查找到其直接前趋和直接后继,从而可以删除该结点。
其时间复杂度为O
(1)。
3)单循环链表。
根据已知结点位置,可以直接得到其后相邻的结点位置(直接后继),又因为是循环链表,所以我们可以通过查找,得到p结点的直接前趋。
因此可以删去p所指结点。
其时间复杂度应为O(n)。
解题方案:
答:
下面分别讨论三种链表的情况。
1)单链表。
若指针p指向某结点时,能够根据该指针找到其直接后继,能够顺后继指针链找到*p结点后的结点。
但是由于不知道其头指针,所以无法访问到p指针指向的结点的直接前趋。
因此无法删去该结点。
2)双链表。
由于这样的链表提供双向指针,根据*p结点的前趋指针和后继指针可以查找到其直接前趋和直接后继,从而可以删除该结点。
其时间复杂度为O
(1)。
3)单循环链表。
根据已知结点位置,可以直接得到其后相邻的结点位置(直接后继),又因为是循环链表,所以我们可以通过查找,得到p结点的直接前趋。
因此可以删去p所指结点。
其时间复杂度应为O(n)。
评分标准:
222
五、程序设计题(40分,共4题,每小题10分)
1.
参考答案:
解:
StatusBuild_AdjList(ALGraph&G)//输入有向图的顶点数,边数,顶点信息和边的信息建立邻接表{InitALGraph(G);scanf("%d",&v);if(vnextarc;q=q->nextarc);q->nextarc=p;}p->adjvex=j;p->nextarc=NULL;}//whilereturnOK;}//Build_AdjList
解题方案:
解:
StatusBuild_AdjList(ALGraph&G)//输入有向图的顶点数,边数,顶点信息和边的信息建立邻接表{InitALGraph(G);scanf("%d",&v);if(v<=a;m++){t=getchar();h=getchar();//t为弧尾,h为弧头if((i=LocateVex(G,t))nextarc;q=q->nextarc);q->nextarc=p;}p->adjvex=j;p->nextarc=NULL;}//whilereturnOK;}//Build_AdjList
评分标准:
22222
2.
参考答案:
答:
intString_Replace(SString&S,SStringT,SStringV);{//将串S中所有子串T替换为V,并返回置换次数for(n=0,i=1;iT[0])//找到了与T匹配的子串:
分三种情况处理{if(T[0]==V[0])for(l=1;l=i+T[0];l--)S[l+V[0]-T[0]]=S[l];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}else//新子串长度小于原子串时:
先将后部左移{for(l=i+V[0];l<=S[0]+V[0]-T[0];l++)S[l]=S[l-V[0]+T[0]];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}S[0]=S[0]-T[0]+V[0];i+=V[0];n++;}//if}//forreturnn;}//String_Replace
解题方案:
答:
intString_Replace(SString&S,SStringT,SStringV);{//将串S中所有子串T替换为V,并返回置换次数for(n=0,i=1;i<=S[0]-T[0]+1;i++){for(j=i,k=1;T[k]&&S[j]==T[k];j++,k++);if(k>T[0])//找到了与T匹配的子串:
分三种情况处理{if(T[0]==V[0])for(l=1;l<=T[0];l++)//新子串长度与原子串相同时:
直接替换S[i+l-1]=V[l];elseif(T[0]=i+T[0];l--)S[l+V[0]-T[0]]=S[l];for(l=1;l<=V[0];l++)S[i+l-1]=V[l];}else//新子串长度小于原子串时:
先将后部左移{for(l=i+V[0];l<=S[0]+V[0]-T[0];l++)S[l]=S[l-V[0]+T[0]];for(l=1;l<=V[0];l