天津大学《数据结构(主干课程)》期末考试必备题集
奥鹏期末考核
90120–天津大学《数据结构(主干课程)》奥鹏期末考试题库合集
问答题:
(1)何时选用顺序表、何时选用链表作为线性表的存储结构为宜?
答案问询微信:424329
A. 基于空间的考虑。当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。
B. 基于时间的考虑。若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之,若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。
(2)已知二维数组表示的图的邻接矩阵如下图所示。试分别画出自顶点1出发进行遍历所得的深度优先生成树和广度优先生成树。
答案问询微信:424329
(3)已知某哈希表的装载因子小于1,哈希函数H(key)为关键字(标识符)的第一个字母在字母表中的序号,处理冲突的方法为线性探测开放定址法。试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法。
答案问询微信:424329
void PrintWord(Hash Table ht)
{//按第一个字母的顺序输出哈希表ht中的标识符。哈希函数为表示符的第一个字母在字母表中的序号,处理冲突的方法是线性探测开放定址法。
for(i=1; i=26; i++){
j=i;
While(ht.elem[j].key){
if(Hash(ht.elem[j].key==i)printf(ht.elem[j].key);
j=(j+1)%m;
}
}
}//PrintWord
(4)解释拓扑排序,并简述如何进行拓扑排序。
答案问询微信:424329
拓扑排序的操作如下:
(1)在有向图中选一个没有前驱的顶点并输出之;
(2)从图中删除该顶点和所有以它为尾的弧。
重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。
(5)快速排序的执行时间,在什么情况下时间最长,这时的总比较次数为多少,在什么情况下时间最短,这时最短的总比较次数又为多少?
答案问询微信:424329
(6)已知一棵二叉树的先序序列是ABCDEFGHIJK,中序序列是CDBGFEAHJIK,请构造出该二叉树。
答案问询微信:424329
(7)用邻接矩阵法写出下图的存储结构。
答案问询微信:424329
0 0 0 0 1
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
(8)用标准C语言实现Hanoi塔问题。
答案问询微信:424329
{
If(n==1)
Move(x,1,z);
Else{
Hanoi(n-1,x,z,y);
Move(x,n,z);
Hanoi(n-1,y,x,z);
}
}
(9)试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?
答案问询微信:424329
②链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。
优点:插入或删除元素时很方便,使用灵活。缺点:存储密度小,存储空间利用率低。
顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作。
若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;
若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
(10)描述一趟快速排序算法。
答案问询微信:424329
(11)设顺序表L是一个递增有序表,试写一算法,将x插入L中,并使L仍是一个有序表。
答案问询微信:424329
在寻找过程中,由于大于x的元素都应放在x之后,所以可边寻找,边后移元素,当找到第一个小于或等于x的元素位置i时奥鹏期末考核,该位置也空出来了。
算法如下:
void InsertIncreaseList( Seqlist *L , Datatype x )
{?
int i;
if ( L-length=ListSize)
Error(“overflow");
for ( i=L – length ; i0 && L-data[ i-1 ] x ; i–)
L-data[ i ]=L-data[ i-1 ] ; // 比较并移动元素
L-data[ i ] =x;
L – length++;
}
(12)对分(折半)查找适不适合链表结构的序列,为什么?用二分查找的查找速度必然比线性查找的速度快,这种说法对吗?
答案问询微信:424329
二分查找的速度在一般情况下是快些,但在特殊情况下未必快。例如所查数据位于首位时,则线性查找快;而二分查找则慢得多。
(13)写出下图所示的AOV网的可能拓扑序列,要求至少写出五个。
答案问询微信:424329
(1)Abdcef
(2)Abcdef
(3)Abcedf
(4)Cabdef
(5)Cabedf
(6)Acbdef
(7)Acbedf
(14)设有一个求解汉诺塔(Hanoi)的递归算法。void HANOI (int n , int peg1 , int peg2 , int peg3){ if (n= =1) printf(”move %d to %dn”,peg1,peg3); else {HANOI (n-1, peg1, peg3, peg2);printf(”move %d to %dn”,peg1,peg3);HANOI (n-1, peg2, peg1, peg3) ; }}假定采用HANOI(3,1,2,3)去调用上述算法,则写出整个输出结果的前四行内容。
答案问询微信:424329
move 1 to 3
move 1 to 2
move 3 to 2
move 1 to 3
(15)编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接表。
答案问询微信:424329
{
InitALGraph(G);
scanf("%d",&v);
if(v0) return ERROR; //顶点数不能为负
G.vexnum=v;
scanf("%d",&a);
if(a0) return ERROR; //边数不能为负
G.arcnum=a;
for(m=0;mv;m++)
G.vertices[m].data=getchar(); //输入各顶点的符号
for(m=1;m=a;m++)
{
t=getchar();h=getchar(); //t为弧尾,h为弧头
if((i=LocateVex(G,t))0) return ERROR;
if((j=LocateVex(G,h))0) return ERROR; //顶点未找到
p=(ArcNode*)malloc(sizeof(ArcNode));
if(!G.vertices.[i].firstarc) G.vertices[i].firstarc=p;
else
{
for(q=G.vertices[i].firstarc;q-nextarc;q=q-nextarc);
q-nextarc=p;
}
p-adjvex=j;p-nextarc=NULL;
}//while
return OK;
}//Build_AdjList
(16)在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素?
答案问询微信:424329