1、数据结构(专科)作业 1第一章绪论一、单选题1.一个数组元素 ai与 A 的表示等价。A *(a+i) B a+i C *a+i D i=0)r1=(float)(-q.b+sqrt(x)/(2*q.a);r2=(float)(-q.b-sqrt(x)/(2*q.a);return 1;elsereturn 0; 按照 ax*2+bx+c的格式(x 2用 x*2表示)输出二次多项式,在输出时要注意去掉系数为 0的项,并且当 b和 c的值为负时,其前不能出现加号。void Print(Quadratic q)解:void Print(Quadratic q)if(q.a) cout0)cout0
2、)coutx) return 1;else return 0;解: 判断 n是否是一个素数,若是则返回数值 1,否则返回 0。该算法的时间复杂度为 O(n 1/2)。 int sum1(int n)int p=1,s=0;for(int i=1;ix)i=x%10;ci+;解: 利用数组 c10中的每个元素 ci对应统计出 inp所联系的整数文件中个位值同为 i的整数个数,时间复杂度为 O(n) void mtable(int n)for(int i=1;iL.size)cerrL.size+1)cerri-1;j-)L.listj+1=L.listj;L.listi-1=x;L.size+;
3、 从线性表中删除具有给定值 x的所有元素。解:void Delete2(Listwhile(inext; /p指向下一个待逆序的结点/将 q结点插入到已陈序单链表的表头q-next=HL;HL=q; 删除单链表中的第 i个结点。解:void Delete1(LNode*j+;if(cp=NULL)cerrnext;elseap-next=cp-next;delete cp; 从单链表中查找出所有元素的最大值,该值由函数返回,若单链表为空,则显示出错信息并停止运行。解:ElemType MaxValue(LNode*HL)/从单链表中查找出所有元素的最大值,该值由函数返回if(HL=NULL)c
4、errdata;LNode*p=HL-next;while(p!=NULL)if(maxdata) max=p-data;p=p-next;return max; 统计出单链表中结点的值等于给定值 x的结点数。解:int Count(LNode*HL,ElemType x)/统计出单链表中结点的值等于给定值 x的结点数int n=0;while(HL!=NULL)if(HL-data=x) n+;HL=HL-next;return n; 数据结构(专科)作业 2第三章 稀疏距阵和广义表一、单选题1.在稀疏矩阵的带行指针指向量的链接存储中,每个行单链表中的结点都具有相同的A 。A 行号 B 列号
5、 C 元素值 D 地址2.设一个具有 t个非零元素的 m*n大小的稀疏矩阵采用顺序存储,求其转置矩阵的普通转置算法的时间复杂度为 D 。A O(m) B O(n) C O(n+t) D O(n*t)3.设一个广义表中结点的个数为 n,则求广义表深度算法的时间复杂度为 B。A O(1) B O(n) C O(n2) D O(log2n)二、填空题1.在一个稀疏矩阵中,每个非零元素所对应的三元组包括该元素的 行号 、 列号 、和元素值 。2.在稀疏矩阵所对应的三元组线性表中,每个三元组元素按 行号 为主序、 列号 为辅助的次序排列。3.在初始化一个稀疏矩阵的函数定义中,矩阵形参应说明为 引用 参数
6、。4.在稀疏矩阵的顺序存储中,利用一个数组来存储非零元素,该数组的长度应 大于等于 对应的三元线性表的长度。5.在稀疏矩阵的带行指针向量的链接存储中,每个结点包含有 4 个域,在相应的十字链接存储中,每个结点包含有 5 个域。6.在稀疏矩阵的十字链接存储中,每个结点的 down指针域指向 行号 相同的下一个结点,right指针指向 列号 相同的下一个结点。7.一个广义表中的元素为 单 元素和 表 元素两类。8.一个广义表的深度等于 括号 嵌套的最大层数。9.在广义表的存储结构中,每个结点均包含有 3 个域。10.在广义表的存储结构中,单元素结点与表元素结点有一个域对应不同,各自分别为值 域和
7、子表指针域 。11.若把整个广义表也看为一个表结点,则该结点的 tag域的值为 true 或 1 、next 域的值为 NULL 或 0 。三、应用题1.已知一个稀疏矩阵如图 3-11所示:0 4 0 0 0 0 00 0 0 -3 0 0 18 0 0 0 0 0 00 0 0 5 0 0 00 -7 0 0 0 2 00 0 0 6 0 0 0图 3-11 具有 6行7 列的一个稀疏矩阵写出它的三元组线性表;解:(1,2,4),(2,4,-3),(2,7,1),(3,1,8),(4,4,5),(5,2,-7),(5,6,2),(6,4,6)给出它的顺序存储表示;解:下标 1 2 3 4 5
8、 6 7 8 . MaxTermsrow(行号) 1 2 2 3 4 5 5 6 col(列号) 2 4 7 1 4 2 6 4 val(元素值) 4 -3 1 8 5 -7 2 6 给出它的转置矩阵的三元组线性表和顺序存储表示;解:(1,3,8),(2,1,4),(2,5,-7),(4,2,-3),(4,4,5),(4,6,6),(6,5,2),(7,2,1)解:下标 1 2 3 4 5 6 7row(行号) 1 2 col(列号) 3 1 val(元素值) 8 4 3.画出下列每个广义表的带表头附加结点的链接存储结构图并分别计算出它们的长度和深度。 A=() B=(a,b,c) C=(a,
9、(b,(c) D=(a,b),(c,d) E=(a,(b,(c,d),(e) F=(a,(b,(),c),(d),e)解:每小题的长度和深度如下表示。题号 1 2 3 4 5 6长度 1 3 2 2 3 1深度 2 1 3 2 3 4第四章 栈和队列一、应用题1.设用第二章定义的类型为 AlinkList的一维数组 MSMaxSize建立三个链接堆栈,其中前三个元素的 next域用来存储三个栈顶指针,从下标为 3的元素起作为空闲元素提供给三个栈共同使用,试编写一个算法把从键盘上输入的 n个整数按照下列条件分别进入不同的栈:若输入的整数 x小于 60,则进第一个栈;若输入的整数 x大于等于 60
10、同时小于 100,则进第二个栈;若输入的整数大于 100,则进第三个栈。解:void MoreStack(ALinkList MS,int n)/把从键盘上输入的 n个整数按不同条件分别进入到三个不同的链接栈中if(nMaxSize-3)cerrx;MSav.data=x;/按条件把 av元素压入不同的栈,即链接到相应栈的栈顶if(x=60/要至少定义为比输入的整数个数大 3typedef int ElemType;struct ALNodeElemType data;int next;typedef ALNode ALinkListMaxSize;void MoreStack(ALinkLi
11、st MS,int n)/函数体在此省略void main()ALinkList a;int n;coutn;MoreStack(a,n);for(int i=0;i=2) 试编写计算 Fib(n)的递归算法和非递归算法,并分析它们的时间复杂度和空间复杂度。解:递归算法为:long Fib(int n)if(n=1|n=2) /终止递归条件return 1;elsereturn Fib(n-1)+Fib(n-2);非递归算法为long Fib1(int n)int a,b,c;/C代表当前项,a 和 b分别代表当前项前面的第 2项和第 1项a=b=1; /给 a和 b赋初值 1if(n=1|n
12、=2)return 1;elsefor(int i=3;i0)为 a(i-1)/2 。19.对于一棵具有 n个结点的二叉树,对应二叉链接表中指针总数为 2n 个,其中n-1 个用于指向孩子结点, n+1 个指针空闲着。20.一棵二叉树广义表表示为 a(b(d(,h),c(e,f(g,i(k),该树的结点数为 10 个,深度为 5 。21.在一棵高度为 5的理想平衡树中,最少含有 16 个结点,最多含有 31 个结点。22.在一棵高度为 h的理想平衡树中,最少含有 2 h-1 个结点,最多含有 2 h-1个结点。23.假定一棵二叉树广义表表示为 a(b(c),d(e,f),则对它进行的先序遍历结
13、果为 a b c d e f,中序遍历结果为 c b a e d f,后序遍历结果为 c b e f d a,按层遍历结果为 a b d c e f。24.假定一棵普通树的广义表表示为 a(b(e),c(f(h,i,j),g),d),则先根遍历结果为 a b e c f h i j g d,按层遍历结果为 a b c d e f g h i j。二、应用题1.已知一棵具有 n个结点的完全二叉树被顺序存储于一维数组的 A1An元素中,试编写一个算法打印出编号为 i的结点的双亲和所有孩子。解:void Request(int a,int n,int i)/从数组 A中打印出编号为 i的结点的双亲和
14、孩子if(in)cerr0)coutleft=NULL /统计叶子结点数Count(BT-left,C1,C2);Count(BT-right,C1,C2);3.对于图 5-16所示的树: 写出先根遍历得到的结点序列;a b e c f g k d h I l m j 写出按层遍历得到的结点序列;a b c d e f g h I j k l m 画出转换后得到的二叉树和二叉链表。解:(1)a b e c f g k d h I l m j(2)a b c d e f g h I j k l m(3)第六章 二叉树的应用一、单选题1.从二叉搜索树中查找一个元素时,其时间复杂度大致为 C 。A
15、O(n) B O(1) C O(log2n) D O(n2)2.向二叉搜索树中插入一个元素时,其时间复杂度大致为 B 。A O(1) B O(log2n) C O(n) D O(nlog2n)3.根据 n个元素建立一棵二叉搜索树时,其时间复杂度大致为 D 。A O(n) B O(log2n) C O(n2) D O(nlog2n) 4.从堆中删除一个元素的时间复杂度为 C 。A O(1) B O(n) C O(log2n) D O(nlog2n)5.向堆中插入一个元素的时间复杂度为 A 。A O(log2n) B O(n) C O(1) D O(nlog2n)6.权值分别为 3,8,6,2,5
16、 的叶子结点生成一棵哈夫曼树,它的带权路径长度为 D 。A 24 B 48 C 72 D 53二、填空题1.在一棵二叉搜索树中,每个分支结点的左子树上所有结点的值一定 小于 该结点的值,右子树上所有结点的值一定 大于 该结点的值。2.对一棵二叉搜索树进行中序遍历时,得到结点序列是一个 有序序列 。3.从一棵二叉搜索树中查找一个元素时,若元素的值等于根结点的值,则表明 查找成功 ,若元素的值小于根结点的值,则继续向 左子树 查找,若元素的值大于根结点的值,则继续向 右子树 查找。4.在一个堆的顺序存储中,若一个元素的下标为 i,则它的左孩子元素的下标为 2i+1 ,右孩子元素的下标为 2i+2
17、。5.在一个小根堆中,堆顶结点的值是所有结点中的 最小值 ,在一个大根堆中,堆顶结点的值是所有结点中的 最大值 。6.当向一个小根堆插入一个具有最小值的元素时,该元素需要逐层 向上 调整,直到被调整到 堆顶 位置为止。7.当从一个小根堆中删除一个元素时,需要把 堆尾 元素填补到 堆顶 位置,然后再按条件把它逐层 向下 调整。8.在哈夫曼编码中,若编码长度只允许小于等于 4,则除了已对两个字符编码为 0和 10外,还可以最多对 4 个字符编码。三、应用题1.已知一组元素(46,25,78,62,12,37,70,29),画出按元素排列顺序输入生成的一棵二叉树。解:略2.已知一棵二叉排序树如图 6
18、-11所示,若从中依次删除 72,12,49,28结点,试分别画出每删除一个结点后得到的二叉排序树。解:略28/ 12 49 / 16 34 72/ /30 633.编写一个非递归算法,求出二叉排序树中的关键字最大的元素。解:ElemType FindMax(BTreeNode* BST)/从二叉排序树中返回关键字最大的元素if(BST=NULL)cerrright!=NULL)t=t-right;return t-data;4. 空堆开始依次向堆中插入线性表(38,64,52,15,73,40,48,55,26,12)中的每个元素,请以线性表的形式给出每插入一个元素后堆的状态。(38)(64
19、,38)(64,38,52)(64.38,52,15)(73,64,52,15,38)(73,64,52,15,38,40)(73,64,52,15,38,40,48)(73,64,52,55,38,40,48,15)(73,64,52,55,38,40,48,15,26)(73,64,52,55,38,40,48,15,26,12)5. 已知一个堆为(12,15,40,38,26,52,48,64) ,若需要从堆中依次删除四个元素,请给出每删除一个元素后堆的状态。(15,26,40,38,64,52,48)(26,38,40,48,64,52)(38,48,40,52,64)(40,48,6
20、4,52)6. 有七个带权结点,其权值分别为 3,7,8,2,6,10,14,试以它们为叶子结点构造一棵哈夫曼树,并计算出带权路径长度 WPL。WPL=(6+7)*3+(2+3)J*4+8*3+10*2+14*2=13*3+20+24+20+28=1317. 在一份电文中共使用五种字符:a,b,c,d,e,它们的出现频率依次为 4,7,5,2,9,试画出对应的编码哈夫曼树,求出每个字符的哈夫曼编码,并求出传送电文的总长度。总长度=(2+4)*3+ (5+7+9)*2=18+42=60第七章 图一、填空题1.在一个图中,所有顶点的读数之和等于所有边数的 2 倍。2.在一个具有 n个顶点的无向完全
21、图中,包含有 n(n-1)/2 条边,在一个具有 n个顶点的所有向完全图中,包含有 n(n-1) 条边。3.在一个具有 n个顶点的无向图中,要连通所有顶点则至少需要 n-1 条边。4.表示图的三种存储结构为 邻接矩阵 、 邻接表 和 边集数组 。5.对于一个具有 n个顶点的图,若采用邻接矩阵表示,则其矩阵大小为 n 2。6.对于一个具有 n个顶点和 e条边的有向图和无向图,在其对应的邻接表中,所含边结点分别为 e 和 2e 条。7.在有向图的邻接表和逆邻接表表示中,每个顶点邻接表分别链接着该点的所有出边 和 入边 结点。8.对于一个具有 n个顶点和 e条边的有向图和无向图,若采用边集数组表示,
22、则存于数组中的边数分别为e 和 e 条。9.对于一个具有 n个顶点和 e条边的无向图,当分别采用邻接矩阵,邻接表和边集数组表示时,求任一顶点度数的时间复杂度依次为 O(n) 、O(e/n) 和 O(e)。10.假定一个图具有 n个顶点和 e条边,则采用邻接矩阵、邻接表和边集数组表示时,其相应的空间复杂度分别为 O(n2)、O(n+e)和 O(e)。11.对用邻接矩阵表示的图进行任一种遍历时,其时间复杂度为 O(n2),对用邻接表表示的图进行任一遍历时,其时间复杂度为 O(e) 。12.对于图 7-1(a)所示的无向图,假定用邻接矩阵表示,则从顶点 v0开始进行深度优先搜索遍历得到的顶点序列为
23、0,1,4,2,5,3;从顶点 v0开始进行广度优先搜索遍历得到的顶点序列为 0,1,2,3,4,5。13.对于图 7-1(b)所示的有向图,假定用邻接矩阵表示,则从顶点 v0开始进行深度优先搜索遍历得到的顶点序列为 A,B,C,D,E;从顶点 v0开始进行广度优先搜索遍历得到的顶点序列为A,B,C,E,D。14.对于一个有 n个顶点和 e条边的连通图,其生成树中的对点数和边数分别为 n 和 n-1。15.对于图 7-5(a)所示的带权图,其最小生成树的权为 22 。16.对于图 7-5(a)所示的图,若从顶点 v0出发,则按照普里姆算法生成的最小生成树中,依次得到的各条边为(0,1)5,(1
24、,3)3,(3,2)6,(1,4)8。 17.对于图 7-5(a)所示的图,若按照克鲁斯卡算法产生最小生成树,则得到的各条边依次为(1,3)3,(0,1)5,(2,3)6,(1,4)8 。18.假定用一给数组 dn存储一个 AOV网中用于拓朴排序的顶点入度,则值为 0的元素被链接成为一个 栈 。二、应用题1.对于图 7-25(a)和(b),按下列条件试分别写出从顶点 v0出发按深度优先搜索遍历得到的顶点序列和按广度优先搜索遍历得到的顶点序列。 假定它们均采用邻接矩阵表示; 假定它们均采用邻接表表示,并且假定每个顶点邻接表中的结点是按顶点序号从大到小的次序链接的。解: 采用邻接矩阵表示得到的顶点
25、序列如下表所示:图 深度优先序列 广度优先序列(a) 0,1,2,8,3,4,5,6,7,9 0,1,4,2,7,3,8,6,5,9(b) 0,1,2,5,8,4,7,3,6 0,1,3,4,2,6,7,5,8 采用邻接表表示得到的顶点序列如下表所示:图 深度优先序列 广度优先序列(a) 0,4,3,8,9,5,6,7,1,2 0,4,1,3,7,2,8,6,9,5(b) 0,4,7,5,8,3,6,1,2 0,4,3,1,7,5,6,2,82.假定采用邻接矩阵表示,编写出进行深度优先遍历的非递归算法。解:void dfss(adjmatrix GA,int i,int n)stack s;I
26、nitstack(s);push(s,i);while(!StackEmpty(s)int k=pos(s);if(!visitedk)couthigh) i=low;if(i=m) return -1;j=bi.start;while(jbi.start+bi.length)if(k=aj.key) break;if(jbi.start+bi.length) return j;else return -1;3. 假定一个待散列存储的线性表为(32,75,29,63,48,94,25,46,18,70),散列地址空间为 HT13,若采用除留余数法构造散列函数和线性探查法处理冲突,试求出每一元素
27、的散列地址,画出最后得到的散列表,求出平均查找长度。散列函数:H(reg)=reg mod 13H(32)=6 H(75)=10 H(29)=3 H(63)=11 H(48)=9H(94)=3 H1=4 H(25)=12 H(46)=7 H(18)=5 H(70)=5 H3=8HT29 94 18 32 46 70 48 75 63 250 1 2 3 4 5 6 7 8 9 10 11 12ASL=1/10*(8+2+4)=1.44. 假定一个待散列存储的线性表为(32,75,29,63,48,94,25,36,18,70),散列地址空间为 HT11,若采用除留余数法构造散列函数和链接法处理
28、冲突,试求出每一元素的散列地址,画出最后得到的散列表,求出平均查找长度。H(key)= key mod 11H(32)=10 H(75)=9 H(29)=7 H(63)=8 H(48)=4H(94)=6 H(25)=3 H(36)=3 H(18)=7 H(70)=4ASL=1/10*(7+6)=1.35. 已知一组关键字为(26,38,12,45,73,64,30,56),试依次插入关键字生成一棵 3 阶的 B_树,画出每次插入一个关键字后 B_树的结构。第九章排序一、填空题1.每次从无序表中取出一个元素,把它插入到有序表中的适当位置,此种排序方法叫做 插入 排序;每次从无序表中挑选出一个最小
29、或最大元素,把它交换到有序表的一端,此种排序方法叫做 选择排序。2每次直接或通过基准元素间接比较两个元素,若出现逆序排列时就交换它们的位置,此种排序方法叫做交换排序,每次使两个相邻的有序表合并成一个有序表的排序方法叫做二路归并排序。3在直接选择排序中,记录比较次数的时间复杂度为 O(n 2),记录移动次数的时间复杂度为 O(n) 。4在堆排序的过程中,对 n个记录建立初始堆需要进行n/2次筛运算,由初始堆到堆排序结束,需要对树根结点进行 n-1次筛运算。5在堆排序过程中,对任一分支结点进行筛运算的时间复杂度为 O(log2n),整个堆排序过程的时间复杂度为 O(nlog2n)。6假定一组的记录
30、的排序码为(46,79,56,38,40,84),则利用堆排序方法建立的初始堆为(84,79,56,38,40,46)。7快速排序在平均情况下的时间复杂度为 O(nlog2n),在最坏情况下的时间复杂度为O(n2)。8快速排序在平均情况下的空间复杂度为 O(log2n),在最坏情况下的空间复杂度为O(n) 。9在快速排序方法中,进行每次划分时,是从当前待排序空间的 两端 向 中间 依次查找出处于逆序的元素并交换之,最后将基准元素交换到一个确定位置,从而以该位置把当前区间划分为前后两个子区间。10假定一组记录的排序码为(46,79,56,38,40,80),对其进行快速排序的一次划分的结果为38
31、 404656 79 84。11假定一组记录的排序码为(46,79,56,38,40,80),对其进行快速排序过程中,对应二叉树的深度为 4 ,分支点结点数为 4 。12在二路归并排中,对 n个记录进行归并的趟数为 log 2n 。13在归并排序中,进行每趟归并的时间复杂度为 O(n),整个排序过程的时间复杂度为O(nlog2n),空间复杂度为 O(n) 。14对 20个记录进行归并排序时,共需要进行 5 趟归并,在第三趟归并时是把长度为 4 的有序表两两归并为长度为 8 的有序表。15假定一组记录的排序码为(46,79,56,38,40,80),对其进行归并排序的过程中,第二趟归并后的结果为
32、38 46 56 7940 84。二、应用题1. 给出每一种排序算法的时间复杂度、空间复杂度及稳定性。时间复杂度 空间复杂度 稳定性直接插入排序 O(n2) O(1) 稳定气泡排序 O(n2) O(1) 稳定归并排序 O(nlogn) O(n) 稳定直接选择排序 O(n2) O(1) 不稳定快速排序 O(nlogn) O(logn) 不稳定堆排序 O(nlogn) O(1) 不稳定2. 已知一组元素的排序码为(46,74,16,53,14,26,40,38,86,65,27,34)(1) 利用直接插入排序的方法写出每次向前面有序表插入一个元素后的排列结果。(46 74 16 53 14 26
33、40 38 86 65 27 34)(46 74 16 53 14 26 40 38 86 65 27 34)(16 46 74 53 14 26 40 38 86 65 27 34)(16 46 53 74 14 26 40 38 86 65 27 34)(14 16 46 53 74 26 40 38 86 65 27 34)(14 16 26 46 53 74 40 38 86 65 27 34)(14 16 26 40 46 53 74 38 86 65 27 34)(14 16 26 38 40 46 53 74 86 65 27 34)(14 16 26 38 40 46 53 7
34、4 86 65 27 34)(14 16 26 38 40 46 53 65 74 86 27 34)(14 16 26 27 38 40 46 53 65 74 86 34)(14 16 26 27 34 38 40 46 53 65 74 86)(2) 利用直接选择排序方法写出每次选择和交换后的排列结果。(14,74,16,53,46,26,40,38,86,65,27,34)(14,16,74,53,46,26,40,38,86,65,27,34)(14,16,26,53,46,74,40,38,86,65,27,34)(14,16,26,27,46,74,40,38,86,65,53,
35、34)(14,16,26,27,34,74,40,38,86,65,53,46)(14,16,26,27,34,38,74,40,86,65,53,46)(14,16,26,27,34,38,40,74,86,65,53,46)(14,16,26,27,34,38,40,46,86,65,53,74)(14,16,26,27,34,38,40,46,53,65,86,74)(14,16,26,27,34,38,40,46,53,65,74,86)(3) 利用堆排序的方法写出在构成初始堆和利用堆排序的过程中,每次筛运算后的排列结果,并画出初始堆所对应的完全二叉树。初始堆:(86, 74, 40,
36、 53, 65, 34, 16, 38, 46, 14, 27,26)堆排序:(74,65,40,53,27,34,16,38,46,14,26,86)(65,53,40,46,27,34,16,38,26,14) (53,46,40,38,27,34,16,14,26)(46,38,40,26,27,34,16, 14) (46,38,34,26,27,14,16)(38,27,34,26,16,14)(34,27,14,26,16)(27,26,14,16)(26,16,14)(16,14)(14)(4) 利用快速排序的方法写出每一层划分后的排列结果,并画出由此快速排序得到的二叉搜索树。34,27,16,38,14,26,40 46 86,65,53,7426,27,16,14 34 38,40 46 74,65,53 8414,16 26 27 34 38 40 46 53,65 74 8414 16 26 27 34 38 40 46 53 65 74 8414 16 26 27 34 38 40 46 53 65 74 86