数据结构与算法期末考试
int Index(SString S, SString T, int pos){ if(pos>=1&&pos<=S[0]){
i=pos; j=
(4)
;
while(i<=S[0] && j<=T[0]) if(S[i]==T[j]) {++i; ++j; } else{ (5) (6) } if(j>T[0]) return else } else } return 0; return 0; (7) ; ; ;
8. 采用线性探测处理冲突,当从哈希表中删除一个记录时,不应将该记录所在位置置 空,因为这会影响以后的查找。( ) 9. 有 n 个数存放在一维数组 A[1..n]中,在进行顺序查找时,这 n 个数的排列有序或无 序,其平均查找长度不同。( ) )
10. 广义表中原子个数即为广义表的长度。(
四、
应用题(24 分)
邻接表:
5 5 3 6
5 3
5 1
3 2
6 1 4
a2 , 2 an , 2
an ,n
7. 由一个长度为 11 的有序表,按二分查找法对该表进行查找,在表内各元素等概率情 况下,查找成功的平均查找长度是( )。 A.29/11 B. 31/11 C. 33/11 D.35/11
8. AVL 树是一种平衡的二叉排序树,树中任一结点的(
7. 该有向图无环
二、 选择题
1.D 6.B 2.C 7.C 3.D 8.B 4.C 5.A 9.D 10.D
三、 判断题
1.✕ 6.✕ 2.✕ 7.✕ 3.✕ 8.✓ 4.✓ 9.✕ 5.✕ 10.✕
四、 应用题
1.
A D C F E H K L I J G
B
2. (1) 邻接矩阵:
A B C D E F G
3. 用链表实现的简单选择排序。 设链表头指针为 L, 链表无头结点, 请填写适当的语句, 完成该功能。
void SelectSort(LinkList L) { p=L; while(p) { q=p; r=q->next; while( r ) { if( (8) ) q=r;
r= }
(9)
;
4. (6 分)将序列{25, 34, 12, 7, 15, 47, 65, 79,47+,16 }中的关键字按升序重新 排列,请写出 (1)冒泡排序一趟扫描的结果 (2)以第一个元素为分界点的快速排序一趟扫描的结果 (3)堆排序所建的初始堆和第一趟排序结果。
五、
程序填空题(10 分,每空 1 分)
A 5 5 B 3 6 C 1 E 4 1 G F 2 3 D
3.(6 分)输入一个正整数序列(53,17,12,66,58,70,87,25,56,60),试完成下列各题: (1)构造一棵二叉排序树,计算查找成功的平均查找长度; (2)依此二叉排序树,如何得到一个从大到小的有序序列; (3)画出在此二叉排序树中,删除“66”后的树结构.
1. 在顺序表中访问任意一个元素的时间复杂度均为 的数据结构。
,因此顺序表也称为
2.三维数组 a[4][3][2](下标从 0 开始),假设 a[0][0][0]的地址为 50,数据以行序优先方 式存储,每个元素的长度为 2 字节,则 a[2][1][1]的地址是 。
3. 直接插入排序用监视哨的作用是
tmp=q->data; q->data=p->data; p->data=tmp; p= } } (10) ;
六、
算法设计题(16 分)
算法书写要求:应简单阐述算法的主要思想,对关键变量和关键语句进行注释;如果为递 归算法,则应说明递归调用的初始条件,否则扣分。写出正确的设计思想和伪代码可以酌 情给分。
struct BiTNode *lchild, *rchild; }BiTNode, *BiTree;
(2)假设一棵二叉树以二叉链表表示,元素值为整数,且元素值无重复,编写算法, 打印以元素值等于某个给定的整数的结点为根的子树中的各个叶结点。
二叉树 T 采用如下定义的存储结构: typedef struct BiTNode { TElemType data;
4. 在有向图的邻接表存储结构中,顶点 v 在链表中出现的次数是( )。 A. 顶点 v 的度 C. 顶点 v 的入度 B. 顶点 v 的出度 D. 依附于顶点 v 的边数
5. 算法的时间复杂度为 O(nlog2n)、空间复杂度为 O(1)的排序算法是(
)。
A. 堆排序
B. 快速排序
C. 归并排序
1. 下列算法是建立单链表的算法,请填写适当的语句,完成该功能。
typedef struct Lnode{ ElemType data;
struct Lnode *next; }LNode, *LinkList;
Status CreatList_L(LinkList &L, int n){ //正序输入 n 个元素的值,建立带表头结点的单链线性表 L L=(LinkList) malloc(sizeof(LNode)); if(!L) return ERROR; L->next=NULL; p= (1) ;
。
4. 已知广义表 Ls=(a, (b, c), (d, e)), 运用 head 和 tail 函数取出 Ls 中的原子 d 的运算 是 。
5.对有 14 个元素的有序表 A[1..14]进行折半查找,当比较到 A[4]时算法结束。被比较 元素除 A[4]外,还有 。
6. 在 AOV 网中,顶点表示
struct BiTNode *lchild, *rchild; }BiTNode, *BiTree;
2011 年数据结构与算法参考答案
一、 填空题
1. O(1) 2. 80 3. 防止数组下标越界 4. Head【Head【Tail【Tail(LS)】】】 5. A[3] 6. 活动 8. DEF A[5] A[7] 活动之间的先后关系 随机存取
for(i=0;i<n;i++){ s=(LinkList) malloc(sizeof(LNode)); if(!s) return ERROR; scanf(&s->data); (2) (3) } p->next=NULL; return OK; }//CreatList_L ; ;
2. 下列算法是经典模式匹配算法程序,请填写适当的语句,完成该功能。 #define MAXSTRLEN 255 typedef unsigned char SString[MAXSTRLEN+1]; //0 号单元存放串长
链表结构定义为: typedef struct Lnode{ ElemType data;
struct Lnode *next; }LNode, *LinkList;
2、(8 分) 下题中任选一题 (1)给定一棵赫夫曼树 T,编写算法,求该赫夫曼树 T 的带权路径长度。
赫夫曼树 T 采用如下定义的存储结构: typedef struct BiTNode { TElemType data; //此处 data 代表结点的权值
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
(3)设计一算法,要求将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指 针为 head, 二叉树按二叉链表方式存储,链接时用叶结点的右指针域来存放单链表指 针,分析算法的时间、空间复杂度。
假设二叉树 T 采用如下定义的存储结构: typedef struct BiTNode{ TElemType data;
D.直接选择
a1,1 6. 设矩阵 A 是一个对称矩阵,为了节省存储,将其 a2,1 下三角部分(如右图所示)按行序存放在一维数 A 组 B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素 an ,1
ai,j(i≤j), 在一维数组 B 中下标 k 的值是( ): A.i(i-1)/2+j-1 C.i(i+1)/2+j-1 B.i(i-1)/2+j D.i(i+1)/2+j
2. 查找 n 个元素的有序表时,最有效的查找方法是( )。 A.顺序查找 C.折半查找 B.分块查找 D.二叉查找
3. 将所示的 s 所指结点加到 p 所指结点之后,其语句应为(
)。
p
╳
s
(A) s->next=p+1 ; p->next=s; (B) (*p).next=s; (*s).next=(*p).next; (C) s->next=p->next ; p->next=s->next; (D) s->next=p->next ; p->next=s;
1. (6 分)将下列由三棵树组成的森林转换为二叉树。
A
D
G
B
C
E K
H
I
J
F
L
2.(6 分)给定下列图,完成以下问题 (1)画出该图的邻接矩阵和邻接表 (2)根据所画的邻接表,从顶点 B 出发,画出图的深度优先搜索树 (3)根据普里姆(Prim)算法,求它的最小生成树(不必写出全部过程,在生成树中 标出边生成的次序即可)
如果算法中用到堆栈,可直接调用下列操作: InitStack(S): 栈初始化 push(S,x): 将元素 x 推入栈 S;(插入) pop(S,x): 将栈顶元素存入变量 x 中;(删除) StackEmpty(S): 判别栈 S 是否为空,如果是,返回 1,否则返回 0