数据结构(c语言版)第五章答案

合集下载

数据结构第五章 查找 答案

数据结构第五章 查找 答案

数据结构与算法上机作业第五章查找一、选择题1、若构造一棵具有n个结点的二叉排序树,在最坏情况下,其高度不超过 B 。

A. n/2B. nC. (n+1)/2D. n+12、分别以下列序列构造二叉排序数(二叉查找树),与用其他3个序列所构造的结果不同的是 C :A. (100, 80, 90, 60, 120, 110, 130)B. (100, 120, 110, 130, 80, 60, 90)C. (100, 60, 80, 90, 120, 110, 130)D. (100, 80, 60, 90, 120, 130, 110)3、不可能生成下图所示的二叉排序树的关键字的序列是 A 。

A. 4 5 3 1 2B. 4 2 5 3 1C. 4 5 2 1 3D. 4 2 3 1 54、在二叉平衡树中插入一个结点造成了不平衡,设最低的不平衡点为A,并已知A的左孩子的平衡因子为0,右孩子的平衡因子为1,则应作 C 型调整使其平衡。

A. LLB. LRC. RLD. RR5、一棵高度为k的二叉平衡树,其每个非叶结点的平衡因子均为0,则该树共有 C 个结点。

A. 2k-1-1B. 2k-1+1C. 2k-1D. 2k+16、具有5层结点的平衡二叉树至少有 A 个结点。

A. 12B. 11C. 10D. 97、下面关于B-和B+树的叙述中,不正确的是 C 。

A. B-树和B+树都是平衡的多叉树B. B-树和B+树都可用于文件的索引结构C. B-树和B+树都能有效地支持顺序检索D. B-树和B+树都能有效地支持随机检索8、下列关于m阶B-树的说法错误的是 D 。

A. 根结点至多有m棵子树B. 所有叶子结点都在同一层次C. 非叶结点至少有m/2(m为偶数)或m/2+1(m为奇数)棵子树D. 根结点中的数据是有序的9、下面关于哈希查找的说法正确的是 C 。

A. 哈希函数构造得越复杂越好,因为这样随机性好,冲突小B. 除留余数法是所有哈希函数中最好的C. 不存在特别好与坏的哈希函数,要视情况而定D. 若需在哈希表中删去一个元素,不管用何种方法解决冲突都只要简单地将该元素删去即可10、与其他查找方法相比,散列查找法的特点是 C 。

数据结构(c语言版)第五章答案

数据结构(c语言版)第五章答案

数据结构(c语言版)第五章答案第五章1、设二维数组A【8】【10】是一个按行优先顺序存储在内存中的数组,已知A【0】【0】的起始存储位置为1000,每个数组元素占用4个存储单元,求:(1)A【4】【5】的起始存储位置。

A【4】【5】的起始存储位置为1000+(10*4+5)*4=1180;(2)起始存储位置为1184的数组元素的下标。

起始存储位置为1184的数组元素的下标为4(行下标)、6(列下标)。

2、画出下列广义表D=((c),(e),(a,(b,c,d)))的图形表示和它们的存储表示。

略,参考第5·2节应用题第5题分析与解答。

3、已知A为稀疏矩阵,试从时间和空间角度比较采用两种不同的存储结构(二维数组和三元组表)实现求∑a(i,j)运算的优缺点。

稀疏矩阵A采用二维数组存储时,需要n*n个存储单元,完成求∑ii a(1≤i≤n)时,由于a【i】【i】随机存取,速度快。

但采用三元组表时,若非零元素个数为t,需3t+3个存储单元(t个分量存各非零元素的行值、列值、元素值),同时还需要三个存储单元存储存稀疏矩阵A的行数、列数和非零元素个数,比二维数组节省存储单元;但在求∑ii a(1≤i≤n)时,要扫描整个三元组表,以便找到行列值相等的非零元素求和,其时间性能比采用二维数组时差。

4、利用三元组存储任意稀疏数组时,在什么条件下才能节省存储空间?当m行n列稀疏矩阵中非零元素个数为t,当满足关系3*t<m*n 时,利用三元组存储稀疏数组时,才能节省存储空间。

< bdsfid="74" p=""></m*n时,利用三元组存储稀疏数组时,才能节省存储空间。

<>5、求下列各广义表的操作结果。

(1)GetHead((a,(b,c),d))GetHead((a,(b,c),d))=a(2)GetTail((a,(b,c),d))GetTail((a,(b,c),d))=((b,c),d)(3)GetHead(GetTail((a,(b,c),d)))GetHead(GetTail((a,(b,c),d)))=(b,c)(4)GetTail(GetHead((a,(b,c),d)))GetTail(GetHead((a,(b,c),d)))=()第六章1、已知一棵树边的集合为{(i,m),(i,n),(e,i),(b,e),(b,d),(a,b),(g,j),(g,k),(c,g),(c,f),(h,l),(c,h),(a,c)}用树形表示法画出此树,并回答下列问题:(1)哪个是根结点?(2)哪些是叶结点?(3)哪个是g的双亲?(4)哪些是g的祖先?(5)哪些是g的孩子?(6)哪些是e的子孙?(7)哪些是e的兄弟?哪些是f的兄弟?(8)结点b和n的层次号分别是什么?(9)树的深度是多少?(10)以结点c为根的子树的深度是多少?(11)树的度数是多少?略。

数据结构第五章参考答案

数据结构第五章参考答案

习题51.填空题(1)已知二叉树中叶子数为50,仅有一个孩子的结点数为30,则总结点数为(___________)。

答案:129(2)3个结点可构成(___________)棵不同形态的二叉树。

答案:5(3)设树的度为5,其中度为1~5的结点数分别为6、5、4、3、2个,则该树共有(___________)个叶子。

答案:31(4)在结点个数为n(n>1)的各棵普通树中,高度最小的树的高度是(___________),它有(___________)个叶子结点,(___________)个分支结点。

高度最大的树的高度是(___________),它有(___________)个叶子结点,(___________)个分支结点。

答案:2 n-1 1 n 1 n-1(5)深度为k的二叉树,至多有(___________)个结点。

答案:2k-1(6)(7)有n个结点并且其高度为n的二叉树的数目是(___________)。

答案:2n-1(8)设只包含根结点的二叉树的高度为0,则高度为k的二叉树的最大结点数为(___________),最小结点数为(___________)。

答案:2k+1-1 k+1(9)将一棵有100个结点的完全二叉树按层编号,则编号为49的结点为X,其双亲PARENT (X)的编号为()。

答案:24(10)已知一棵完全二叉树中共有768个结点,则该树中共有(___________)个叶子结点。

答案:384(11)(12)已知一棵完全二叉树的第8层有8个结点,则其叶子结点数是(___________)。

答案:68(13)深度为8(根的层次号为1)的满二叉树有(___________)个叶子结点。

答案:128(14)一棵二叉树的前序遍历是FCABED,中序遍历是ACBFED,则后序遍历是(___________)。

答案:ABCDEF(15)某二叉树结点的中序遍历序列为ABCDEFG,后序遍历序列为BDCAFGE,则该二叉树结点的前序遍历序列为(___________),该二叉树对应的树林包括(___________)棵树。

《数据结构—用C语言描述》课后习题答案

《数据结构—用C语言描述》课后习题答案

数据结构课后习题参考答案第一章绪论1.3 (1) O(n)(2)(2)O(n)(3)(3)O(n)(4)(4)O(n1/2)(5)(5)执行程序段的过程中,x,y值变化如下:循环次数x y0(初始)91 1001 92 1002 93 100………………9 100 10010 101 10011 91 9912 92 100………………20 101 9921 91 98………………30 101 9831 91 97到y=0时,要执行10*100次,可记为O(10*y)=O(n)1.5 2100 , (2/3)n , log2n , n1/2 ,n3/2, (3/2)n , n log2n , 2 n ,n! , n n第二章线性表(参考答案)在以下习题解答中,假定使用如下类型定义:(1)顺序存储结构:#define MAXSIZE 1024typedef int ElemType;// 实际上,ElemType可以是任意类型typedef struct{ ElemType data[MAXSIZE];int last; // last表示终端结点在向量中的位置}sequenlist;(2)链式存储结构(单链表)typedef struct node{ElemType data;struct node *next;}linklist;(3)链式存储结构(双链表)typedef struct node{ElemType data;struct node *prior,*next;}dlinklist;(4)静态链表typedef struct{ElemType data;int next;}node;node sa[MAXSIZE];2.1 头指针:指向链表的指针。

因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。

如:链表的头指针是la,往往简称为“链表la”。

数据结构(C语言版)1-5章练习 答案 清华大学出版社

数据结构(C语言版)1-5章练习 答案 清华大学出版社

1-5章数据结构作业答案一、设n为整数,利用大“O”记号,求下列程序段的时间复杂度1、i=0;k=0;Do{ k=k*10*i; i++;} while (i<n);// T(n)=O(n)2、i=1; j=0;while(i+j<=n){ if(i>j) j++;else i++;}// T(n)=O(n)3、x=n; //n>1while (x>=(y+1)*(y+1))y++;// T(n)=O(n)4、x=91; y=100;while (y>0)if (x>100) {x=x-10; y- -;}else x++;// T(n)=常数=O(1)二、选择题1、从逻辑上可以把数据结构分为( C )两大类。

A.动态结构、静态结构B.顺序结构、链式结构C.线性结构、非线性结构D.初等结构、构造型结构2、以下数据结构中,哪一个是线性结构( D )?A.广义表 B. 二叉树 C. 稀疏矩阵 D. 串3、在下面的程序段中,对x的赋值语句的频度为( C )for (i=1;i<=n;i++)for (j=1;j<=n;j++)x=x+1;n) A. O(2n) B.O(n) C.O(n2) D.O(log24、下面关于线性表的叙述中,错误的是哪一个?( B )A.线性表采用顺序存储,必须占用一片连续的存储单元。

B.线性表采用顺序存储,便于进行插入和删除操作。

C.线性表采用链接存储,不必占用一片连续的存储单元。

D.线性表采用链接存储,便于插入和删除操作。

5、某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( D )存储方式最节省运算时间。

A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表6、静态链表中指针表示的是( B ).A.内存地址 B.数组下标 C.下一元素地址 D.左、右孩子地址7、下面的叙述不正确的是( B、C )A.线性表在链式存储时,查找第i个元素的时间同i的值成正比B. 线性表在链式存储时,查找第i个元素的时间同i的值无关C. 线性表在顺序存储时,查找第i个元素的时间同i 的值成正比D. 线性表在顺序存储时,查找第i个元素的时间同i的值无关8、若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为( C )(1<=i<=n+1)。

数据结构第五章考试题库(含答案)

数据结构第五章考试题库(含答案)

第 5 章数组和广义表一、选择题为第一元素,其存储地址为1,1.设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11的地址为()。

【燕山大学 2001 一、2 (2分)】每个元素占一个地址空间,则a85A. 13B. 33C. 18D. 402. 有一个二维数组A[1:6,0:7] 每个数组元素用相邻的6个字节存储,存储器按字节编址,那么这个数组的体积是(①)个字节。

假设存储数组元素A[1,0]的第一个字节的地址是0,则存储数组A的最后一个元素的第一个字节的地址是(②)。

若按行存储,则A[2,4]的第一个字节的地址是(③)。

若按列存储,则A[5,7]的第一个字节的地址是(④)。

就一般情况而言,当(⑤)时,按行存储的A[I,J]地址与按列存储的A[J,I]地址相等。

供选择的答案:【上海海运学院 1998 二、2 (5分)】①-④: A.12 B. 66 C. 72 D. 96 E. 114 F. 120G. 156 H. 234 I. 276 J. 282 K. 283 L. 288⑤: A.行与列的上界相同 B. 行与列的下界相同C. 行与列的上、下界都相同D. 行的元素个数与列的元素个数相同3. 设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( )。

A. BA+141B. BA+180C. BA+222D. BA+225【南京理工大学 1997 一、8 (2分)】4. 假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=()。

【福州大学 1998 一、10 (2分)】A. 808B. 818C. 1010D. 10205. 数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是( )。

数据结构(c语言版)题集答案——第五章_数组和广义表

数据结构(c语言版)题集答案——第五章_数组和广义表

第五章数组和广义表5.18void RSh(int A[n],int k)//把数组A的元素循环右移k位,只用一个辅助存储空间{for(i=1;i<=k;i++)if(n%i==0&&k%i==0) p=i;//求n和k的最大公约数pfor(i=0;i{j=i;l=(i+n-k)%n;temp=A[i];while(l!=i){A[j]=A[l];j=l;l=(j+n-k)%n;}// 循环右移一步A[j]=temp;}//for}//RSh分析:要把A的元素循环右移k位,则A[0]移至A[k],A[k]移至A[2k]......直到最终回到A[0].然而这并没有全部解决问题,因为有可能有的元素在此过程中始终没有被访问过,而是被跳了过去.分析可知,当n和k的最大公约数为p时,只要分别以A[0],A[1],...A[p-1]为起点执行上述算法,就可以保证每一个元素都被且仅被右移一次,从而满足题目要求.也就是说,A的所有元素分别处在p个"循环链"上面.举例如下:n=15,k=6,则p=3.第一条链:A[0]->A[6],A[6]->A[12],A[12]->A[3],A[3]->A[9],A[9]->A[0].第二条链:A[1]->A[7],A[7]->A[13],A[13]->A[4],A[4]->A[10],A[10]->A[1].第三条链:A[2]->A[8],A[8]->A[14],A[14]->A[5],A[5]->A[11],A[11]->A[2].恰好使所有元素都右移一次.虽然未经数学证明,但作者相信上述规律应该是正确的.5.19void Get_Saddle(int A[m][n])//求矩阵A中的马鞍点{for(i=0;i{for(min=A[i][0],j=0;jif(A[i][j]for(j=0;jif(A[i][j]==min) //判断这个(些)最小值是否鞍点{for(flag=1,k=0;kif(minif(flag)printf("Found a saddle element!\nA[%d][%d]=%d",i,j,A[i][j]);}}//for}//Get_Saddle5.20int exps[MAXSIZE]; //exps数组用于存储某一项的各变元的指数int maxm,n; //maxm指示变元总数,n指示一个变元的最高指数void Print_Poly_Descend(int *a,int m)//按降幂顺序输出m元多项式的项,各项的系数已经按照题目要求存储于m维数组中,数组的头指针为a{maxm=m;for(i=m*n;i>=0;i--) //按降幂次序,可能出现的最高项次数为mnGet_All(a,m,i,0); //确定并输出所有次数为i的项}//Print_Poly_Descendvoid Get_All(int *a,int m,int i,int seq)//递归求出所有和为i的m个自然数{if(seq==maxm) Print_Nomial(a,exps); //已经求完时,输出该项else{min=i-(m-1)*n; //当前数不能小于minif(min<0) min=0;max=nfor(j=min;j<=max;j++){exps[seq]=j; //依次取符合条件的数Get_All(a,m-1,i-j,seq+1); //取下一个数}}//elseexps[seq]=0; //返回}//Get_Allvoid Print_Nomial(int *a,int exps[ ])//输出一个项,项的各变元的指数已经存储在数组exps中{pos=0;for(i=0;i{pos*=n;pos+=exps[i];}coef=*(a+pos); //取得该系数coefif(!coef) return; //该项为0时无需输出else if(coef>0) printf("+"); //系数为正时打印加号else if(coef<0) printf("-"); //系数为负时打印减号if(abs(coef)!=1) printf("%d",abs(coef)); //当系数的绝对值不为1时打印系数for(i=0;iif(exps[i]) //打印各变元及其系数{printf("x");printf("%d",i);printf("E");if(exps[i]>1) printf("%d",exp[i]); //系数为1时无需打印}}//Print_Nomial分析:本算法的关键在于如何按照降幂顺序输出各项.这里采用了一个递归函数来找到所有满足和为i的m个自然数作为各变元的指数.只要先取第一个数为j,然后再找到所有满足和为i-j的m-1个自然数就行了.要注意j的取值范围必须使剩余m-1个自然数能够找到,所以不能小于i-(m-1)*maxn,也不能大于i.只要找到了一组符合条件的数,就可以在存储多项式系数的数组中确定对应的项的系数的位置,并且在系数不为0时输出对应的项.5.21void TSMatrix_Add(TSMatrix A,TSMatrix B,TSMatrix &C)//三元组表示的稀疏矩阵加法{C.mu=A.mu;C.nu=A.nu;C.tu=0;pa=1;pb=1;pc=1;for(x=1;x<=A.mu;x++) //对矩阵的每一行进行加法{while(A.data[pa].iwhile(B.data[pb].iwhile(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素{if(A.data[pa].j==B.data[pb].j){ce=A.data[pa].e+B.data[pb].e;if(ce) //和不为0{C.data[pc].i=x;C.data[pc].j=A.data[pa].j;C.data[pc].e=ce;pa++;pb++;pc++;}}//ifelse if(A.data[pa].j>B.data[pb].j){C.data[pc].i=x;C.data[pc].j=B.data[pb].j;C.data[pc].e=B.data[pb].e;pb++;pc++;}else{C.data[pc].i=x;C.data[pc].j=A.data[pa].j;C.data[pc].e=A.data[pa].epa++;pc++;}}//whilewhile(A.data[pa]==x) //插入A中剩余的元素(第x行){C.data[pc].i=x;C.data[pc].j=A.data[pa].j;C.data[pc].e=A.data[pa].epa++;pc++;}while(B.data[pb]==x) //插入B中剩余的元素(第x行){C.data[pc].i=x;C.data[pc].j=B.data[pb].j;C.data[pc].e=B.data[pb].e;pb++;pc++;}}//forC.tu=pc;}//TSMatrix_Add5.22void TSMatrix_Addto(TSMatrix &A,TSMatrix B)//将三元组矩阵B加到A上{for(i=1;i<=A.tu;i++)A.data[MAXSIZE-A.tu+i]=A.data[i];/把A的所有元素都移到尾部以腾出位置pa=MAXSIZE-A.tu+1;pb=1;pc=1;for(x=1;x<=A.mu;x++) //对矩阵的每一行进行加法{while(A.data[pa].iwhile(B.data[pb].iwhile(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素{if(A.data[pa].j==B.data[pb].j){ne=A.data[pa].e+B.data[pb].e;if(ne) //和不为0{A.data[pc].i=x;A.data[pc].j=A.data[pa].j;A.data[pc].e=ne;pa++;pb++;pc++;}}//ifelse if(A.data[pa].j>B.data[pb].j){A.data[pc].i=x;A.data[pc].j=B.data[pb].j;A.data[pc].e=B.data[pb].e;pb++;pc++;}else{A.data[pc].i=x;A.data[pc].j=A.data[pa].j;A.data[pc].e=A.data[pa].epa++;pc++;}}//whilewhile(A.data[pa]==x) //插入A中剩余的元素(第x行){A.data[pc].i=x;A.data[pc].j=A.data[pa].j;A.data[pc].e=A.data[pa].epa++;pc++;}while(B.data[pb]==x) //插入B中剩余的元素(第x行){A.data[pc].i=x;A.data[pc].j=B.data[pb].j;A.data[pc].e=B.data[pb].e;pb++;pc++;}}//forA.tu=pc;for(i=A.tu;i}//TSMatrix_Addto5.23typedef struct{int j;int e;} DSElem;typedef struct{DSElem data[MAXSIZE];int cpot[MAXROW];//这个向量存储每一行在二元组中的起始位置int mu,nu,tu;} DSMatrix; //二元组矩阵类型Status DSMatrix_Locate(DSMatrix A,int i,int j,int &e)//求二元组矩阵的元素A[i][j]的值e {for(s=A.cpot[i];sif(s{e=A.data[s];return OK;}return ERROR;}//DSMatrix_Locate5.24typedef struct{int seq; //该元素在以行为主序排列时的序号int e;} SElem;typedef struct{SElem data[MAXSIZE];int mu,nu,tu;} SMatrix; //单下标二元组矩阵类型Status SMatrix_Locate(SMatrix A,int i,int j,int &e)//求单下标二元组矩阵的元素A[i][j]的值e {s=i*A.nu+j+1;p=1;while(A.data[p].seqif(A.data[p].seq==s) //找到了元素A[i][j]{e=A.data[p].e;return OK;}return ERROR;}//SMatrix_Locate5.25typedef enum{0,1} bool;typedef struct{int mu,nu;int elem[MAXSIZE];bool map[mu][nu];} BMMatrix; //用位图表示的矩阵类型void BMMatrix_Add(BMMatrix A,BMMatrix B,BMMatrix &C)//位图矩阵的加法{C.mu=A.mu;C.nu=A.nu;pa=1;pb=1;pc=1;for(i=0;ifor(j=0;j{if(A.map[i][j]&&B.map[i][j]&&(A.elem[pa]+B.elem[pb]))//结果不为0{C.elem[pc]=A.elem[pa]+B.elem[pb];C.map[i][j]=1;pa++;pb++;pc++;}else if(A.map[i][j]&&!B.map[i][j]){C.elem[pc]=A.elem[pa];C.map[i][j]=1;pa++;pc++;}else if(!A.map[i][j]&&B.map[i][j]){C.elem[pc]=B.elem[pb];C.map[i][j]=1;pb++;pc++;}}}//BMMatrix_Add5.26void Print_OLMatrix(OLMatrix A)//以三元组格式输出十字链表表示的矩阵{for(i=0;i{if(A.rhead[i])for(p=A.rhead[i];p;p=p->right) //逐次遍历每一个行链表printf("%d %d %d\n",i,p->j,p->e;}}//Print_OLMatrix5.27void OLMatrix_Add(OLMatrix &A,OLMatrix B)//把十字链表表示的矩阵B加到A上{for(j=1;j<=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后一个元素的指针for(i=1;i<=A.mu;i++){pa=A.rhead[i];pb=B.rhead[i];pre=NULL;while(pb){if(pa==NULL||pa->j>pb->j) //新插入一个结点{p=(OLNode*)malloc(sizeof(OLNode));if(!pre) A.rhead[i]=p;else pre->right=p;p->right=pa;pre=p;p->i=i;p->j=pb->j;p->e=pb->e; //插入行链表中if(!A.chead[p->j]){A.chead[p->j]=p;p->down=NULL;}else{while(cp[p->j]->down) cp[p->j]=cp[p->j]->down;p->down=cp[p->j]->down;cp[p->j]->down=p;}cp[p->j]=p; //插入列链表中}//ifelse if(pa->jj){pre=pa;pa=pa->right;} //pa右移一步else if(pa->e+pb->e){pa->e+=pb->e;pre=pa;pa=pa->right;pb=pb->right;} //直接相加else{if(!pre) A.rhead[i]=pa->right;else pre->right=pa->right;p=pa;pa=pa->right; //从行链表中删除if(A.chead[p->j]==p)A.chead[p->j]=cp[p->j]=p->down;else cp[p->j]->down=p->down; //从列链表中删除free (p);}//else}//while}//for}//OLMatrix_Add分析:本题的具体思想在课本中有详细的解释说明.5.28void MPList_PianDao(MPList &L)//对广义表存储结构的多元多项式求第一变元的偏导{for(p=L->hp->tp;p&&p->exp;pre=p,p=p->tp){if(p->tag) Mul(p->hp,p->exp);else p->coef*=p->exp; //把指数乘在本结点或其下属结点上p->exp--;}pre->tp=NULL;if(p) free (p); //删除可能存在的常数项}//MPList_PianDaovoid Mul(MPList &L,int x)//递归算法,对多元多项式L乘以x{for(p=L;p;p=p->tp){if(!p->tag) p->coef*=x;else Mul(p->hp,x);}}//Mul5.29void MPList_Add(MPList A,MPList B,MPList &C)//广义表存储结构的多项式相加的递归算法{C=(MPLNode*)malloc(sizeof(MPLNode)); if(!A->tag&&!B->tag) //原子项,可直接相加{C->coef=A->coef+B->coef;if(!C->coef){free(C);C=NULL;}}//ifelse if(A->tag&&B->tag) //两个多项式相加{p=A;q=B;pre=NULL;while(p&&q){if(p->exp==q->exp){C=(MPLNode*)malloc(sizeof(MPLNode)); C->exp=p->exp;MPList_Add(A->hp,B->hp,C->hp);pre->tp=C;pre=C;p=p->tp;q=q->tp;}else if(p->exp>q->exp){C=(MPLNode*)malloc(sizeof(MPLNode)); C->exp=p->exp;C->hp=A->hp;pre->tp=C;pre=C;p=p->tp;}else{C=(MPLNode*)malloc(sizeof(MPLNode)); C->exp=q->exp;C->hp=B->hp;pre->tp=C;pre=C;q=q->tp;}}//whilewhile(p){C=(MPLNode*)malloc(sizeof(MPLNode)); C->exp=p->exp;C->hp=p->hp;pre->tp=C;pre=C;p=p->tp;}while(q){C=(MPLNode*)malloc(sizeof(MPLNode));C->exp=q->exp;C->hp=q->hp;pre->tp=C;pre=C;q=q->tp;} //将其同次项分别相加得到新的多项式,原理见第二章多项式相加一题}//else ifelse if(A->tag&&!B->tag) //多项式和常数项相加{x=B->coef;for(p=A;p->tp->tp;p=p->tp);if(p->tp->exp==0) p->tp->coef+=x; //当多项式中含有常数项时,加上常数项if(!p->tp->coef){free(p->tp);p->tp=NULL;}else{q=(MPLNode*)malloc(sizeof(MPLNode));q->coef=x;q->exp=0;q->tag=0;q->tp=NULL;p->tp=q;} //否则新建常数项,下同}//else ifelse{x=A->coef;for(p=B;p->tp->tp;p=p->tp);if(p->tp->exp==0) p->tp->coef+=x;if(!p->tp->coef){free(p->tp);p->tp=NULL;}else{q=(MPLNode*)malloc(sizeof(MPLNode));q->coef=x;q->exp=0;q->tag=0;q->tp=NULL;p->tp=q;}}//else}//MPList_Add5.30int GList_Getdeph(GList L)//求广义表深度的递归算法{if(!L->tag) return 0; //原子深度为0else if(!L) return 1; //空表深度为1m=GList_Getdeph(L->ptr.hp)+1;n=GList_Getdeph(L->ptr.tp);return m>n?m:n;}//GList_Getdeph5.31void GList_Copy(GList A,GList &B)//复制广义表的递归算法{if(!A->tag) //当结点为原子时,直接复制{B->tag=0;B->atom=A->atom;}else //当结点为子表时{B->tag=1;if(A->ptr.hp){B->ptr.hp=malloc(sizeof(GLNode));GList_Copy(A->ptr.hp,B->ptr.hp);} //复制表头if(A->ptr.tp){B->ptr.tp=malloc(sizeof(GLNode));GList_Copy(A->ptr.tp,B->ptr.tp);} //复制表尾}//else}//GList_Copy5.32int GList_Equal(GList A,GList B)//判断广义表A和B是否相等,是则返回1,否则返回0 { //广义表相等可分三种情况:if(!A&&!B) return 1; //空表是相等的if(!A->tag&&!B->tag&&A->atom==B->atom) return 1;//原子的值相等if(A->tag&&B->tag)if(GList_Equal(A->ptr.hp,B->ptr.hp)&&GList_Equal(A->ptr.tp,B->ptr.tp))return 1; //表头表尾都相等return 0;}//GList_Equal5.33void GList_PrintElem(GList A,int layer)//递归输出广义表的原子及其所在层次,layer表示当前层次{if(!A) return;if(!A->tag) printf("%d %d\n",A->atom,layer);else{GList_PrintElem(A->ptr.hp,layer+1);GList_PrintElem(A->ptr.tp,layer); //注意尾表与原表是同一层次}}//GList_PrintElem5.34void GList_Reverse(GList A)//递归逆转广义表A{GLNode *ptr[MAX_SIZE];if(A->tag&&A->ptr.tp) //当A不为原子且表尾非空时才需逆转{for(i=0,p=A;p;p=p->ptr.tp,i++){if(p->ptr.hp) GList_Reverse(p->ptr.hp); //逆转各子表ptr[i]=p->ptr.hp;}for(p=A;p;p=p->ptr.tp) //重新按逆序排列各子表的顺序p->ptr.hp=ptr[--i];}}//GList_Reverse5.35Status Create_GList(GList &L)//根据输入创建广义表L,并返回指针{scanf("%c",&ch);if(ch==' '){L=NULL;scanf("%c",&ch);if(ch!=')') return ERROR;return OK;}L=(GList)malloc(sizeof(GLNode));L->tag=1;if(isalphabet(ch)) //输入是字母{p=(GList)malloc(sizeof(GLNode)); //建原子型表头p->tag=0;p->atom=ch;L->ptr.hp=p;}else if(ch=='(') Create_GList(L->ptr.hp); //建子表型表头else return ERROR;scanf ("%c",&ch);if(ch==')') L->ptr.tp=NULL;else if(ch==',') Create_GList(L->ptr.tp); //建表尾else return ERROR;return OK;}//Create_GList分析:本题思路见书后解答.5.36void GList_PrintList(GList A)//按标准形式输出广义表{if(!A) printf("()"); //空表else if(!A->tag) printf("%d",A->atom);//原子else{printf("(");for(p=A;p;p=p->ptr.tp){GList_PrintList(p->ptr.hp);if(p->ptr.tp) printf(","); //只有当表尾非空时才需要打印逗号}printf(")");}//else}//GList_PrintList5.37void GList_DelElem(GList &A,int x)//从广义表A中删除所有值为x的原子{if(A&&A->ptr.hp){if(A->ptr.hp->tag) GList_DelElem(A->ptr.hp,x);else if(!A->ptr.hp->tag&&A->ptr.hp->atom==x){q=A;A=A->ptr.tp; //删去元素值为x的表头free(q);GList_DelElem(A,x);}}if(A&&A->ptr.tp) GList_DelElem(A->ptr.tp,x);}//GList_DelElem5.39void GList_PrintElem_LOrder(GList A)//按层序输出广义表A中的所有元素{InitQueue(Q);for(p=L;p;p=p->ptr.tp) EnQueue(Q,p);while(!QueueEmpty(Q)){DeQueue(Q,r);if(!r->tag) printf("%d",r->atom);elsefor(r=r->ptr.hp;r;r=r->ptr.tp) EnQueue(Q,r);}//while}//GList_PrintElem_LOrder分析:层序遍历的问题,一般都是借助队列来完成的,每次从队头取出一个元素的同时把它下一层的孩子插入队尾.这是层序遍历的基本思想.。

数据结构(C语言版)清华大学出版社课后题1-5章答案

数据结构(C语言版)清华大学出版社课后题1-5章答案

数据结构(C语言版)清华大学出版社课后题1-5章答案第一章选择题1.A2.B3.C4.D5.B6.C第二章选择题1.A2.D3.D4.C5.A6.C7.B8.B9.D 10.D应用题1.应该选用链接存储表示。

如果才用顺序表示法,必须在一个连续的可用空间中为这N 个表分配空间。

初始时候因为不知道哪个表增长得快,必须平均分配空间。

在程序运行过程中,有的表占用的空间增长得快,有的表占用空间增长得慢,有的表很快就使用完了分配给它的空间,有的表才占用了少许空间,在进行元素的插入时候就必须成片的移动其他表的空间,以空出位置进行插入;在元素删除时为填补空白,也可能移动许多元素。

这个处理过程及其繁琐和低效。

如果采用链接存储,一个表的空间可以连续也可以不连续。

表的增长通过动态分配内存得以解决,只要存储器未满,就不会发生表溢出;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储需求,非常灵活方便。

对于N个表(包括表的总数可能变化)共存的情形,处理十分简单快捷,插入、删除时间复杂度为O(1)。

所以才用链接存储表示较好。

2.一般来说,链式存储结构克服了顺序存储结构的三个缺点。

首先,插入、删除操作不需要移动元素,只修改指针;其次,不需要预先分配空间,可根据需要动态申请空间;其三,表容量只受到内存空间的限制。

其缺点是因为指针增加了空间开销,当空间不允许时,就不能克服顺序存储的缺点。

3.顺序结构时ai与ai+1的物理位置相邻,链表结构时两者的位置不要求一定相邻。

7.在顺序表中插入和删除一个节点需平均移动全表一半的节点。

具体的移动次数取决于所插入和删除的节点的位置i和全表的长度n这两个因素。

算法设计题1.分析:遍历整个顺序表,用k记录在x~y之间元素的个数,k的初始值为0。

对于当前遍历到的元素,若其值在x~y之间,则前移k个位置;否则执行++k。

这样每个不在x~y之间的元素仅仅移动一次,所以效率较高。

C语言第五章习题及答案

C语言第五章习题及答案

第五章习题答案一、选择题1) 有以下程序#include <stdio.h>main(){ int n=2,k=0;while(k++&&n++>2);printf("%d %d\n",k,n);}程序运行后的输出结果是A)0 2 B)1 3 C)5 7 D)1 22)有以下程序:main(){ int k=5;while(--k) printf("%d",k-=3);printf("\n");}执行后的输出结果是()。

A)1 B)2 C)4 D)死循环3)有以下程序#include<stdio.h>main(){int y=10;while(y--);printf(”y=%d\n”,y);}程序执行后的输出结果是A)y=0 B)y= -1 C)y=1 D)while构成无限循环4) 若变量已正确定义,有以下程序段i=0;do printf("%d,",i);while(i++);printf("%d\n",i)其输出结果是A)0,0 B)0,1 C)1,1 D)程序进入无限循环5)有以下程序:main(){ int i;for(i=1;i<=40;i++){ if(i++%5==0)if(++i%8==0) printf("%d",i); }printf("\n");}执行后的输出结果是()。

A)5 B)24 C)32 D)406) 有以下程序#includes <stdio.h>main(){ int a=1,b=2;for(;a<8;a++) {b+=a; a+=2;}printf ("%d,%d\n",a,b);}程序运行后的输出结果是(A)9,18 (B)8,11 (C)7,11 (D)10,147) 有以下程序#include<stdio.h>main(){int y=9;for( ; y>0;y--)if(y%3= =0) printf("%d",--y);}程序的运行结果是A)741 B)963 C)852 D)8) 一下程序段中的变量已正确定义for(i=0;i<4;i++,j++)for(k=1;k<3;k++); printf("*");程序段的输出结果是A)******** B)**** C)** D)*9) 有以下程序#iinclude <stdio.h>main(){ int i,j;for(i=3; i>=1; i--){ for (j=1;j<=2;j++) printf(“%d”,i+j);printf(“\n”);}}程序的运行结果是()A) 2 3 4 B) 4 3 2 C) 2 3 D) 4 53 4 5 5 4 3 3 4 3 44 5 2 3 答案:D10)有以下程序main(){int i,j;for(i=1;i<4;i++){for(j=i;j<4;j++) printf(“%d*%d=%d “,i,j,i*j);printf(“\n”);}}程序运行后的输出结果是A) 1*1=1 1*2=2 1*3=3 B) 1*1=1 1*2=2 1*3=32*1=2 2*2=4 2*2=4 2*3=63*1=3 3*3=9C) 1*1=1 D) 1*1=11*2=2 2*2=4 2*1=2 2*2=41*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=9 11) 有以下程序#include<stdio.h>main(){int i,j,m=55;for(i=1;i<=3;i++)for(j=3;j<=i;j++) m=m%j;printf("%d\n",m);}程序的运行结果是A)0 B)1 C)2 D)312) 有以下程序#include <stdio.h>main(){ int i=5;do{ if (i%3= =1)if (i%5= =2){printf(“*%d”,i); break; }i++;}while(i!=0);printf(“\n”);}程序的运行结果是A)*7 B)*3*5 C) *5 D)*2*6答案:A13) 有以下程序#include <stdio.h>main(){ int c=0,k;for(k=1;k<3;k++)switch(k){ default:c+=k;case 2:c++;break;case 4:c+=2;break;}printf("%d\n",c);}程序运行后的输出结果是A)3 B)5 C)7 D)914) 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是A)n=0;while((ch=getchar())!='\n')n++;B)n=0;while(getchar()!='\n')n++;C)for(n=0;getchar()!='\n';n++);D)n=0;for(ch=getchar();ch!='\n';n++);15)有以下程序#includemain(){int a=1,b=2;while(a<6){b+=a;a+=2;b%二10;}printf(”%d,%d\n”,a,b);}程序运行后的输出结果是A)5,11 B)7,1 C)7,11 D)6,116) 要求通过while循环不断读入字符,当读入字母N时结束循环。

《数据结构—用C语言描述》课后习题答案

《数据结构—用C语言描述》课后习题答案

数据结构课后习题参考答案第一章绪论1.3 (1) O(n)(2)(2)O(n)(3)(3)O(n)(4)(4)O(n1/2)(5)(5)执行程序段的过程中,x,y值变化如下:循环次数x y0(初始)91 1001 92 1002 93 100………………9 100 10010 101 10011 91 9912 92 100………………20 101 9921 91 98………………30 101 9831 91 97到y=0时,要执行10*100次,可记为O(10*y)=O(n)1.5 2100 , (2/3)n , log2n , n1/2 ,n3/2, (3/2)n , n log2n , 2 n ,n! , n n第二章线性表(参考答案)在以下习题解答中,假定使用如下类型定义:(1)顺序存储结构:#define MAXSIZE 1024typedef int ElemType;// 实际上,ElemType可以是任意类型typedef struct{ ElemType data[MAXSIZE];int last; // last表示终端结点在向量中的位置}sequenlist;(2)链式存储结构(单链表)typedef struct node{ElemType data;struct node *next;}linklist;(3)链式存储结构(双链表)typedef struct node{ElemType data;struct node *prior,*next;}dlinklist;(4)静态链表typedef struct{ElemType data;int next;}node;node sa[MAXSIZE];2.1 头指针:指向链表的指针。

因为对链表的所有操均需从头指针开始,即头指针具有标识链表的作用,所以链表的名字往往用头指针来标识。

如:链表的头指针是la,往往简称为“链表la”。

《数据结构》第五章习题参考答案

《数据结构》第五章习题参考答案

《数据结构》第五章习题参考答案一、判断题(在正确说法的题后括号中打“√”,错误说法的题后括号中打“×”)1、知道一颗树的先序序列和后序序列可唯一确定这颗树。

( ×)2、二叉树的左右子树可任意交换。

(×)3、任何一颗二叉树的叶子节点在先序、中序和后序遍历序列中的相对次序不发生改变。

(√)4、哈夫曼树是带权路径最短的树,路径上权值较大的结点离根较近。

(√)5、用一维数组存储二叉树时,总是以前序遍历顺序存储结点。

( ×)6、完全二叉树中,若一个结点没有左孩子,则它必是叶子结点。

( √)7、一棵树中的叶子数一定等于与其对应的二叉树的叶子数。

(×)8、度为2的树就是二叉树。

(×)二、单项选择题1.具有10个叶结点的二叉树中有( B )个度为2的结点。

A.8 B.9 C.10 D.112.树的后根遍历序列等同于该树对应的二叉树的( B )。

A. 先序序列B. 中序序列C. 后序序列3、二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG 。

该二叉树根的右子树的根是:( C )A. EB. FC. GD. H04、在下述结论中,正确的是( D )。

①具有n个结点的完全二叉树的深度k必为┌log2(n+1)┐;②二叉树的度为2;③二叉树的左右子树可任意交换;④一棵深度为k(k≥1)且有2k-1个结点的二叉树称为满二叉树。

A.①②③B.②③④C.①②④D.①④5、某二叉树的后序遍历序列与先序遍历序列正好相反,则该二叉树一定是( D )。

A.空或只有一个结点B.完全二叉树C.二叉排序树D.高度等于其结点数三、填空题1、对于一棵具有n个结点的二叉树,对应二叉链接表中指针总数为__2n____个,其中___n-1_____个用于指向孩子结点,___n+1___个指针空闲着。

2、一棵深度为k(k≥1)的满二叉树有_____2k-1______个叶子结点。

数据结构课后习题及解析第五章

数据结构课后习题及解析第五章

第五章习题5.1 假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。

已知A的基地址为1000,计算:数组A共占用多少字节;数组A的最后一个元素的地址;按行存储时元素A36的地址;按列存储时元素A36的地址;5.2 设有三对角矩阵An×n ,将其三条对角线上的元素逐行地存于数组B(1:3n-2)中,使得B[k]= aij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i,j的下标变换公式。

5.3假设稀疏矩阵A和B均以三元组表作为存储结构。

试写出矩阵相加的算法,另设三元组表C存放结果矩阵。

5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。

5.5写一个在十字链表中删除非零元素aij的算法。

5.6画出下面广义表的两种存储结构图示:((((a), b)), ((( ), d), (e, f)))5.7求下列广义表运算的结果:(1)HEAD[((a,b),(c,d))];(2)TAIL[((a,b),(c,d))];(3)TAIL[HEAD[((a,b),(c,d))]];(4)HEAD[TAIL[HEAD[((a,b),(c,d))]]];(5)TAIL[HEAD[TAIL[((a,b),(c,d))]]];实习题若矩阵Am×n 中的某个元素aij是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该矩阵中的一个马鞍点。

假设以二维数组存储矩阵,试编写算法求出矩阵中的所有马鞍点。

第五章答案5.2设有三对角矩阵A n×n,将其三条对角线上的元素逐行的存于数组B[1..3n-2]中,使得B[k]=a ij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。

【解答】(1)k=2(i-1)+j(2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余)5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。

C语言程序设计教程 第五章 课后习题参考答案

C语言程序设计教程 第五章 课后习题参考答案

C语言程序设计教程第五章课后习题参考答案一、选择题1. B2. A3. C4. B5. D二、填空题1. while2. binary3. 164. 35. continue6. global三、判断题1. 错误2. 正确3. 错误4. 错误5. 正确四、编程题1.```c#include<stdio.h>int main() {int num;printf("请输入一个整数:"); scanf("%d", &num);if (num % 2 == 0) {printf("%d是偶数\n", num); } else {printf("%d是奇数\n", num); }return 0;}```2.```c#include<stdio.h>int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);printf("%d与%d的和为%d\n", num1, num2, num1 + num2); return 0;}```3.```c#include<stdio.h>int isPrime(int num) {int i;if (num <= 1)return 0;for (i = 2; i <= num / 2; i++) {if (num % i == 0) {return 0;}}return 1;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (isPrime(num)) {printf("%d是素数\n", num); } else {printf("%d不是素数\n", num); }return 0;}```4.```c#include<stdio.h>int factorial(int num) {int i, result = 1;for (i = 1; i <= num; i++) {result *= i;}return result;}int main() {int num;printf("请输入一个整数:");scanf("%d", &num);printf("%d的阶乘为%d\n", num, factorial(num)); return 0;}```五、简答题1. C语言逻辑与运算符(&&)短路特性是什么?答:C语言逻辑与运算符(&&)具有短路特性,即在进行逻辑与运算时,如果前一个表达式的值为假(0),则后面的表达式将不会被计算,整个逻辑与表达式的值直接为假(0)。

数据结构(c语言版)课后习题答案完整版

数据结构(c语言版)课后习题答案完整版

第1章 绪论5.选择题:CCBDCA6.试分析下面各程序段的时间复杂度。

.试分析下面各程序段的时间复杂度。

(1)O (1) (2)O (m*n ) (3)O (n 2) (4)O (log 3n )(5)因为x++共执行了n-1+n-2+……+1= n(n-1)/2,所以执行时间为O (n 2) (6)O(n )第2章 线性表1.选择题.选择题babadbcabdcddac 2.算法设计题.算法设计题(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。

ElemType Max (LinkList L ){if(L->next==NULL) return NULL; pmax=L->next; //假定第一个结点中数据具有最大值假定第一个结点中数据具有最大值 p=L->next->next;while(p != NULL ){//如果下一个结点存在if(p->data > pmax->data) pmax=p; p=p->next; }return pmax->data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。

的存储空间。

void inverse(LinkList &L) { // 逆置带头结点的单链表 Lp=L->next; L->next=NULL; while ( p) {q=p->next; // q 指向*p 的后继 p->next=L->next;L->next=p; // *p 插入在头结点之后 p = q; }}、空间(n)、空间(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)的数据元素。

复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。

数据结构课后习题答案第五章数组与广义表

数据结构课后习题答案第五章数组与广义表

第五章数组与广义表一、假设有二维数组A6*8,每个元素用相邻的6个字节存储,存储器按字节编址。

已知A的起始存储位置(基地址)为1000。

计算:1、数组A的体积(即存储量);2、数组A的最后一个元素a57的第一个字节的地址;3、按行存储时,元素a14的第一个字节的地址;4、按列存储时,元素a47的第一个字节的地址;答案:1、(6*8)*6=2882、loc(a57)=1000+(5*8+7)*6=1282或=1000+(288-6)=12823、loc(a14)=1000+(1*8+4)*6=10724、loc(a47)=1000+(7*6+4)*6=1276二、假设按低下标(行优先)优先存储整数数组A9*3*5*8时第一个元素的字节地址是100,每个整数占四个字节。

问下列元素的存储地址是什么?(1)a0000(2)a1111(3)a3125 (4)a8247答案:(1)100(2)loc(a1111)=100+(1*3*5*8+1*5*8+1*8+1)*4=776(3) loc(a3125)=100+(3*3*5*8+1*5*8+2*8+5)*4=1784(4) loc(a8247)=100+(8*3*5*8+2*5*8+4*8+7)*4=4416五、设有一个上三角矩阵(aij)n*n,将其上三角元素逐行存于数组B[m]中,(m 充分大),使得B[k]=aij且k=f1(i)+f2(j)+c。

试推导出函数f1,f2和常数C(要求f1和f2中不含常数项)。

答:K=n+(n-1)+(n-2)+…..+(n-(i-1)+1)+j-i=(i-1)(n+(n-i+2))/2+j-i所以f1(i)=(n+1/2)i-1/2i2f2(j)=jc=-(n+1)九、已知A为稀疏矩阵,试从空间和时间角度比较采用两种不同的存储结构(二维数组和三元组表)完成∑aii运算的优缺点。

(对角线求和)解:1、二维数组For(i=1;i<=n;i++)S=s+a[i][i];时间复杂度:O(n)2、for(i=1;i<=m.tu;i++)If(a.data[k].i==a.data[k].j) s=s+a.data[k].value;时间复杂度:O(n2)二十一、当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。

数据结构(C语言版)第4-5章习题答案

数据结构(C语言版)第4-5章习题答案

第4~5章串和数组自测卷答案一、填空题(每空1分,共20分)1. 不包含任何字符(长度为0)的串称为空串;由一个或多个空格(仅由空格符)组成的串称为空白串。

(对应严题集4.1①,简答题:简述空串和空格串的区别)2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为3。

4. 子串的定位运算称为串的模式匹配;被匹配的主串称为目标串,子串称为模式。

5. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第 6 次匹配成功。

6. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m。

7. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。

已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为288 B ;末尾元素A57的第一个字节地址为1282 ;若按行存储时,元素A14的第一个字节地址为(8+4)×6+1000=1072 ;若按列存储时,元素A47的第一个字节地址为(6×7+4)×6+1000)=1276 。

(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A57可知,是从0行0列开始!)8. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为8950 。

答:不考虑0行0列,利用列优先公式:LOC(a ij)=LOC(a c1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=89509. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。

严蔚敏数据结构C语言版习题集答案

严蔚敏数据结构C语言版习题集答案

严蔚敏《数据结构(C语言版)习题集》答案第一章绪论void print_descending(int x,int y,int z)....+f[m-k]=f[m-1]+f[m-2]+......+f[m-k]+f[m-k-1]-f[m-k-1]=2*f[m-1]-f[m-k-1]所以上述算法的时间复杂度仅为O(m). 如果采用递归设计,将达到O(k^m). 即使采用暂存中间结果的方法,也将达到O(m^2).typedef struct{char *sport;enum{male,female} gender;char schoolname; port!=NULL){switch(result[i].schoolname){case 'A':score[ 0 ].totalscore+=result[i].score;if(result[i].gender==0) score[ 0 ].malescore+=result[i].score;else score[ 0 ].femalescore+=result[i].score;break;case 'B':score[ 0 ].totalscore+=result[i].score;if(result[i].gender==0) score[ 0 ].malescore+=result[i].score;else score[ 0 ].femalescore+=result[i].score;break;………………}i++;}for(i=0;i<5;i++){printf("School %d:\n",i);printf("Total score of male:%d\n",score[i].malescore);printf("Total score of female:%d\n",score[i].femalescore);printf("Total score of all:%d\n\n",score[i].totalscore);}}void polyvalue(){float temp;float *p=a;printf("Input number of terms:");scanf("%d",&n);printf("Input value of x:");scanf("%f",&x);printf("Input the %d coefficients from a0 to a%d:\n",n+1,n);p=a;xp=1;sum=0;Status Insert(LinkList &L,int i,int b)void merge1(LinkList &A,LinkList &B,LinkList &C)void SqList_Intersect(SqList A,SqList B,SqList &C)void LinkList_Intersect_Delete(LinkList &A,LinkList B,LinkList C)iList为带头结点的单循环链表类型.{s=L->next;A=(CiList*)malloc(sizeof(CiLNode));p=A;B=(CiList*)malloc(sizeof(CiLNode));q=B;C=(CiList*)malloc(sizeof(CiLNode));r=C; .4,2的顺序重排双向循环链表L中的所有结点{p=;while(p->next!=L&&p->next->next!=L){p->next=p->next->next;p=p->next;} 同时进行调整的话,必须使用堆栈保存偶数结点的指针,否则将会破坏链表结构,造成结点丢失.DuLNode * Locate_DuList(DuLinkedList &L,int x) int x;int y;} coordinate;void Repaint_Color(int g[m][n],int i,int j,int color)归形式的算法该怎么写呢?void NiBoLan(char *str,char *new)题中暂不考虑串的具体操作的实现,而将其看作一种抽象数据类型stringtype,对其可以进行连接操作:c=link(a,b).Status g(int m,int n,int &s)void InitCiQueue(CiQueue &Q)Status EnCyQueue(CyQueue &Q,int x)省掉这一句,则在某些情况下,会引起不希望的后果,虽然在大多数情况下没有影响.请思考:设S='place', T='ace', V='face',则省掉i+=Strlen(V);运行时会出现什么结果?int Delete_SubString(Stringtype &s,Stringtype t)读者用此程序取代作者早些时候对题给出的程序.void StrAssign(Stringtype &T,char chars&#;)h&&T[j].ch!=c) j++; h) T[j].num++;else T[j]={c,1};}h;j++)printf("%c: %d\n",T[j].ch,T[j].num);}前一个程序的区别在于,串s业已存在.{for(p=s->next,q=t->next;p&&q;p=p->next,q=q->next){p->ch=q->ch;pre=p;}while(q){p=(LStrNode*)malloc(sizeof(LStrNode));p->ch=q->ch;pre->next=p;pre=p;}p->next=NULL;}算法的思想是,依次把串S的一个副本S2向右错位平移1格,2格,3格,...与自身S1相匹配,如果存在最长重复子串,则必然能在此过程中被发现.用变量lrs1,lrs2,maxlen来记录已发现的最长重复子串第一次出现位置,第二次出现位置和长度.题目中未说明"重复子串"是否允许有重叠部分,本算法假定允许.如不允许,只需在第二个for语句的循环条件中加上k<=i即可.本算法时间复杂度为O(Strlen(S)^2).void Get_LPubSub(Stringtype S,Stringtype T) for(k=0,j=jmin;j<=jmax;j++){if(A[j]==B[j-i]) k++;else k=0;if(k>maxlen){lps1=j-k+1;lps2=j-i-k+1;maxlen=k;}}一的区别是,由于A,B互不相同,因此B不仅要向右错位,而且还要向左错位,以保证不漏掉一些情况.当B相对于A的位置不同时,需要匹配的区间的计算公式也各不相同,请读者自己画图以帮助理解.本算法的时间复杂度是o(strlrn(s)*strlen(t))。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第五章
1、设二维数组A【8】【10】是一个按行优先顺序存储在内存中的数组,已知A【0】【0】的起始存储位置为1000,每个数组元素占用4个存储单元,求:
(1)A【4】【5】的起始存储位置。

A【4】【5】的起始存储位置为1000+(10*4+5)*4=1180;
(2)起始存储位置为1184的数组元素的下标。

起始存储位置为1184的数组元素的下标为4(行下标)、6(列下标)。

2、画出下列广义表D=((c),(e),(a,(b,c,d)))的图形表示和它们的存储表示。

略,参考第5·2节应用题第5题分析与解答。

3、已知A为稀疏矩阵,试从时间和空间角度比较采用两种不同的存储结构(二维数组和三元组表)实现求∑a(i,j)运算的优缺点。

稀疏矩阵A采用二维数组存储时,需要n*n个存储单元,完成求∑ii a(1≤i≤n)时,由于a【i】【i】随机存取,速度快。

但采用三元组表时,若非零元素个数为t,需3t+3个存储单元(t个分量存各非零元素的行值、列值、元素值),同时还需要三个存储单元存储存稀疏矩阵A的行数、列数和非零元素个数,比二维数组节省存储单元;但在求∑ii a(1≤i≤n)时,要扫描整个三元组表,以便找到行列值相等的非零元素求和,其时间性能比采用二维数组时差。

4、利用三元组存储任意稀疏数组时,在什么条件下才能节省存储空间?
当m行n列稀疏矩阵中非零元素个数为t,当满足关系3*t<m*n时,利用三元组存储稀疏数组时,才能节省存储空间。

5、求下列各广义表的操作结果。

(1)GetHead((a,(b,c),d))
GetHead((a,(b,c),d))=a
(2)GetTail((a,(b,c),d))
GetTail((a,(b,c),d))=((b,c),d)
(3)GetHead(GetTail((a,(b,c),d)))
GetHead(GetTail((a,(b,c),d)))=(b,c)
(4)GetTail(GetHead((a,(b,c),d)))
GetTail(GetHead((a,(b,c),d)))=()
第六章
1、已知一棵树边的集合为{(i,m),(i,n),(e,i),(b,e),(b,d),(a,b),(g,j),(g,k),(c,g),(c,f),(h,l),(c,h),(a,c)}用树形表示法画出此树,并回答下列问题:
(1)哪个是根结点?
(2)哪些是叶结点?
(3)哪个是g的双亲?
(4)哪些是g的祖先?
(5)哪些是g的孩子?
(6)哪些是e的子孙?
(7)哪些是e的兄弟?哪些是f的兄弟?
(8)结点b和n的层次号分别是什么?
(9)树的深度是多少?
(10)以结点c为根的子树的深度是多少?
(11)树的度数是多少?
略。

2、设一棵完全二叉树叶子结点数为k ,试证明该二叉树的高度为⎡⎤1log 2+k 。

证明略。

3、已知一棵度为m 的树中有1n 个度为1的结点,2n 个度为2的结点,……,m n 个度为m 的结点,问该树中有多少片叶子?
参见第6·2节应用题中的第一题。

4、已知某完全二叉树有100个结点,试求该二叉树的叶子树。

该二叉树的叶子树为50。

5、已知完全二叉树的第6层有5个叶子,试画出所有满足这一条件的完全二叉树,并指出结点最多的那棵树的叶子数目。

根据完全二叉树的定义,有两种情况:(1)第6层为最高层,且有5个叶子;(2)第7层为最高层,且第6层有5个叶子。

6、一个深度为L 的满k 叉树有如下性质,第L 层上的结点都是叶子结点,其余各层上每个结点都有k 棵非空子树。

如果按层次顺序从1开始对全部结点编号,问:
(1)第i 层的结点数目是多少?
(2)编号为n 的结点的双亲结点(若存在)的编号是多少?
(3)编号为n 的结点的第i 个孩子结点(若存在)的编号是多少?
(4)编号为n 的结点有右兄弟的条件是什么?其右兄弟的编号是多少?
答案分别为k i 1-,⎡⎤k n /)1(-,i n k +-)1(*,⎡⎤k k n n */)1(-≤,1+n
7、试找出分别满足下面条件的所有二叉树: (1)先序序列和中序序列相同。

(2)中序序列和后序序列相同。

(3)先序序列和后序序列相同。

略。

8、证明:一棵满k 叉树上的叶结点数0n 和非叶子结点数m 之间满足下列关系: 0n =(k-1)m+1 证明:总结点数n=0n +m ,又n-1=km ,所以0n =(k-1)m+1。

9、已知一棵二叉树的中序序列和后序序列分别为BDCEAFHG 和DECBHGFA ,画出这棵二叉树。

并写出其先序遍历序列。

先序遍历序列为ABCDEFGH 。

10、将图6·22所示的森林转换为二叉树。

6·22
参见第6·2节中的应用题中的第7题。

11
、写出图6·22所示森林的前序序列和后序序列。

参见第6·2节中的应用题中的第7题。

12、给定一组数列(15,8,10,21,6,19,3)分别代表字符A,B,C,D,E,F,G出现的频度,试画出哈夫曼树,给出各字符的编码值。

参见第6·2节中的应用题的第10题。

相关文档
最新文档