数据结构习题答案1.docx
- 文档编号:23444432
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:15
- 大小:42.33KB
数据结构习题答案1.docx
《数据结构习题答案1.docx》由会员分享,可在线阅读,更多相关《数据结构习题答案1.docx(15页珍藏版)》请在冰豆网上搜索。
数据结构习题答案1
第一章绪论
1.(第18页,第(5)题)
确定下列各程序段的程序步,确定划线语句的执行次数,计算它们的渐近时间复杂度。
(1)i=1;k=0;
do{
k=k+10*i;i++;
}while(i<=n-1)
划线语句的执行次数为n-1。
(2)i=1;x=0;
do{
x++;i=2*i;
}while(i 划线语句的执行次数为log2n。 (3)for(inti=1;i<=n;i++) for(intj=1;j<=i;j++) for(intk=1;k<=j;k++) x++; 划线语句的执行次数为n(n+1)(n+2)/6。 (4)x=n;y=0; while(x>=(y+1)*(y+1))y++; 划线语句的执行次数为n。 第二章线性表 1.第37页习题 (2).2 在类LinearList中增加一个成员函数,将顺序表逆置,实现该函数并分析算法的时间复杂度。 不利用类SeqList提供的操作直接实现。 template voidSeqList : Invert() { Te; for(inti=1;i<=length/2;i++){ e=elements[i-1]; elements[i-1]=elements[length-i]; elements[length-i]=e; } } 2.第37页习题(5) 在类SingleList中增加一个成员函数,将单链表逆置运算,直接实现该函数并分析其时间复杂度。 template voidSingleList : invert() { Node first=NULL; while(p){ q=p->link;p->link=first; first=p;p=q; } } 3.(第37页,第7题)单链表中结点按元素值递增链接,在类SingleList中增加一个成员函数,直接实现删除结点值在a至b之间的结点(ab)。 template voidSingleList : DeleteAb(Ta,Tb)//第37页,习题(7) { Node while(p&&p->data if(p->data<=a){ q=p;p=p->link; } elseif(q==first){ q=p->link; deletep; p=first=q; } else{ q->link=p->link; deletep; p=q->link; } } } 4.(第37页,第8题)在类CircularList中增加一个成员函数,在不增加新结点的情况下,直接实现两个链表合并为一个链表的算法,并分析其时间复杂度。 template voidMerge(CircularList CircularList { Node while(p->link! =b.first)p=p->link; p->link=a.first->link; a.first->link=b.first->link; b.first->link=b.first; b.length=0; } template voidMerge1(CircularList CircularList { Node b.first->data=b.first->link->data; b.first->link=a.first->link; a.first->link=p->link; p->link=p; b.first=p; } 第三章栈与队列 1.第50页习题 (1) 设A、B、C、D、E五个元素依次进栈(进栈后可立即出栈),问能否得到下列序列。 若能得到,则给出相应的push和pop序列;若不能,则说明理由。 1)A,B,C,D,E2)A,C,E,B,D 3)C,A,B,D,E4)E,D,C,B,A 答: 2)和3)不能。 对2)中的E,B,D而言,E最先出栈,则表明,此时B和D均在栈中,由于,B先于D进栈,所以应有D先出栈。 同理3)。 2.第50页习题(9) 利用栈可以检查表达式中括号是否配对,试编写算法实现之。 boolmatch(chara[],intn) { inttop=-1; for(inti=0;i if(a[i]=='(')top++; elseif(a[i]==')') if(top>-1)top--; elsereturntrue; if(top>-1)returntrue; returnfalse; } 3.第50页习题(10) 声明并实现链式队列类LinkedQueue。 template classLinkedStack: publicStack { public: LinkedStack(); ~LinkedStack(); virtualboolIsEmpty()const; virtualboolIsFull()const; virtualboolGetTop(T&x); virtualboolPush(constTx); virtualboolPop(); virtualvoidSetNull(); private: Node }; template LinkedStack : LinkedStack() { top=NULL; } template LinkedStack : ~LinkedStack() { Node while(top){ q=top->link; deletetop; top=q; } } template boolLinkedStack : IsEmpty()const { return! top; } template boolLinkedStack : IsFull()const { returnfalse; } template boolLinkedStack : GetTop(T&x) { if(IsEmpty()){ cout<<"Emptystack"< returnfalse; } x=top->data; returntrue; } template boolLinkedStack : Push(constTx) { Node q->data=x; q->link=top; top=q; returntrue; } template boolLinkedStack : Pop() { Node if(IsEmpty()){ cout<<"Emptystack"< returnfalse; } top=top->link; deleteq; returntrue; } template voidLinkedStack : SetNull() { Node while(top){ q=top->link; deletetop; top=q; } } 第四章数组与字符串 1.给出三维数组元素A[i][j][k]的存储地址loc(A[i][j][k])。 答: 设有三维数组声明为A[n1][n2][n3],每个元素占k个存储单元,则 loc(A[i][j][k])=loc(A[0][0][0])+k*(i*n2*n3+j*n3+k) 2.(第68页,第5题)给出下列稀疏矩阵的 顺序三元组的行优先和列优先表示。 答: 3.(第68页,第6题) 对题图4-5的稀疏矩阵执行矩阵转置时数组num[]和k[]的值。 答: 4.(第69页,第15题 (2)) 在顺序串类String中增加一个成员函数,实现统计该串中出现的字符、字符个数和每个字符出现的次数。 voidString: : count(charch[],int&n,intnum[]) { n=0; for(inti=0;i intj=0; while(j =ch[j])j++; if(j==n){ ch[j]=str[i]; num[j]=1; n++; } elsenum[j]++; } } 第五章递归 1.设计一个递归算法,实现对一个有序表的顺序搜索。 template intSeqList : Search4(constT&x)const { elements[length]=1000; returnSch4(x,0); } template intSeqList : Sch4(constT&x,inti)const { if(x elseif(x==elements[i])return++i; elsereturnSch4(x,i+1); } 补充题: (2)求顺序搜索有序表失败时的平均搜索长度。 设有序表为(a1,a2,…,an),通常可以假定待查元素位于a1之前,a1与a2之间,a2与a3之间,…,an-1与an之间以及an之后的共n+1个位置处的概率是相等的。 答: 第六章树 1.第107页,第 (2)题 对于三个结点A,B和C,可分别组成多少不同的无序树、有序树和二叉树? 答: (1)无序树: 9棵 (2)有序树: 12棵 (3)二叉树: 30棵 2、 (1)k的i-1次方 (2)(i+k-2)/k取整 (3)(i-1)k+m+1 (4)(i-1)%k不等于0 2.第107页,第(4)题 设对一棵二叉树进行中序遍历和后序遍历的结果分别为: (1)中序遍历BDCEAFHG (2)后序遍历DECBHGFA 画出该二叉树。 答: 3.第107页,第(6)题的第6小题 设计算法,交换一棵二叉树中每个结点的左、右子树。 template voidBTree : Exch(BTNode { if(p){ BTNode p->lchild=p->rchild; p->rchild=q; Exch(p->lchild); Exch(p->rchild); } } 4.第107页,第10题 将图题6-24中的树转换成二叉树,并将图6-23中的二叉树转换成森林。 5.第107页,第11题 给出对图6-24中的树的先序遍历和后序遍历的结果。 答: 先序: A,D,E,F,J,G,M,B,L,H,C,K 后序: J,G,F,E,D,M,H,L,K,C,B,A 6.第107页,第12题 分别以下列数据为输入,构造最小堆。 (1)10,20,30,40,50,60,70,80 (2)80,70,60,50,40,30,20,10 (3)80,10,70,20,60,30,50,40 (1) (2) (3) 7.第107页,第13题 分别以上题的数据为输入,从空的优先权队列开始,依此插入这些元素,求结果优先权队列的状态。 8.第108页,第14题第 (1)、 (2)小题 设S={A,B,C,D,E,F},W={2,3,5,7,9,12},对字符集合进行哈夫曼编码,W为各字符的频率。 (1)画出哈夫曼树 (2)计算带权路径长度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 习题 答案