1、数据结构 第3次第3次作业一、填空题(本大题共30分,共 10 小题,每小题 3 分)1. 栈是一种特殊的线性表,允许插入和删除运算的一端称为 _ 。不允许插入和删除运算的一端称为 _ 。2. 二叉树由 , , 三个基本单元组成。3. 构造连通网最小生成树的两个典型算法是_。4. 在一个稀疏矩阵中,每个非零元素所对应的三元组包括该元素的_、_和_三项。5. 直接插入排序用监视哨的作用是_。6. AOV网中,结点表示_,边表示_。AOE网中,结点表示_,边表示_。7. 已知指针p指向单链表L中的某结点,则删除其后继结点的语句是_。8. 一棵深度为6的满二叉树有_个分支结点和_个叶子。9. 已知二
2、叉树前序为ABDEGCF,中序为DBGEACF,则后序一定是 。10. 在哈希文件中,处理冲突的方法通常有_、_ 、_和_四种。二、算法设计题(本大题共20分,共 2 小题,每小题 10 分)1. 编写一个算法将一个头结点指针为pa的单链表A分解成两个单链表A和B,其头结点指针分别为pa和pb,使得A链表中含有原链表A中序号为奇数的元素,而链表B中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。2. 设稀疏矩阵Mmxn中有t个非零元素,用三元组顺序表的方式存储。请设计一个算法,计算矩阵M的转置矩阵N,要求转置算法的时间复杂度为O(n+t)。三、简答题(本大题共20分,共 4 小题,每小题
3、 5 分)1. 假设用于通信的电文由字符集a,b,c,d,e,f,g,h中的字母构成,这8个字母在电文中出现的概率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10. (1)为这8个字母设计哈夫曼编码。 (2)若用这三位二进制数(07)对这8个字母进行等长编码,则哈夫曼编码的平均码长是等长编码的百分之几?它使电文总长平均压缩多少?2. 若二叉树中各结点的值均不相同,则由二叉树的前序序列和中序序列,或由其后序序列和中序序列均能唯一地确定一棵二叉树,但由前序序列和后序序列却不一定能唯一地确定一棵二叉树。 (1)已知一棵二叉树的前序序列和中序序列分别为ABDGHCE
4、FI和GDHBAECIF,请画出此二叉树。 (2)已知一棵二叉树的在序序列和后序序列分别为BDCEAFHG和DECBHGFA,请画出此二叉树。 (3)已知一棵二叉树的前序序列和后序序列分别为AB和BA,请画出这两棵不同的二叉树。3. 试举一个数据结构的例子、叙述其逻辑结构、存储结构、运算三个方面的内容。 4. 给定集合15,3,14,2,6,9,16,17(1)(3分)用表示外部结点,用表示内部结点,构造相应的huffman树:(2) (2分)计算它的带权路径长度:(3)(2分)写出它的huffman编码:(4)(3分)huffman编码常用来译码,请用语言叙述写出其译码的过程。四、程序设计题
5、(本大题共30分,共 2 小题,每小题 15 分)1. 以二叉链表为存储结构,写出求二叉树叶子总数的算法 2. 设线性表的n个结点定义为(a0,a1,.an-1),重写顺序表上实现的插入算法:InsertList 答案:一、填空题(30分,共 10 题,每小题 3 分)1. 参考答案:栈顶,栈底解题方案:评分标准:2. 参考答案:根结点,左子树,右子树解题方案:评分标准:3. 参考答案:普里姆(prim)算法和克鲁斯卡尔(Kruskal)算法解题方案:评分标准:4. 参考答案:行号、列号、元素值解题方案:评分标准:5. 参考答案:免去查找过程中每一步都要检测整个表是否查找完毕,提高了查找效率。
6、解题方案:评分标准:6. 参考答案:(1)活动(2)活动间的优先关系(3)事件(4)活动边上的权代表活动持续时间解题方案:评分标准:7. 参考答案:q=p-next; p-next=q-next; free(q);解题方案:评分标准:8. 参考答案:n1+n2=0+ n2= n0-1=31,26-1 =32解题方案:评分标准:9. 参考答案:DGEBFCA解题方案:评分标准:10. 参考答案:开放地址法、再哈希法、链地址法、建立一个公共溢出区解题方案:评分标准:二、算法设计题(20分,共 2 题,每小题 10 分)1. 参考答案:将单链表A中的所有偶数序号的结点删除,并在删除时把这些结点链接起
7、来构成单链表B。算法如下: #include#includetypedef int ElemType;typedef struct LNodeElemType data; /数据域struct LNode *next; /指针域 LNode,*LinkList;void divide(LinkList&pa, LinkList&pb) pb=(LNode *)malloc(sizeof(LNode *); pb-next=NULL; r=pb; p=pa-next; while(p!=NULL & p-next!=NULL) q=p-next; if(q!=NULL) p-next=q-nex
8、t; r-next=q; r=q; p=p-next; r-next=NULL; 解题方案:评分标准:2. 参考答案:转置可按转置矩阵的三元组表中的元素顺序进行,即按稀疏矩阵的列序。这种方法时间复杂度是O(n*t),当t和m*n同量级时,时间复杂度为O(n3)。另一种转置方法称作快速转置,使时间复杂度降为O(m*n)。需要求出每列非零元素个数和每列第一个非零元素在转置矩阵三元组表中的位置,因此设置了两个附加向量。下面分别给出两个算法。TSMatrixTransMatrix(TSMatrixM,TSMatrix N)采用三元组表方式存储,按列序实现矩阵的转置N.m=M.n; N.n=M.m; N
9、.len=M.len; 行数、列数和非零元素个数 if(N.len)ql; 设置N中第一个非零元素从下标1开始存储for(j1;jM.n;j+) 按列,共M.n列 for(p1;pM.len; +p) 在M.len个元素中查找 if(M.datap.col=j) 转置N.dataq.row=M.datap.col;N.dataq.col=M.datap.row;N.dataq.e=M.datap.e; q+; return N;TransMatrixTSMatrixFastTransMatrix(TSMatrix M, TSMatrix N)三元组表上实现矩阵的快速转置的算法N.m=M.n;
10、N.n=M.m; N.len=M.len;if(M.len) for(j=1;j=M.n;j+) numbj=0; 矩阵M每一列非零元初始化为零 for(t=1;t=M.len;t+)numbM.datat.col+;求矩阵M每一列得非零元个数pos1=1; 第1列第一个非零元在转置后的三元组中下标是1 for(j=2;j=M.n;j+) 求M.data第j列第一个非零元在N.data中的序号poscol=poscol-1+numcol-1; for(p=1;plchild=NULL)&(T-rchild=NULL) return 1; else return Leaf(T-lchild)+N
11、ode(T-rchild); else return 0; 解题方案:评分标准:2. 参考答案:#define ListSize 100 / 假定表空间大小为100typedef int DataType;/假定DataType的类型为int型typedef struct DataType dataListSize;/ 向量data用于存放表结点 int length; / 当前的表长度 Seqlist; /以上为定义表结构void InsertList ( Seqlist *L, Datatype x, int i)/将新结点x插入L所指的顺序表的第i个结点ai的位置上,即插入的合法位置为:0=ilengthint j;if ( i L - length ) Error(position error);/ 非法位置,退出,该函数定义见教材P7.if ( L-length=ListSize ) Error(“overflow);for ( j=L-length-1 ; j = i ; j -) L-data j+1=L-data j ;L-data i =x ;L-length+ ;解题方案:评分标准:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1