《数据结构(Java版)》课程样卷
教材:《数据结构(Java版)(第4版)》,叶核亚编著,电子工业出版社,2015年7月出版。
试题范围:第1~9章,掌握基础原理,熟悉经典算法,问答题形式考核。
编程题重点是:1.单/双链表; 2.二叉树/树,递归算法。这是必须掌握的,即使部分学生掌握不了递归算法,也必须考。
不考内容:6.3 线索二叉树求父母、插入、删除算法(没写),7.5.2 Floyd,8.5.3 平衡二叉树,第10章。可作为课程设计题。
试卷范围和难度不超过样卷。
4-1 模拟样卷
一、 填空题(16分=2分×8题)
1. 声明抽象数据类型的目的是________________________________________。
2. 以下数据存储结构声明为_________________________________________。
3. 已知java.lang.String类声明以下成员方法:
public String replaceAll(String pattern, String str) //将所有与pattern匹配的子串替换为str
下列语句的执行结果是________________________________________。
String target="aababbabac", pattern="ab", str="aba";
System.out.println("\""+target+"\".replaceAll(\""+pattern+"\", \""+str+"\")=\""+
placeAll(pattern,str)+"\"");
4. A+B*(C-D*(E+F)/G+H)-(I+J)*K的后缀表达式为______________________。
5. 已知二维数组a[10][8]采用行主序存储,数组首地址是1000,每个元素占用4字节,则数组元素a[4][5]的存储地址是__________________________。
6. 由n个顶点组成的无向连通图,最多有_____________________条边。
7. 排序关键字序列(升序){5,17,20,32,43,55,61,61*,72,96},采用二分法查算法,查96的元素比较序列是____________________;查35的元素比较序列是____________________。
8. 关键字序列{93, 17, 56, 42, 78, 15, 42*, 25, 19},采用希尔排序(升序)算法,第一趟排序后的序列是_________________________________________。
二、 问答题(50分=5分×10题)
1. 已知目标串为"aabcbabcaabcaababc",模式串为"abcaababc",写出模式串改进的next数组;画出KMP算法的匹配过程,给出字符比较次数。
2. 画出以下稀疏矩阵非零元素三元组的十字链表存储结构。
3. 已知一棵二叉树的遍历序列如下,画出这棵二叉树并进行中序线索化。
中根遍历序列:CBDFEGAMLNKJOPRQIHS;
后根遍历序列:CFGEDBMNLKRQPOJISHA
4. 设一段正文由字符集{A,B,C,D,E,F,G,H}组成,其中每个字符在正文中的出现次数依次为{23,5,17,4,9,31,29,18},采用Huffman编码对这段正文进行压缩存储,画出所构造的Huffman树,并写出每个字符的Huffman编码。说明Huffman编码的特点和作用。
5. 已知以下无向图中各顶点按{A,B,C,D,E,F,G,H}次序存储。分别画出采用深度优先搜索(从A开始)和广度优先搜索(从D开始)遍历图时栈或顺序循环队列(容量为6)的动态变化示意图,说明栈或队列的作用。
6. 什么是图的最小生成树?构造以下带权无向图的最小生成树,给出该最小生成树代价。说明Prim算法和Kruskal算法的差别。
7. 画出以下带权有向图采用Dijkstra算法以E为源点的单源最短路径所选择的边,写出各路径长度。
8. 设散列表采用链地址法,初始容量length为10;散列函数采用除留余数法hash(key)=key % length;装填因子为0.75,散列数组容量以2倍扩充。由关键字序列{16,75,60,43,54,90,46,31,27,88,64,50}构造散列表,分别画出扩容前和最终状态图,计算。
9. 画出由关键字序列{50, 16, 74, 60, 43, 16, 90, 46, 31, 29, 88, 71, 64, 13, 65}构造的一棵二叉排序树,计算。执行删除结点50、插入50,再画出操作后的二叉排序树。
10. 什么是堆序列?堆序列在堆排序算法中起什么作用?将关键字序列{29, 10, 25, 26, 58, 12, 31, 18, 47}分别建成一个最大堆和一个最小堆,写出堆序列,画出对应的完全二叉树;写出每一趟堆排序结果。若有关键字重复元素,做标记以区别。
三、 程序阅读和改错题(18分=6分×3题)
1. SortedCirDoublyList<T>排序循环双链表类增加以下成员方法,回答问题。
① 以下merge(list)方法功能是什么?方法体中,while、if等语句功能是什么?
② 已知两条排序循环双链表this和list的序列为{26,37,61,81}和{18,53,75,86,90},画出两者的存储结构,以及执行merge(list)方法后的状态,标明各变量的位置。
public void merge(SortedCirDoublyList<T> list) //方法功能是什么?
{
DoubleNode<T> p=;
DoubleNode<T> q=;
while (p!=this.head && q!=list.head) //循环语句功能是什么?
if ((p.data)pareTo(q.data)<0)
p = p.next;
replaceall()
else
{ q.prev = p.prev;
= q;
p.prev = q;
q = q.next;
= p;
}
if (q!=list.head) //选择语句功能是什么?
{ q.prev = this.head.prev;
this. = q;
list.=this.head;
this.head.prev = list.head.prev;
}
list.head.prev = list.head; //为什么要这两句?
= list.head;
}
2. 阅读程序,回答以下问题。
public static StringBuffer trim(StringBuffer s) //将s中所有空格删除,返回操作后的s串
{
int i=0;
while (i<s.length() && s.charAt(i)!=' ') //i记住第1个空格下标
i++;
for (int j=i; j<s.length(); j++)
if (s.charAt(j)!=' ')
s.setCharAt(i++, s.charAt(j)); //非空格字符向前移动到空格字符位置
return s;
}
① 对于以下调用语句,运行结果是什么?正确的运行结果是什么?
StringBuffer str = new StringBuffer(" a bc d e f xyz");
System.out.println("trim(\""+str+"\")="+trim(str));
② trim()方法怎样实现所求功能?算法存在什么错误?
③ 如何改正?
3. 已知Tree<T>类表示父母孩子兄弟链表存储的树,回答以下问题。
① 设一棵树(森林)的广义表表示如下,画出所构造的树以及树的存储结构图,输出树的横向凹入表示法。
树(森林)的广义表表示:G(A(C(E,F),B,D)),H(J(L),I,K)
② 以下levelorder()方法的功能是什么?对于上述树(森林),运行结果是什么?
③ levelorder()方法存在什么错误?如何改正?
public void levelorder()
{
LinkedQueue<TreeNode<T>> que=new LinkedQueue<TreeNode<T>>();
for (TreeNode<T> ; p!=null; p=que.poll())
{ System.out.print(p.data+ " ");
for (p=p.child; p!=null; p=p.sibling)
que.add(p);
}
System.out.println();
}
四、 程序设计题(16分=8分×2题)
1. SinglyList<T>单链表类增加以下成员方法,画出操作示意图。
//删除this中所有与pattern匹配的子表,BF模式匹配查到再删除
public void removeAll(SinglyList<T> pattern)
2. 实现以下对二叉链表存储的二叉树类BinaryTree<T>操作的方法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论